Objective-C iOS键值对持久化存储及语言切换闪退重启问题咨询
Objective-C iOS应用持久化存储与语言切换问题解决方案
跨应用重启的键值对存储方案
针对轻量级用户偏好类数据(如语言标识),最适配的系统原生方案是NSUserDefaults,数据持久化存储在应用沙盒中,应用重启、设备重启均不会丢失,完全满足你的需求:
- 写入数据示例:
// 存储当前选中的语言标识 [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"currentLanguage"]; // 可选:手动触发立即持久化,兼容iOS12以下版本,高版本系统会自动同步 [[NSUserDefaults standardUserDefaults] synchronize];
- 读取数据示例:
NSString *currentLanguage = [[NSUserDefaults standardUserDefaults] stringForKey:@"currentLanguage"];
如果后续有更大体量数据的持久化需求,可选择NSKeyedArchiver归档、SQLite存储或者第三方缓存库,仅存储语言标识的话NSUserDefaults是最优选择
跳转系统设置后应用被杀的问题说明
你在Xcode控制台看到的
Message from debugger: Terminated due to signal 9属于iOS系统的默认行为:当用户在系统设置页修改应用的独立语言配置时,系统会主动杀掉后台存活的对应应用,确保下次启动时加载新的语言配置,不属于代码bug。
语言切换功能适配方案
因为系统会主动杀应用,全局变量在应用重启后会被完全重置,你原本的全局变量对比逻辑不需要使用,按以下流程实现即可:
- 应用冷启动时,在
application:didFinishLaunchingWithOptions:方法中优先读取NSUserDefaults中存储的currentLanguage字段,以此为准加载对应的本地化字符串资源 - 用户在首屏选中语言后,先将语言标识写入
NSUserDefaults,再跳转系统App设置页 - 应用被系统杀死后再次启动,直接读取已存储的语言标识加载对应内容,同时触发对应语言的视频资源下载逻辑即可
- 若用户未手动选择过语言,可读取系统当前语言作为默认值写入
NSUserDefaults使用
内容的提问来源于stack exchange,提问作者Andrew f0s3 Kosenko
相关产品推荐
相关产品推荐

