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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:54:18