Repository navigation
Conversation
…ease `mix mob.release --ios` copied ios/Info.plist into the bundle as written, so the `ios.plist_keys` a plugin declares, which the sim and device builds merge through `NativeBuild.apply_plugin_plist_keys!`, were missing from the App Store build: a plugin's privacy strings and Bonjour service types were gone, and iOS refused what the plugin needed. `apply_plugin_plist_keys!/2` now takes the activated plugins and is public. `Release.write_release_info_plist!/2` writes the project's plist with the plugins' keys to the device build-inputs dir, and `release_env/5` takes its path as a required argument: the script bundles that file and the URL-types and UIAppFonts commands are computed from it, as the dev build computes them from the bundle's merged copy. A preflight refuses a project without ios/Info.plist before the OTP download. Decision records corrected where they claimed the release merged the keys or read ios/Info.plist for the URL types; the plist-keys record gets an addendum. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Most of the content, including the description, and the fix has been writen with Claude. I reviewed the fix, and I have the feeling that claude tooks a lot of my local memory to built it. Feel free to tell me if's too verbose.
Thank you for Mob ! ❤️
Problem
mix mob.release --ioscopiesios/Info.plistinto the bundle as written (release_device.sh:cp ios/Info.plist "$APP/"). Theios.plist_keysthat activated plugins declare are merged by the sim and device builds (NativeBuild.write_bundle_info_plist!/3→apply_plugin_plist_keys!), but never by the release. An App Store build therefore loses every plugin's privacy strings and Bonjour service types, and iOS refuses what the plugin needs.Found with a plugin declaring
NSBonjourServices: ["_http._tcp"]andNSBluetoothAlwaysUsageDescription: the dev build found devices on the network, the release build (installed on an iPhone 16 Pro, iOS 26.6.1) found nothing, and neither key was in the bundle's Info.plist. Present in 0.7.29 and 0.7.31.Fix
NativeBuild.apply_plugin_plist_keys!/2takes the activated plugins and is public and documented. The dev path passesMobDev.Plugin.activated(); the release passes the listbuild_ipa/1already gated.Release.write_release_info_plist!/2writesios/Info.plistplus the plugins' keys to the device build-inputs dir (release_Info.plist). The project's file is left alone.release_env/5takes that path as a required argument, next toplugin_envandproject_env:MOB_IOS_INFO_PLIST,${…:?}: an unset variable stops the script instead of shipping the bare plist);ios/Info.plist, a plugin that createsCFBundleURLTypesmade the script stop onAdd :CFBundleURLTypes array("Entry Already Exists").ios/Info.plistbefore the OTP download.Precedence is unchanged: the project's keys win, plugins fill gaps (decisions/2026-05-28-plugin-plist-keys-merge.md).
Decision records
2026-05-28-plugin-plist-keys-merge.md: addendum (the release path; why a merged copy rather than PlistBuddy commands passed to the script; the file in the inputs dir), plus an in-place correction of "what the author sees in ios/Info.plist is what App Store Connect will see".2026-10-01-ios-layout-plist-keys.mdand2026-10-03-url-schemes.md: in-place corrections, since both stated the release copied plugin keys / readios/Info.plistfor URL types.release_env/4now sayrelease_env/5.Tests
test/mob_dev/release_plugin_plist_test.exs, each checked to fail with its part of the fix reverted:ios/Info.plistis untouched (fails without the merge);release_env/5hands the script the plist it is given (fails ifMOB_IOS_INFO_PLISTleaves the env);CFBundleURLTypesdoesn't stop the script's loop (fails ifrelease_envreadsios/Info.plist);$MOB_IOS_INFO_PLIST, notios/Info.plist.release_test.exsasserts the variable in the full release env.Verification
mix format --check-formatted,mix credo --strict(no issues),mix compile --warnings-as-errors,mix test. 8 failures, all pre-existing on master on this machine:release_script_testdead-strip test andzig_build_test: fail on master too;mob.adopttests: need the mob_new archive, which isn't installed here.mix mob.release --iosof a real app with one plugin, against this branch. The bundle's Info.plist has the plugin'sNSBonjourServicesandNSBluetoothAlwaysUsageDescription;UIAppFontsis intact.ios/Info.plist) was installed on an iPhone 16 Pro and the plugin's Bonjour browse worked. The final version was built (rung 3) but not reinstalled.🤖 Generated with Claude Code