Xamarin.iOS集成Razorpay时InitWithKey初始化返回null求助
Xamarin.iOS 集成Razorpay时InitWithKey返回null的解决方案
这个问题是Xamarin绑定Razorpay iOS SDK的高频踩坑点,按以下顺序排查即可解决:
1. 补全SDK依赖的系统框架与库
Razorpay iOS SDK初始化时会检测依赖项,缺任何一个都会直接返回null,在iOS项目的生成配置中添加以下系统框架:
- WebKit.framework
- CoreTelephony.framework
- SystemConfiguration.framework
- Security.framework
- QuartzCore.framework
- CoreGraphics.framework
- UIKit.framework
- Foundation.framework
同时在额外链接器标志中添加-lz -lc++,或者直接在项目引用里加入libz.tbd、libc++.tbd两个系统库。
2. 修正绑定项目的方法签名错误
你使用的第三方公开绑定仓库存在签名错误,原生initWithKey:delegate:是返回实例对象的类方法,旧绑定错误将返回值写为void,导致Runtime调用时拿不到返回对象。
打开绑定项目的ApiDefinition.cs,把InitWithKey的绑定代码替换为以下正确写法:
[Static, Export ("initWithKey:delegate:")] Razorpay InitWithKey (string key, IRazorpayPaymentDelegate paymentDelegate);
改完后必须删除整个解决方案的bin、obj文件夹,执行全量Clean后重新编译,增量编译的旧绑定缓存会导致修改不生效。
3. 检查原生框架引用配置
选中你添加的Razorpay.framework原生引用,在属性面板做如下配置:
- 将「复制到输出目录」设置为如果较新则复制
- 「链接行为」先设置为不要链接做测试,确认初始化正常后再根据需要调整为SDK链接
- 确认你导入的framework是包含arm64(真机)+x86_64/arm64(模拟器)的通用Fat框架,单架构框架在对应架构的设备上运行时会加载失败。
4. 修正初始化时机与Delegate生命周期
- 不要在AppDelegate的
FinishedLaunching阶段过早初始化SDK,等主UIViewController的ViewDidLoad执行、KeyWindow加载完成后再调用初始化方法,过早调用时系统运行环境未准备完成会导致SDK初始化失败。 - 传入的
paymentDelegate不要声明为方法内的临时变量,要将其赋值为当前类的实例字段,避免被GC回收造成野指针,SDK检测到Delegate无效时会直接返回null。
5. 补全Info.plist配置
在Info.plist中添加ATS配置,保证SDK可以正常访问Razorpay服务端完成密钥校验:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <false/> <key>NSExceptionDomains</key> <dict> <key>razorpay.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict>
所有配置修改完成后优先在真机上测试,模拟器经常存在架构兼容问题导致的加载失败,按上述步骤调整后即可正常拿到Razorpay实例完成支付流程。
内容的提问来源于stack exchange,提问作者Suchith
相关产品推荐
相关产品推荐

