使用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); }
关键修改点
- 将
SecTrustResultType result替换为NSError *trustError = nil,匹配SecTrustEvaluateWithError的参数要求 - 通过
SecTrustGetTrustResult单独获取原有的SecTrustResultType评估结果,保留原有业务判断逻辑 - 直接使用
SecTrustEvaluateWithError返回的布尔值isTrusted判断信任基础状态
内容的提问来源于stack exchange,提问作者Riddhi
相关产品推荐
相关产品推荐

