UNNotificationServiceExtension中Locale获取languageCode异常求助
UNNotificationServiceExtension 获取正确语言代码的解决方法
方案1:读取主应用Bundle的本地化信息
UNNotificationServiceExtension的独立Bundle不会继承主应用的本地化设置,因此可以直接访问主应用的Bundle来获取正确的语言偏好:
// 构建主应用Bundle的路径,替换为你的主应用名称 guard let mainBundleURL = Bundle.main.bundleURL .deletingLastPathComponent() .deletingLastPathComponent() .appendingPathComponent("YourMainAppName.app"), let mainBundle = Bundle(url: mainBundleURL) else { return "en" // 兜底返回默认语言 } // 获取主应用首选的语言代码(处理如"uk-UA"这类带区域的格式) let languageCode = mainBundle.preferredLocalizations.first? .components(separatedBy: "-") .first ?? "en"
注意:需确保主应用的Bundle名称正确,该方法依赖Extension与主应用的目录结构关系,适用于大多数常规打包场景。
方案2:通过App Groups共享语言设置
借助App Groups实现主应用与Extension的配置共享,相比普通UserDefaults更可靠:
- 在Xcode中为主应用和Extension配置相同的App Groups(项目配置 -> Signing & Capabilities -> 添加App Groups)
- 主应用在语言切换时,将当前语言代码存入共享容器:
let sharedDefaults = UserDefaults(suiteName: "group.com.yourcompany.yourapp")! sharedDefaults.set( Bundle.main.preferredLocalizations.first?.components(separatedBy: "-").first, forKey: "AppCurrentLanguageCode" ) sharedDefaults.synchronize()
- Extension中读取共享的语言代码:
let sharedDefaults = UserDefaults(suiteName: "group.com.yourcompany.yourapp")! let languageCode = sharedDefaults.string(forKey: "AppCurrentLanguageCode") ?? "en"
方案3:从推送负载中携带语言代码
如果后端支持,可以在推送通知的payload中直接携带用户的语言标识,Extension直接读取该字段即可:
// 假设payload中包含"user_lang"字段 if let languageCode = bestAttemptContent.userInfo["user_lang"] as? String { // 使用该语言代码进行本地化处理 }
此方案无需依赖本地配置,是最直接的跨端同步方式。
内容的提问来源于stack exchange,提问作者Oleksandr Molozh
相关产品推荐
相关产品推荐

