iOS开发如何生成并分享包含annotation的Apple Maps链接
解决方案
核心问题是你目前只用了ll参数仅定位地图中心点,要显示标注、底部路线按钮,必须追加q(查询内容)参数,Apple Maps会自动基于查询内容和坐标生成和主动搜索完全一致的展示效果。
关键改动点
- 给
activityItems方法追加地址参数,将地址做URL编码后传入Apple Maps链接的q字段 - 移除无用的
MKPointAnnotation相关代码:本地创建的标注对象无法跨应用传递给Apple Maps,完全不生效 - 可选追加
z参数控制地图缩放级别,推荐设为15~18适配街道级视图 - 如果编译时提示
kUTTypeVCard未定义,在文件头部导入import MobileCoreServices即可
修正后完整代码
// 新增address参数 func activityItems(latitude: Double, longitude: Double, address: String) -> [AnyObject]? { var items = [AnyObject]() // 地址做URL编码,避免特殊字符导致链接失效 guard let encodedAddress = address.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { return nil } // 追加q和z参数,q是标注显示的文本,z是地图缩放级别 let URLString = "https://maps.apple.com?q=\(encodedAddress)&ll=\(latitude),\(longitude)&z=18" if let url = NSURL(string: URLString) { items.append(url) } let locationVCardString = [ "BEGIN:VCARD", "VERSION:3.0", "PRODID:-//Joseph Duffy//Blog Post Example//EN", "N:;Shared Location;;;", "FN:\(address)", // 替换为实际地址,卡片显示更友好 "item1.URL;type=pref:\(URLString)", "item1.X-ABLabel:map url", "END:VCARD" ].joined(separator: "\n") guard let vCardData = locationVCardString.data(using: .utf8) as NSSecureCoding? else { return nil } let vCardActivity = NSItemProvider(item: vCardData, typeIdentifier: kUTTypeVCard as String) items.append(vCardActivity) return items } @IBAction func sendAddress(_ sender: UIButton) { let address = self.donation.object(forKey: "Address") as! String let geoCoder = CLGeocoder() geoCoder.geocodeAddressString(address) { placemarks, error in if let error = error{ print(error.localizedDescription) return } guard let placemark = placemarks?.first, let location = placemark.location else { return } let lat = location.coordinate.latitude let long = location.coordinate.longitude // 调用方法时传入实际地址 if let shareObject = self.activityItems(latitude: lat, longitude: long, address: address) { let activityViewController = UIActivityViewController(activityItems: shareObject as [Any], applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = self.view self.present(activityViewController, animated: true, completion: nil) } } }
效果说明
点击生成的链接打开Apple Maps后,会自动以q参数的内容作为标注标题显示大头针,底部自带「路线」「添加到指南」等操作按钮,和用户主动搜索该地址的展示效果完全一致。
内容的提问来源于stack exchange,提问作者Alex Aghajanov
相关产品推荐
相关产品推荐

