App Store Connect 为何提示 RPBroadcastProcessMode 缺失?
结论:先修正 RPBroadcastProcessMode 的层级
你的配置中,最明确的问题是 RPBroadcastProcessMode 被放进了 NSExtensionAttributes。它应直接位于 NSExtension 字典下,与 NSExtensionPointIdentifier、NSExtensionPrincipalClass 同级。
WebRTC 项目的 Broadcast Upload 扩展示例采用的就是这个结构。根据你描述的层级,键的位置错误足以解释“文件中存在,但上传校验仍提示未指定”的现象。目前不必先认定是 App Store Connect 的服务端故障。
为什么能搜到这个键,仍然提示缺失?
plist 中键的含义取决于它所在的字典。下面是两个不同的路径:
当前路径:NSExtension > NSExtensionAttributes > RPBroadcastProcessMode
应使用的路径:NSExtension > RPBroadcastProcessMode
如果校验器读取的是第二个路径,那么即使第一个路径下有完全相同的键名和值,也无法提供所需配置。这是根据配置结构对错误现象的解释;尚未检查过你的实际 IPA 或 Apple 的内部校验实现。
Release 构建和 Archive 成功、签名检查未发现异常,都不能证明扩展声明符合上传校验要求。此前 WidgetKit 扩展上传成功,也不能证明新加入的 ReplayKit 扩展配置正确。
如何修改 Info.plist?
修改 Broadcast Upload extension target 使用的 Info.plist,把该键从 NSExtensionAttributes 移到 NSExtension 的直接子级。以下片段需要合并到现有 plist 中:
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.broadcast-services-upload</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).SampleHandler</string>
<key>RPBroadcastProcessMode</key>
<string>RPBroadcastProcessModeSampleBuffer</string>
</dict>
$(PRODUCT_MODULE_NAME).SampleHandler 只是示例,应保留与你的实际 handler 类匹配的名称,也不要覆盖其他必要配置。
如果 NSExtensionAttributes 还有其他用途,保留其中的相关属性,只将 RPBroadcastProcessMode 移到 NSExtension 下,不要移到整个 Info.plist 的根字典。
错误消息列出了 RPBroadcastProcessModeMP4Clip,不代表需要切换到该模式。先修正层级,并确保所选模式与实际 handler 实现一致。
如何验证新归档和 IPA?
重新 Archive 并导出 IPA,检查错误消息指向的那个 .appex 的最终 Info.plist。不要只检查源码文件,也不要只搜索值是否出现。
例如,用以下命令读取归档中的准确路径,将示例路径替换为实际文件位置:
/usr/libexec/PlistBuddy \
-c 'Print :NSExtension:RPBroadcastProcessMode' \
'/path/to/MyApp.xcarchive/Products/Applications/MyApp.app/PlugIns/BroadcastUpload.appex/Info.plist'
配置正确时,该路径应返回:
RPBroadcastProcessModeSampleBuffer
将新导出的 IPA 解压后,对其中的扩展再检查一次:
/usr/libexec/PlistBuddy \
-c 'Print :NSExtension:RPBroadcastProcessMode' \
'/path/to/unpacked/Payload/MyApp.app/PlugIns/BroadcastUpload.appex/Info.plist'
plutil -lint 可以辅助检查 plist 格式。但通过格式检查不能证明 ReplayKit 配置在语义上正确,也不能保证 App Store Connect 接受该构建。
层级修正后仍然失败怎么办?
继续检查实际提交的产物:
- 核对错误中的扩展路径和 Bundle Identifier,确认检查的是 Broadcast Upload extension,而非 WidgetKit 或另一个
.appex。 - 核对扩展 target 在归档所用构建配置下的
INFOPLIST_FILE,以及是否启用了GENERATE_INFOPLIST_FILE,确认最终配置来源。 - 检查构建脚本是否会重写扩展的 Info.plist,并确认上传的是修正后生成的新归档或 IPA。
- 确认
RPBroadcastProcessMode是 String,且值没有拼写错误或额外空白。
此前由 Copy Bundle Resources 引发的重复输出错误虽已修复,键的层级仍需单独确认。不要直接编辑已签名 IPA 中的 plist 后继续上传,应修改工程配置并重新归档。
如果新 IPA 中的准确路径、类型和值都正确,仍收到相同错误,保存完整校验日志、扩展标识和构建工具版本,再向 Apple 提交反馈。仅凭目前的信息,无法确认存在服务端校验缺陷。
备注:内容仅供参考。
