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扩展。
步骤如下:
- 打开你的Swift Package对应的Xcode项目,选中Localisation target;
- 切换到Build Phases标签,点击左上角的
+,选择New Run Script Phase; - 把这个脚本拖到Compile Sources之前(确保编译前先生成扩展文件);
- 粘贴下面的脚本(注意根据你的项目路径调整):
# 自动生成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

