I would like to convert an address into an apple maps link and send it to someone with UIActivityViewController. I know about CLGeocoder, and I know how to convert string to coordinates and vice versa, but I don't know how this would be useful. Specifically, I would like to be able to generate the apple maps link so that I could share it with UIActivityViewController. Here is the activityViewController code I have so far:
@IBAction func sendAddress(_ sender: UIButton) {
// how to generate something like this link below, except in apple maps???
let text = URL(string:"https://www.google.com/maps/@42.585444,13.007813,6z")
// making activity view controller
let textToShare = [ text ]
let activityViewController = UIActivityViewController(activityItems: textToShare as [Any], applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.view // so that iPads won't crash
// present
self.present(activityViewController, animated: true, completion: nil)
}
All I need is how to create the link either from coordinates, or an address, because I am pretty sure you can share the URL as a clickable link with messages, as I tested it with reminders which is built into the iOS simulator.
Thanks
You need to do 2 things
To get the current location as lat, long you can use CLCoordinate
First add these to your info.plist you can modify the text as your will
<key>NSLocationAlwaysUsageDescription</key>
<string>Will you allow this app to always know your location?</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>
Now in your class create an object of CLLocationManager and implement it's delegate, since CLLocationManager is in CoreLocation we need to import it
import CoreLocation
Now create an object of locationManager
let locationManager = CLLocationManager()
Now in viewDidload or you may even create a separate method add the below code to setup locationManager
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
if CLLocationManager.locationServicesEnabled(){
locationManager.startUpdatingLocation()
}
Now implements its delegate and get the coordinate
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation :CLLocation = locations[0] as CLLocation
let coordinates = userLocation!.coordinate
print("locations = \(coordinates.latitude) \(coordinates.longitude)")
}
Now you can invoke the below function to open action Sheet
if let shareObject = self.activityItems(latitude: lat, longitude: long) {
//open UIActivityViewController
}
Use this method to construct vCard to share
func activityItems(latitude: Double, longitude: Double) -> [AnyObject]? {
var items = [AnyObject]()
let locationTitle = "Shared Location"
let URLString = "https://maps.apple.com?ll=\(latitude),\(longitude)"
if let url = NSURL(string: URLString) {
items.append(url)
}
let locationVCardString = [
"BEGIN:VCARD",
"VERSION:3.0",
"PRODID:-//Joseph Duffy//Blog Post Example//EN",
"N:;\(locationTitle);;;",
"FN:\(locationTitle)",
"item1.URL;type=pref:\(URLString)",
"item1.X-ABLabel:map url",
"END:VCARD"
].joinWithSeparator("\n")
guard let vCardData = locationVCardString.dataUsingEncoding(NSUTF8StringEncoding) else {
return nil
}
let vCardActivity = NSItemProvider(item: vCardData, typeIdentifier: kUTTypeVCard as String)
items.append(vCardActivity)
items.append(locationTitle)
return items
}
Reference link: https://josephduffy.co.uk/posts/ios-share-sheets-the-proper-way-locations