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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:36:01