使用Fastlane通过Spaceship API提交内购本地化文本失败求助
问题分析与解决
核心原因
JSON解析生成的哈希使用字符串作为键(比如"en-US"),而你直接定义的localizationData哈希用的是符号键(Ruby里"en-US":这种写法等价于:en-US)。Spaceship的create!方法内部只识别符号键的哈希,所以读取JSON的字符串键数据无法被正确解析,才会抛出本地化字段缺失的错误。
验证方式
你可以在代码里打印两者的键类型确认差异:
# 打印JSON读取的哈希键类型 subscription_family['localizedDescriptions'].keys.each do |k| puts "JSON key: #{k}, type: #{k.class}" # 输出:JSON key: en-US, type: String end # 打印直接定义的哈希键类型 localizationData.keys.each do |k| puts "Literal hash key: #{k}, type: #{k.class}" # 输出:Literal hash key: en-US, type: Symbol end
解决方法
只需把JSON解析后的字符串键哈希转换为符号键哈希即可,两种常用方式:
方法1:解析JSON时直接生成符号键
修改你的get_subscription_config方法,添加symbolize_names: true参数:
def get_subscription_config file = File.open $subscription_config_path # 关键:让JSON解析直接生成符号键哈希 JSON.load(file, symbolize_names: true) rescue StandardError => e UI.error("Couldn't find or read the subscription configuration file") end
之后访问数据时要改用符号键:subscription_family[:localizedDescriptions]。
方法2:手动转换已解析的哈希
如果不想修改JSON解析逻辑,可以写个方法递归转换字符串键为符号键:
def symbolize_hash(hash) hash.transform_keys(&:to_sym).transform_values do |value| value.is_a?(Hash) ? symbolize_hash(value) : value end end # 使用时 localized_descriptions = symbolize_hash(subscription_family['localizedDescriptions'])
把转换后的localized_descriptions传入versions参数即可。
关于OpenStruct无效的原因
OpenStruct会把哈希键转为对象方法,但Spaceship API内部是直接读取哈希键值,不是调用对象方法,所以无法获取到本地化数据,导致创建的订阅组没有本地化信息。
内容的提问来源于stack exchange,提问作者patreu22
相关产品推荐
相关产品推荐

