PKPassLibrary调用removePass无法删除Apple Wallet支付卡问题求助
Apple In-App Provisioning 支付卡删除失效问题解决方案
可能的原因
- 支付卡(
PKPaymentPass)删除权限约束:苹果对第三方App删除支付类票卡有严格权限限制,并非拥有加卡权限就默认拥有删卡权限,且不支持静默删除,必须触发用户确认弹窗才能完成操作 - 参数错误:你当前序列化获取到的
passTypeIdentifier为系统通用值paymentpass.com.apple,并非你在苹果开发者后台配置的、和App绑定的专属支付卡标识,导致查询票卡时返回空对象,删除自然无效 - 代码缺少校验和适配:你使用的已废弃的无回调
removePass方法无法获取错误信息,iOS15.4+系统针对支付卡删除已推出带结果回调的新API,低版本API在新系统上对支付卡的操作会失效 - 缺少权限申请:iOS16及以上系统要求App提前向用户申请
PKPassLibrary的读写权限,未授权的情况下删除操作会被系统静默拦截 - 操作场景不符合要求:后台调用删除方法、删除Apple Watch远程票卡未切换对应设备实例,都会导致操作无响应
解决方案
1. 优化代码增加校验和错误监听
替换现有无校验的删除逻辑,优先使用带回调的API获取具体错误信息:
@objc func removePass(_ data: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { let passTypeIdentifier = data["passTypeIdentifier"] as! String let serialNumber = data["serialNumber"] as! String // 先判空,避免查询到空对象 guard let passToRemove = passLib.pass(withPassTypeIdentifier: passTypeIdentifier, serialNumber: serialNumber) else { reject("PASS_NOT_FOUND", "未查询到对应票卡", nil) return } // 确认票卡确实在Wallet中 guard passLib.containsPass(passToRemove) else { reject("PASS_NOT_EXIST", "票卡不在Wallet中", nil) return } // iOS16+ 先确认已有读写权限 if #available(iOS 16.0, *) { let status = PKPassLibrary.authorizationStatus(for: .addSilently) guard status == .authorized else { PKPassLibrary.requestAuthorization(for: .addSilently) { [weak self] status in if status == .authorized { self?.executeRemovePass(pass: passToRemove, resolve: resolve, reject: reject) } else { reject("PERMISSION_DENIED", "用户未授予Wallet操作权限", nil) } } return } } executeRemovePass(pass: passToRemove, resolve: resolve, reject: reject) } private func executeRemovePass(pass: PKPass, resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) { if #available(iOS 15.4, *) { passLib.remove(pass) { success, error in if let error = error { reject("REMOVE_FAILED", "删除失败: \(error.localizedDescription)", error) return } resolve(success) } } else { passLib.removePass(pass) // 低版本手动校验删除结果 let stillExists = passLib.containsPass(pass) resolve(!stillExists) } }
2. 修正传参
遍历passLib.passes()获取所有关联票卡,打印每一张支付卡的真实passTypeIdentifier和serialNumber,使用和你的App绑定的专属支付卡标识作为入参,不要使用系统通用的paymentpass.com.apple。
3. 确认权限配置
登录苹果开发者后台检查你的In-App Provisioning权限配置,确认已开通支付卡删除权限,若未开通需要重新向苹果提交权限申请。
4. 适配不同设备的删除操作
如果需要删除Apple Watch上的远程票卡,需要先通过PKPassLibrary.remotePasses(for:)获取对应设备的票卡实例再执行删除操作,不能直接用本地iPhone的票卡对象删除关联的Watch端票卡。
内容的提问来源于stack exchange,提问作者Lukáš Šálek
相关产品推荐
相关产品推荐

