React Native集成TrustKit时私有调用NSDictionary配置常量问题
解决方案
你遇到的kTSK开头常量未声明问题,本质是这些配置项都是TrustKit定义的全局NSString类型常量,私有调用场景下有两种可直接落地的实现方案:
方案1:直接硬编码常量对应字符串(最简便)
TrustKit所有公开配置常量的实际值和常量名称完全一致,直接将代码中的常量替换为同名的NSString字面量即可,修改后的配置代码如下:
NSDictionary *trustKitConfig = @{ @"kTSKSwizzleNetworkDelegates": @YES, @"kTSKPinnedDomains": @{ @"*.apps.dev.js.com" : @{ @"kTSKIncludeSubdomains": @YES, @"kTSKEnforcePinning": @YES, @"kTSKDisableDefaultReportUri": @YES, @"kTSKPublicKeyHashes": @[ @"dz0GbS1i4LnBsJwhRw3iuZmVcgqpn+AlxSBRxUbOz0k=", @"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=", ], }, } };
该方案适配TrustKit所有稳定版本,不需要额外导入依赖,直接可用。
方案2:动态读取全局常量(更稳妥)
如果担心后续TrustKit版本迭代修改常量值,可以通过runtime动态获取常量地址取值,需要先导入<dlfcn.h>头文件,实现代码如下:
#import <dlfcn.h> // 封装动态获取TrustKit配置常量的工具方法 NSString *getTrustKitConst(const char *name) { NSString **constPtr = (NSString **)dlsym(RTLD_DEFAULT, name); if (constPtr != NULL) { return *constPtr; } return nil; } // 构造配置前先获取所有常量 NSString *kTSKSwizzleNetworkDelegates = getTrustKitConst("kTSKSwizzleNetworkDelegates"); NSString *kTSKPinnedDomains = getTrustKitConst("kTSKPinnedDomains"); NSString *kTSKIncludeSubdomains = getTrustKitConst("kTSKIncludeSubdomains"); NSString *kTSKEnforcePinning = getTrustKitConst("kTSKEnforcePinning"); NSString *kTSKDisableDefaultReportUri = getTrustKitConst("kTSKDisableDefaultReportUri"); NSString *kTSKPublicKeyHashes = getTrustKitConst("kTSKPublicKeyHashes"); // 确保所有常量都获取成功后再构造配置,避免崩溃 if (kTSKSwizzleNetworkDelegates && kTSKPinnedDomains && kTSKIncludeSubdomains && kTSKEnforcePinning && kTSKDisableDefaultReportUri && kTSKPublicKeyHashes) { NSDictionary *trustKitConfig = @{ kTSKSwizzleNetworkDelegates: @YES, kTSKPinnedDomains: @{ @"*.apps.dev.js.com" : @{ kTSKIncludeSubdomains: @YES, kTSKEnforcePinning: @YES, kTSKDisableDefaultReportUri: @YES, kTSKPublicKeyHashes: @[ @"dz0GbS1i4LnBsJwhRw3iuZmVcgqpn+AlxSBRxUbOz0k=", @"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB=", ], }, } }; // 后续初始化逻辑 }
该方案可以自动适配TrustKit不同版本的常量定义,避免硬编码可能带来的版本兼容问题。
注意事项
- 两种方案都不需要导入TrustKit的头文件,也不需要在Podfile中额外声明TrustKit依赖,完全符合私有调用的要求
- 运行时如果检测不到TrustKit类,所有配置逻辑不会执行,不会影响原有依赖库的TrustKit功能
内容的提问来源于stack exchange,提问作者Fonts
相关产品推荐
相关产品推荐

