iOS自定义键盘扩展无法访问React Native AsyncStorage存储数据如何解决
iOS自定义键盘读取React Native AsyncStorage的解决方案
你遇到的问题本质是两个bug叠加:1. iOS App扩展与主应用默认沙箱隔离,2. 代码中AsyncStorage的初始化顺序错误,按照以下步骤修复即可:
步骤1:开启App Group共享沙箱权限
- 打开Xcode,分别选中主应用target和自定义键盘扩展target,在「Signing & Capabilities」 tab中点击+Capability,添加「App Groups」能力
- 给两个target配置同一个App Group ID,格式一般为
group.你的团队ID.你的应用bundle id,例如group.com.xxx.myapp - 这一步是让主应用和键盘扩展可以访问同一个共享存储空间,否则二者的AsyncStorage完全隔离,自然读不到对方存储的数据
步骤2:修改RNCAsyncStorage的存储路径到App Group
你需要在初始化RCTBridge之后,手动指定AsyncStorage的存储目录为App Group的共享目录,修改KeyboardViewController.m中的viewDidLoad方法,调整代码顺序如下:
- (void)viewDidLoad { [super viewDidLoad]; CGFloat _expandedHeight = 240; NSLayoutConstraint *_heightConstraint = [NSLayoutConstraint constraintWithItem: self.view attribute: NSLayoutAttributeHeight relatedBy: NSLayoutRelationEqual toItem: nil attribute: NSLayoutAttributeNotAnAttribute multiplier: 0.0 constant: _expandedHeight]; [self.view addConstraint: _heightConstraint]; // 先初始化bridge,原代码先获取bridge模块时bridge还未初始化,会返回空指针 self.bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:@{ @"keyboardExtension": self }]; // 手动指定AsyncStorage存储路径为App Group共享路径 NSString *appGroupId = @"你上一步配置的App Group ID"; NSURL *sharedContainerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:appGroupId]; NSURL *storageURL = [sharedContainerURL URLByAppendingPathComponent:@"RNCAsyncStorage" isDirectory:YES]; RNCAsyncStorage *asyncStorage = [self.bridge moduleForClass:[RNCAsyncStorage class]]; // RNCAsyncStorage v1.12.0及以上版本支持该方法修改存储路径 [asyncStorage setStorageDirectory:storageURL.path]; asyncStorage.delegate = self; NSLog(@"Added loading view"); /* Custom RN View */ NSDictionary *props = @{@"isKeyboard" : @true}; self.rootView = [[RCTRootView alloc] initWithBridge:self.bridge moduleName:@"RNKeyboard" initialProperties:props]; [self.view addSubview:self.rootView]; /* Custom RN View - end */ [self updateViewConstraints]; keyboardViewController = self; }
注意:主应用侧的AsyncStorage也需要同样修改存储路径到App Group,否则主应用存储的数据仍在私有沙箱中,键盘扩展无法读取,修改逻辑与上面一致,修改主应用初始化RCTBridge的对应代码即可
步骤3:验证Pod配置
你当前Podfile中键盘扩展target的配置是正确的,不需要额外修改,只需保证主应用和键盘扩展都引入了RNCAsyncStorage依赖,修改完后执行pod install重新安装依赖即可生效。
额外注意点
- 如果你的RNCAsyncStorage版本低于v1.12.0,没有
setStorageDirectory方法,可以升级到v1.12.0及以上版本,也可自行修改RNCAsyncStorage源码替换默认存储路径为App Group路径 - 主应用和键盘扩展存储数据的key需保持一致,避免读取不到
- 调试时可通过Xcode沙箱查看工具,确认两个target的AsyncStorage数据都存储在App Group的共享目录下
内容的提问来源于stack exchange,提问作者Jaydip Sharma
相关产品推荐
相关产品推荐

