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

iOS 26/Xcode 26下如何修改自动生成的Localizable符号访问权限以实现跨模块共享

iOS 26/Xcode 26下如何修改自动生成的Localizable符号访问权限以实现跨模块共享

我太懂你这种不想做重复劳动的心情了!你遇到的这个问题真的是Xcode 26里String Catalog自动生成符号的一个小痛点——默认生成的符号访问级别是internal(Swift默认访问级别,代码里没写修饰符但实际是模块内可见),只能在Localisation模块内部用,跨到FeatureA这种依赖模块就完全访问不了。截至Xcode 26,官方还没给我们直接修改生成符号访问权限的开关,得换个思路解决。

下面给你几个实用的方案,按省心程度排序:

方案一:手动写一层Public扩展(最稳妥,零坑)

这就是你提到的思路,但可以简化一下,不用套enum,直接写一个public扩展把生成的internal符号“转”成public就行,代码量极小:

在Localisation模块里新建一个文件(比如PublicLocalizedStrings.swift),内容如下:

import Foundation

@available(macOS 13, iOS 16, tvOS 16, watchOS 9, *)
public extension LocalizedStringResource {
    static let close: LocalizedStringResource = .close
    static let confirm: LocalizedStringResource = .confirm
}

这样FeatureA模块里直接用LocalizedStringResource.close就能调用了,完全符合跨模块访问的要求。以后要是Xcode更新支持直接生成public符号了,直接删掉这个文件就行,几乎没有维护成本。

方案二:用Build Script自动生成Public扩展(解放双手)

如果你的String Catalog里的文案经常变动,不想每次都手动更新这个扩展,可以在Xcode里加一个Run Script Build Phase,自动帮你生成这个public扩展。

步骤如下:

  1. 打开你的Swift Package对应的Xcode项目,选中Localisation target;
  2. 切换到Build Phases标签,点击左上角的+,选择New Run Script Phase;
  3. 把这个脚本拖到Compile Sources之前(确保编译前先生成扩展文件);
  4. 粘贴下面的脚本(注意根据你的项目路径调整):
# 自动生成PublicLocalizedStrings.swift的脚本
# 1. 定位到Xcode自动生成的符号文件
GENERATED_SYMBOLS_FILE="${BUILD_DIR}/../DerivedSources/GeneratedStringSymbols_Localizable.swift"
# 2. 定义要生成的public扩展文件路径
PUBLIC_EXT_FILE="${SRCROOT}/Sources/Localisation/PublicLocalizedStrings.swift"

# 检查生成的符号文件是否存在
if [ -f "$GENERATED_SYMBOLS_FILE" ]; then
    # 写入文件头部
    echo "// Auto-generated public extension for Localizable symbols" > "$PUBLIC_EXT_FILE"
    echo "import Foundation" >> "$PUBLIC_EXT_FILE"
    echo "" >> "$PUBLIC_EXT_FILE"
    echo "@available(macOS 13, iOS 16, tvOS 16, watchOS 9, *)" >> "$PUBLIC_EXT_FILE"
    echo "public extension LocalizedStringResource {" >> "$PUBLIC_EXT_FILE"
    
    # 从生成的符号文件中提取所有static var,替换成public static var
    grep -E "^    static var [a-zA-Z0-9_]+: LocalizedStringResource" "$GENERATED_SYMBOLS_FILE" | sed 's/    static var/    public static var/' >> "$PUBLIC_EXT_FILE"
    
    # 关闭extension
    echo "}" >> "$PUBLIC_EXT_FILE"
fi

这个脚本会自动读取Xcode生成的符号文件,把里面的internal变量转成public,写入到你指定的扩展文件里。不过要注意:如果你的DerivedData路径或者文件名有变化,可能需要调整GENERATED_SYMBOLS_FILE的路径。

方案三:暂时无法直接修改Xcode的生成规则

截止Xcode 26,STRING_CATALOG_GENERATE_SYMBOLS这个编译选项只控制是否生成符号,没有提供修改访问权限的配置项。我之前查过Apple的官方文档和开发者论坛,目前确实没有官方方法让Xcode直接生成public的符号,只能等后续版本更新这个功能了。

总结下来,方案一最省心,适合大多数场景;如果文案更新频繁,方案二能帮你省不少事。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:03:06