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

如何将PKPassLibrary获取的PKPass转为Data并通过Deep Link传给其他iOS App?

从PKPassLibrary获取凭证并通过Deep Link跨App传递的实现方案

可行性结论

可以将PKPassLibrary.passes()获取的PKPass实例转回原始Data,经Base64编码后通过Deep Link传递给其他App,但要注意PassKit权限限制和Deep Link的长度阈值(过大的Base64字符串会导致链接失效)。

具体实现步骤

1. 从PKPass实例提取原始Data

利用PKPass自带的dataRepresentation()方法直接获取pass的原始二进制数据:

import PassKit

func extractPassData(from pass: PKPass) -> Data? {
    return pass.dataRepresentation()
}

2. 转Base64编码字符串

将Data转为Base64格式,便于嵌入Deep Link的参数中:

// 假设已拿到目标PKPass实例targetPass
if let passData = extractPassData(from: targetPass) {
    let base64PassString = passData.base64EncodedString(options: .endLineWithLineFeed)
    // 后续用于构造Deep Link
}

3. 构造Deep Link传递参数

把Base64字符串作为Query参数拼接进自定义Scheme的Deep Link中:

func buildPassTransferDeepLink(base64Pass: String) -> URL? {
    var components = URLComponents(string: "your-receiver-app-scheme://receive-pass")
    components?.queryItems = [
        URLQueryItem(name: "passBase64", value: base64Pass)
    ]
    return components?.url
}

// 调用示例:打开接收App的Deep Link
if let deepLink = buildPassTransferDeepLink(base64Pass: base64PassString) {
    UIApplication.shared.open(deepLink)
}

4. 接收App解析并还原PKPass

在SwiftUI的App入口通过onOpenURL捕获Deep Link,解码Base64并实例化PKPass:

@main
struct ReceiverApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .onOpenURL { url in
                    guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
                          let passBase64Item = components.queryItems?.first(where: { $0.name == "passBase64" }),
                          let base64String = passBase64Item.value,
                          let passData = Data(base64Encoded: base64String),
                          let pass = try? PKPass(data: passData) else {
                        // 处理解析失败逻辑
                        return
                    }
                    
                    // 将还原的PKPass添加至钱包
                    let passLibrary = PKPassLibrary()
                    if passLibrary.isPassLibraryAvailable() {
                        passLibrary.addPasses([pass])
                    }
                }
        }
    }
}

核心注意事项

  • 权限配置:两个App都需要在Info.plist中声明com.apple.developer.passkit权限,且确保已获取PKPassLibrary的访问授权。
  • URL长度限制:iOS对Deep Link的URL长度有隐性限制(通常在数千字符范围),若pass文件过大(如超过100KB),Base64编码后会超出阈值,建议改用App Groups文件共享或iCloud传输替代。
  • 安全性:Base64仅为编码而非加密,敏感凭证需在传递前加密,接收后再解密。

内容的提问来源于stack exchange,提问作者user962460

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:21:06