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

使用react-native-payments实现ApplePay时遇指针类型不兼容错误求助

解决react-native-payments中ApplePay的SecTrustResultType类型不兼容错误

问题概述

使用react-native-payments开发ApplePay功能时,遇到指针类型不兼容错误,导致代码编译失败。

错误信息

Incompatible pointer types passing retainable parameter of type 'SecTrustResultType *'

环境信息

  • iOS: 16.4
  • Xcode: 14.3
  • react-native: 0.71.4
  • react-native-payments: 0.8.4
  • Xcode部署目标:14.0

相关代码(PPOTSimpleURLConnection.m)

NSString *domain = challenge.protectionSpace.host;
SecTrustRef serverTrust = [[challenge protectionSpace] serverTrust];

NSArray *policies = @[(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)domain)];
SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies);
SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)self.pinnedCertificateData);
SecTrustResultType result;

//        OSStatus errorCode = SecTrustEvaluate(serverTrust, &result);
OSStatus errorCode = SecTrustEvaluateWithError(serverTrust, &result);

BOOL evaluatesAsTrusted = (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed);
if (errorCode == errSecSuccess && evaluatesAsTrusted) {
    NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
    completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
} else {
    completionHandler(NSURLSessionAuthChallengeRejectProtectionSpace, NULL);
}

解决方案

错误根源是SecTrustEvaluateWithError的第二个参数要求NSError **类型,但代码中传入了SecTrustResultType *,类型不匹配导致编译报错。以下是修复后的代码:

NSString *domain = challenge.protectionSpace.host;
SecTrustRef serverTrust = [[challenge protectionSpace] serverTrust];

NSArray *policies = @[(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)domain)];
SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies);
SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)self.pinnedCertificateData);

NSError *trustError = nil;
BOOL isTrusted = SecTrustEvaluateWithError(serverTrust, &trustError);

// 获取信任评估结果
SecTrustResultType result;
SecTrustGetTrustResult(serverTrust, &result);
BOOL evaluatesAsTrusted = (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed);

if (isTrusted && evaluatesAsTrusted) {
    NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
    completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
} else {
    completionHandler(NSURLSessionAuthChallengeRejectProtectionSpace, NULL);
}

关键修改点

  1. 将SecTrustResultType result替换为NSError *trustError = nil,匹配SecTrustEvaluateWithError的参数要求
  2. 通过SecTrustGetTrustResult单独获取原有的SecTrustResultType评估结果,保留原有业务判断逻辑
  3. 直接使用SecTrustEvaluateWithError返回的布尔值isTrusted判断信任基础状态

内容的提问来源于stack exchange,提问作者Riddhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:38:20