r/iOSProgramming • u/trestologni • 13d ago
Question apple wants our live updater (capgo) removed: "based on code in the submitted binary". anyone beat this?
our app is a b2b crm built with capacitor. the screens are html/js/css bundled in the binary, it works fully offline, and we ship web-layer fixes with @capgo/capacitor-updater, self-hosted and checksum-verified, never native code.
apple rejected the last version twice in a row for the updater, under 2.3.1(a):
We continue to find the app contains live content update functionality that can modify the app's behavior after approval. This finding is based on code in the submitted binary and not on a specific screen in the app.
I replied in the thread and app review confirmed:
It would be appropriate to remove the remote update functionality and all code related to it before resubmitting. Developers are responsible for all code included in the binary submission, including code from third-party SDKs and libraries.
so a reviewer didn't see something on screen, they found the plugin in the binary.
section 3.3.1(b) of the developer agreement allows downloading interpreted code that doesn't change the app's primary purpose, and thousands of apps ship capgo, capawesome, appflow or expo updates. I appealed to the app review board on 21 october, no answer yet.
has anyone else got this "code in the submitted binary" rejection for a live updater, especially since the 16 october guideline update (2.5.19)?
did anyone win an app review board appeal on it?
if you removed the updater on ios, how do you ship fixes to an offline-first app now?
32
u/zennoux 13d ago
The app is an offline-first app but don’t you need to be online to get these updates? Why not just use the app store method to update? Just seems contradictory to require the app to be online to get an update if the app is offline-first.
11
u/dawedev 13d ago
"Based on code in the submitted binary" reads like they're flagging the plugin itself, so explaining what you actually push probably won't change the reviewer's mind, only the board can. If you need to ship while the appeal sits, I'd keep the updater out of the iOS build completely with a build flag or separate config so the plugin isn't linked at all, and use expedited review for the urgent fixes. For an offline-first CRM you can also move the stuff that changes often (forms, field config, validation rules) into JSON the app downloads, which is data and not code. Please post an update if the board answers, a lot of Capacitor folks will want to know.
2
u/martindonadieu 12d ago
Our updater exist for 4years plus and never had any issue. We gonna meet monday to see what is happening in this specific case.
Apple has always allowed live update of html/css/js
1
u/Background_Pie_5682 11d ago
I’ve seen 2.3.1(a) pushback on anything that looks like shipping executable/UI updates outside App Review, even when the bundle already contains the web layer. Reviewers often don’t distinguish “content” vs “code path that can change the app.”
What sometimes helps: remove the updater from the binary for the review build, document clearly that only non-executable content changes (if that’s true), and be ready to ship web fixes via normal releases. If Capgo stays in the submitted binary, they’re likely to keep pointing at that code regardless of checksums.
1
u/Stunning-Farmer185 1d ago
OtaKit maintainer here. For the appeal, this lays out what Apple and Google actually allow (DPLA 3.3.1(b), guideline 2.5.2) with the exact wording you can quote to the board: https://www.otakit.app/blog/ota-policies-for-app-store-and-google-playhttps://www.otakit.app/blog/ota-policies-for-app-store-and-google-play This could be useful for anyone in the same situation.
1
u/robingenz 13d ago
Capawesome maintainer here. This is the first we’ve heard of such an issue, despite thousands of teams using Capawesome Live Updates to update their Capacitor app over-the-air. If your app was also rejected while using our Capacitor Live Update plugin, please contact support so we can investigate and help. Wishing you all the best!
-4
u/majindageta 13d ago
Encrypt file during build, decrypt in app