iOS16.4模拟器ApplePay集成报错:_PKPaymentNetworkPagoBancomat符号未找到
问题描述
使用Xcode 15.0(15A240d)开发最低兼容iOS 16的应用,集成Apple Pay时将Web端的PaymentNetwork映射为PKPaymentNetwork,在iOS 16.4模拟器运行时应用崩溃,报错信息如下:
dyld[63845]: Symbol not found: _PKPaymentNetworkPagoBancomat Referenced from: <BACBF79F-6485-3A1B-84CA-A343341FA5A6> /Users/user.name/Library/Developer/CoreSimulator/Devices/2F7896EF-64AE-40CF-B712-DF4F2DCFF887/data/Containers/Bundle/Application/2D15AF1A-8479-4C03-A674-CF9F3A721573/MyApp.app/MyApp Expected in: <6C22B2D4-5F5B-3FA9-825B-BDA166D45320> /Library/Developer/CoreSimulator/Volumes/iOS_20E247/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 16.4.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/PassKit.framework/PassKit
相关映射代码如下:
注:该代码在iOS 17上可正常运行!
public enum ApplePayNetwork: String, Codable { case amex = "amex" case bancomat = "bancomat" case bancontact = "bancontact" case cartesBancaires = "cartesBancaires" case chinaUnionPay = "chinaUnionPay" case dankort = "dankort" case discover = "discover" case eftpos = "eftpos" case electron = "electron" case elo = "elo" case girocard = "girocard" case interac = "interac" case jcb = "jcb" case mada = "mada" case maestro = "maestro" case masterCard = "masterCard" case mir = "mir" case privateLabel = "privateLabel" case visa = "visa" case vPay = "vPay" public init?(pkPaymentNetwork: PKPaymentNetwork?) { guard let pkPaymentNetwork else { return nil } switch pkPaymentNetwork { case .amex: self = .amex case .pagoBancomat: self = .bancomat case .bancontact: self = .bancontact case .cartesBancaires: self = .cartesBancaires case .chinaUnionPay: self = .chinaUnionPay case .dankort: self = .dankort case .discover: self = .discover case .eftpos: self = .eftpos case .electron: self = .electron case .elo: self = .elo case .girocard: self = .girocard case .interac: self = .interac case .JCB: self = .jcb case .mada: self = .mada case .maestro: self = .maestro case .masterCard: self = .masterCard case .mir: self = .mir case .privateLabel: self = .privateLabel case .visa: self = .visa case .vPay: self = .vPay default: return nil } } public var toAppNetwork: PKPaymentNetwork { switch self { case .amex: return .amex case .bancomat: return .pagoBancomat case .bancontact: return .bancontact case .cartesBancaires: return .cartesBancaires case .chinaUnionPay: return .chinaUnionPay case .dankort: return .dankort case .discover: return .discover case .eftpos: return .eftpos case .electron: return .electron case .elo: return .elo case .girocard: return .girocard case .interac: return .interac case .jcb: return .JCB case .mada: return .mada case .maestro: return .maestro case .masterCard: return .masterCard case .mir: return .mir case .privateLabel: return .privateLabel case .visa: return .visa case .vPay: return .vPay } } }
问题原因
PKPaymentNetwork.pagoBancomat是iOS 17.0才新增的API,iOS 16.4的PassKit框架中不存在这个符号。Xcode 15编译时会直接链接该符号,导致低版本系统启动应用时,dyld无法找到对应符号引发崩溃。
解决方案
通过版本判断隔离iOS 17+的代码,避免低版本系统加载到不存在的符号,同时适配业务逻辑:
1. 修改toAppNetwork计算属性
将返回类型改为可选值,在低版本系统中遇到bancomat时返回nil(或根据业务需求做降级处理):
public var toAppNetwork: PKPaymentNetwork? { switch self { case .amex: return .amex case .bancomat: if #available(iOS 17.0, *) { return .pagoBancomat } else { return nil // 业务层可根据需求过滤该网络或提示用户 } case .bancontact: return .bancontact case .cartesBancaires: return .cartesBancaires case .chinaUnionPay: return .chinaUnionPay case .dankort: return .dankort case .discover: return .discover case .eftpos: return .eftpos case .electron: return .electron case .elo: return .elo case .girocard: return .girocard case .interac: return .interac case .jcb: return .JCB case .mada: return .mada case .maestro: return .maestro case .masterCard: return .masterCard case .mir: return .mir case .privateLabel: return .privateLabel case .visa: return .visa case .vPay: return .vPay } }
2. 修改初始化方法
添加版本判断,仅在iOS 17+时处理.pagoBancomat:
public init?(pkPaymentNetwork: PKPaymentNetwork?) { guard let pkPaymentNetwork else { return nil } switch pkPaymentNetwork { case .amex: self = .amex case .pagoBancomat where #available(iOS 17.0, *): self = .bancomat case .bancontact: self = .bancontact case .cartesBancaires: self = .cartesBancaires case .chinaUnionPay: self = .chinaUnionPay case .dankort: self = .dankort case .discover: self = .discover case .eftpos: self = .eftpos case .electron: self = .electron case .elo: self = .elo case .girocard: self = .girocard case .interac: self = .interac case .JCB: self = .jcb case .mada: self = .mada case .maestro: self = .maestro case .masterCard: self = .masterCard case .mir: self = .mir case .privateLabel: self = .privateLabel case .visa: self = .visa case .vPay: self = .vPay default: return nil } }
3. 业务层适配
如果Web端可能在iOS 16设备上返回bancomat网络,需要在业务逻辑中过滤该选项,或提示用户升级系统以使用该支付方式。
内容的提问来源于stack exchange,提问作者SPatel
相关产品推荐
相关产品推荐

