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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:06:03