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

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更可靠:

  1. 在Xcode中为主应用和Extension配置相同的App Groups(项目配置 -> Signing & Capabilities -> 添加App Groups)
  2. 主应用在语言切换时,将当前语言代码存入共享容器:
let sharedDefaults = UserDefaults(suiteName: "group.com.yourcompany.yourapp")!
sharedDefaults.set(
    Bundle.main.preferredLocalizations.first?.components(separatedBy: "-").first,
    forKey: "AppCurrentLanguageCode"
)
sharedDefaults.synchronize()
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:30:52