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>
- Objective-C项目:在Info.plist中添加
修正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
相关产品推荐
相关产品推荐

