如何将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
相关产品推荐
相关产品推荐

