Resolution (fixed)
App Store Connect was rejecting my build with
“RPBroadcastProcessMode … key was not specified”
even though the key/value appeared in the IPA and in swinfo. The root cause
was the key’s location in the Upload appex Info.plist. ASC expects the key
directly under NSExtension, not inside NSExtensionAttributes.
Incorrect (what I had originally):
NSExtension
└─ NSExtensionAttributes
└─ RPBroadcastProcessMode = RPBroadcastProcessModeSampleBuffer
Correct (what ASC expects):
NSExtension
├─ NSExtensionPointIdentifier = com.apple.broadcast-services-upload
├─ NSExtensionPrincipalClass = $(PRODUCT_MODULE_NAME).SampleHandler
└─ RPBroadcastProcessMode = RPBroadcastProcessModeSampleBuffer
Minimal working Info.plist for the Upload appex:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>MinimumOSVersion</key>
<string>26.0</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.broadcast-services-upload</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).SampleHandler</string>
<!-- Per ASC feedback, RPBroadcastProcessMode must live directly under NSExtension -->
<key>RPBroadcastProcessMode</key>
<string>RPBroadcastProcessModeSampleBuffer</string>
</dict>
</dict>
</plist>
One-liner to patch an existing plist:
/usr/libexec/PlistBuddy -c 'Delete :NSExtension:NSExtensionAttributes:RPBroadcastProcessMode' \
BeamRoomUpload2/Info.plist 2>/dev/null || true
/usr/libexec/PlistBuddy -c 'Add :NSExtension:RPBroadcastProcessMode string RPBroadcastProcessModeSampleBuffer' \
BeamRoomUpload2/Info.plist 2>/dev/null || \
/usr/libexec/PlistBuddy -c 'Set :NSExtension:RPBroadcastProcessMode RPBroadcastProcessModeSampleBuffer' \
BeamRoomUpload2/Info.plist
Quick verification before upload (from the exported IPA):
TMP=$(mktemp -d)
unzip -q /path/to/BeamRoomHost.ipa -d "$TMP"
APPEX=$(find "$TMP/Payload/BeamRoomHost.app/PlugIns" -maxdepth 1 -type d -name '*.appex' -print -quit)
PL="$APPEX/Info.plist"
/usr/libexec/PlistBuddy -c 'Print :NSExtension:RPBroadcastProcessMode' "$PL"
# Expect: RPBroadcastProcessModeSampleBuffer
Outcome:
After moving the key to :NSExtension:RPBroadcastProcessMode, I rebuilt,
exported, and uploaded via Transporter. ASC validation now succeeds.
Environment:
Xcode 26.0.1 (17A400), macOS 15.6 (24G84), Transporter 1.3.4 (13410).
Note:
If you have RPBroadcastProcessMode under NSExtensionAttributes, ASC currently
treats it as “not specified”. Putting it directly under NSExtension fixes the
validation error.
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags: