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

React Native集成Apple Pay编译报错:Cannot find protocol declaration for 'PKPaymentAuthorizationControllerDelegate'

React Native集成Apple Pay编译报错:Cannot find protocol declaration for 'PKPaymentAuthorizationControllerDelegate'

我之前在做React Native Apple Pay桥接的时候也踩过这个坑,这个报错的核心原因是Objective-C自动生成的Swift桥接头文件没有识别到PassKit框架里的协议声明,给你几个针对性的解决办法:

1. 给InternalApplePayHandler所在的Swift文件补全PassKit导入

看你贴的ApplePayHandler.swift代码,文件顶部没有导入PassKit框架,但你在类里用到了PKPaymentAuthorizationController、PKPayment这些PassKit的类和协议,Swift编译器没办法自动把PassKit的信息同步到生成的Objective-C头文件里。

只需要在ApplePayHandler.swift最顶部加上导入语句:

import PassKit

这是最容易被忽略的点,我当初就是漏了这个,折腾了好久😂。

2. 确认Objective-C文件的导入顺序和框架依赖

检查你的ApplePayManager.m文件,虽然你已经导入了PassKit,但要确保导入顺序是:先导入系统框架,再导入React相关和自动生成的Swift头文件。比如:

#import <PassKit/PassKit.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTUtils.h>
// 这里替换成你项目实际的自动生成Swift头文件名,一般是 项目名-Swift.h
#import "Mobile-Swift.h"

另外,在Xcode的项目设置里,确认你的Target的Link Binary With Libraries里已经添加了PassKit.framework(不过现在Xcode一般会自动关联,保险起见还是检查下)。

3. 调整Swift类的协议扩展可见性

有时候Swift类的默认可见性会导致协议无法被Objective-C识别,你可以给InternalApplePayHandler的协议扩展加上@objc修饰,确保它能被桥接给Objective-C:

@objc extension InternalApplePayHandler: PKPaymentAuthorizationControllerDelegate {
    func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController, didAuthorizePayment payment: PKPayment, handler completion: @escaping (PKPaymentAuthorizationResult) -> Void) {
        // 你的实现代码
    }
    
    func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
        // 你的实现代码
    }
}

4. 清理项目缓存再编译

Xcode的缓存有时候会搞事情,尤其是涉及Swift和Objective-C混编的时候。执行以下步骤:

  • 关闭Xcode
  • 删除项目的DerivedData文件夹(可以通过Xcode的File -> Project Settings -> Derived Data找到路径,直接删除整个文件夹)
  • 重新打开项目,按Cmd+Shift+K清理项目,再按Cmd+B重新编译

按照这几个步骤来,基本就能解决这个协议找不到的报错了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 08:30:28