You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 09:27:03