Comment partager mon location actuel avec UIActivityViewController?

Je sais que je peux append des choses comme du text, des URL, des images à UIActivityViewController, mais comment append mon location actuel avec une vignette de mon location comme dans le tweet montré ci-dessous? en d'autres termes comment partager les coordonnées "latitude, longitude" dans UIActivityViewController?

Merci

un tweet avec emplacement

J'ai un exemple complet de code et toutes les classs / methods importantes pour le faire. Je sais que la réponse est très tardive, mais cela pourrait aider quelqu'un à l'avenir:

 - (void)shareTab { PFGeoPoint *geoPoint = self.vidgeoObject[kParseLocation]; NSSsortingng *coordinates = [NSSsortingng ssortingngWithFormat:@"http://maps.apple.com/maps?q=%f,%f", geoPoint.latitude, geoPoint.longitude]; CLLocation *userLocation = [[CLLocation alloc] initWithLatitude:geoPoint.latitude longitude:geoPoint.longitude]; CLGeocoder *geocoder; geocoder = [[CLGeocoder alloc]init]; [geocoder reverseGeocodeLocation:userLocation completionHandler:^(NSArray *placemarks, NSError *error) { CLPlacemark *rootPlacemark = placemarks[0]; MKPlacemark *evolvedPlacemark = [[MKPlacemark alloc]initWithPlacemark:rootPlacemark]; ABRecordRef persona = ABPersonCreate(); ABRecordSetValue(persona, kABPersonFirstNameProperty, (__bridge CFTypeRef)(evolvedPlacemark.name), nil); ABMutableMultiValueRef multiHome = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType); bool didAddHome = ABMultiValueAddValueAndLabel(multiHome, (__bridge CFTypeRef)(evolvedPlacemark.addressDictionary), kABHomeLabel, NULL); if(didAddHome) { ABRecordSetValue(persona, kABPersonAddressProperty, multiHome, NULL); NSLog(@"Address saved."); } NSArray *individual = [[NSArray alloc]initWithObjects:(__bridge id)(persona), nil]; CFArrayRef arrayRef = (__bridge CFArrayRef)individual; NSData *vcards = (__bridge NSData *)ABPersonCreateVCardRepresentationWithPeople(arrayRef); NSSsortingng* vcardSsortingng; vcardSsortingng = [[NSSsortingng alloc] initWithData:vcards encoding:NSASCIISsortingngEncoding]; NSLog(@"%@",vcardSsortingng); NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSSsortingng *documentsDirectory = [paths objectAtIndex:0]; // Get documents directory NSSsortingng *filePath = [documentsDirectory ssortingngByAppendingPathComponent:@"pin.loc.vcf"]; [vcardSsortingng writeToFile:filePath atomically:YES encoding:NSUTF8SsortingngEncoding error:&error]; NSURL *url = [NSURL fileURLWithPath:filePath]; NSLog(@"url> %@ ", [url absoluteSsortingng]); // Share Code // NSArray *itemsToShare = [[NSArray alloc] initWithObjects: url, nil] ; UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:itemsToShare applicationActivities:nil]; activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypePostToWeibo]; if (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone) { [self presentViewController:activityVC animated:YES completion:nil]; } else { popControl = [[UIPopoverController alloc] initWithContentViewController:activityVC]; } }]; } 

J'ai créé une alternative Swift à ceci qui persiste un dossier de vCard au directory de caches que vous pouvez order à: https://gist.github.com/naturaln0va/e1fed3f1d32ecf951aac .

La structure vCard est similaire à la réponse de whoKnows ci-dessus.

 let vCardSsortingng = [ "BEGIN:VCARD", "VERSION:3.0", "N:;Shared Location;;;", "FN:Shared Location", "item1.URL;type=pref:http://maps.apple.com/?ll=\(coordinate.latitude),\(coordinate.longitude)", "item1.X-ABLabel:map url", "END:VCARD" ].joinWithSeparator("\n") 

Pour partager un location comme celui-ci, vous devez créer un file vcf pour cet location … Je viens de passer toute la journée à essayer de faire la même chose et de rassembler des informations ici et là pour savoir que Apple le fait dans les maps en utilisant un nom de file "adressez-vous share.loc.vcf"

Vous devez essentiellement get l'location actuel à l'aide de CLLocationManager, puis utiliser un CLGeocoder pour get l'adresse à partir de l'location que vous avez récupéré avec le gestionnaire de position.

Le CLGeocoder vous obtient un CLPlacemark que vous pouvez transformer en un MKPlacemark.

Vous utiliserez l'adresseDictionary stockée là-bas

Avec cette information, vous pouvez créer un ABRecordRef en utilisant ABPersonCreate, stocker toutes datatables pour cet location là-bas, puis get datatables vcd en utilisant ABPersonCreateVCardRepresentationWithPeople

Vous devrez également append une URL de carte, partagez simplement un location avec maps.app et regardez dans le file .vcf pour la structure de l'URL …

transformer ces données en un NSSsortingng et save dans le file.

Créez un file NSURL dans ce file et partagez-le avec UIActivityViewController …

Travail plutôt fastidieux mais ça fonctionne vraiment bien pour moi …

Les deux autres réponses utilisent le framework AddressBook complexe pour créer une vCard. C'est plus facile de le faire comme ceci:

 NSSsortingng *vcardSsortingng = [NSSsortingng ssortingngWithFormat:@"BEGIN:VCARD\n" "VERSION:3.0\n" " N:;Shared Location;;;\n" " FN:Shared Location\n" "item1.URL;type=pref:http://maps.apple.com/?ll=%f,%f\n" "item1.X-ABLabel:map url\n" "END:VCARD", lat, lng]; 

Puis enregistrez-le dans un file, récupérez le NSURL de ce file et partagez-le avec UIActivityViewController comme démontré dans la réponse d'artillery129.

Ma variante dans Swift 2

  let passDictionaryInfo = placeMark.addressDictionary as! [Ssortingng: AnyObject] @IBAction func shareLocation(sender: UIBarButtonItem) { // print(receivedDictionary) let postalAdress = CNMutablePostalAddress() postalAdress.street = receivedDictionary["Name"] as! Ssortingng postalAdress.city = receivedDictionary["City"] as! Ssortingng postalAdress.state = receivedDictionary["State"] as! Ssortingng postalAdress.postalCode = receivedDictionary["ZIP"] as! Ssortingng postalAdress.country = receivedDictionary["Country"] as! Ssortingng postalAdress.ISOCountryCode = receivedDictionary["CountryCode"] as! Ssortingng let streetName = receivedDictionary["Name"] as! Ssortingng let urlAddress = receivedDictionary["FormattedAddressLines"] as! [Ssortingng] // print(urlAddress) let postalContact = CNLabeledValue(label: streetName, value: postalAdress) let urlAddressContact = CNLabeledValue(label: "map url", value: "http://maps.apple.com/maps?address=\(urlAddress.description)") let contact = CNMutableContact() contact.contactType = .Organization contact.organizationName = streetName contact.departmentName = streetName contact.postalAddresses = [postalContact] contact.urlAddresses = [urlAddressContact] // create path let directory = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) let path = directory.first!.path!.ssortingngByAppendingSsortingng("/\(streetName).loc.vcf") // print(path) do { let contactData = try CNContactVCardSerialization.dataWithContacts([contact]) contactData.writeToFile(path, atomically: true) let url = NSURL(fileURLWithPath: path) // print(url) let activityViewController = UIActivityViewController(activityItems: [url], applicationActivities: nil) presentViewController(activityViewController, animated: true, completion: nil) } catch { print("CNContactVCardSerialization cannot save address") } } 

J'ai mis à jour la réponse de @ naturaln0va à Swift 3:
https://gist.github.com/ElegyD/510a17904917a7e7326254b824da1b2f

Il suffit de copyr et coller quelque part et utilisez-le comme ceci:

 let coordinate = CLLocationCoordinate2D(latitude: 52.520007, longitude: 13.404954) let vCardURL = LocationVCard.vCardUrl(from: coordinate, with: "Berlin") let activityViewController = UIActivityViewController(activityItems: [vCardURL], applicationActivities: nil) present(activityViewController, animated: true, completion: nil)