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

NSUserDefaults能否跨Objective-C与Xamarin.Forms项目共享数据?

解决Objective-C与Xamarin.Forms通过App Groups共享NSUserDefaults数据为空的问题

排查与修复步骤:

  • 必须配置Info.plist
    仅配置Provisioning Profile不够,两个应用都需要在Info.plist中声明App Groups:

    • Objective-C项目:在Info.plist中添加App Groups数组,将group.sample加入其中;若使用可视化编辑器,找到「Application Groups」选项添加对应group ID。
    • Xamarin.Forms iOS项目:右键iOS项目→打开Info.plist的源代码视图,添加以下代码:
      <key>com.apple.security.application-groups</key>
      <array>
        <string>group.sample</string>
      </array>
      
  • 修正Xamarin端NSUserDefaults初始化方式
    不要用默认构造函数加AddSuite,直接通过suite name初始化共享容器,这是核心错误点:

    string groupName = "group.sample";
    NSUserDefaults shared = new NSUserDefaults(groupName, NSUserDefaultsType.SuiteName);
    // 用类型明确的方法读取,避免类型解析问题
    string test = shared.StringForKey("RunwayRequest");
    
  • 验证Objective-C端写入是否成功
    在写入代码后立即读取验证,确认数据已写入共享容器:

    NSString *appGroupId = @"group.sample";
    NSUserDefaults *groupUserDefaults = [[NSUserDefaults alloc] initWithSuiteName:appGroupId];
    [groupUserDefaults setValue:offlineMsg forKey:@"RunwayRequest"];
    BOOL syncResult = [groupUserDefaults synchronize];
    NSLog(@"写入是否成功:%d,写入的值:%@", syncResult, [groupUserDefaults valueForKey:@"RunwayRequest"]);
    

    检查日志确认syncResult为1(成功),且能读取到offlineMsg的值。

  • 确保Group ID完全一致
    两个应用的App Group ID必须完全匹配,包括大小写、标点符号,比如group.sample和Group.Sample会被视为不同容器。

  • 检查数据类型兼容性
    确保offlineMsg是NSUserDefaults支持的类型(NSString、NSNumber等),Xamarin端用对应类型的读取方法(如StringForKey、IntForKey)比ValueForKey更可靠。

  • 清理缓存并重启
    模拟器或真机的缓存可能导致App Groups不生效,删除两个应用,重启设备后重新安装测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:11:05