Increasing iOS build no. without publishing the JS bundle?

Handling standalone build versions with Expo is quite painful. I guess you guys may want to improve it.

TL;DR

Can I build a standalone with increased build number, without publishing the JS again?

Scenario

I want to use the same js code for ios and android. So, my steps to publish a new version:

  1. publish to prod-v1
  2. exp build:ios --release-channel prod-v1 --no-publish
  3. exp build:android --release-channel prod-v1 --no-publish

app.json example

{
  "expo": {
    "sdkVersion": "27.0.0",
    "version": "1.4.2",
    "ios": {
      "buildNumber": "1.4.2",
    },
    "android": {
      "versionCode": 14,
    },
  }
}

Problem

Assume I faced some error on ios standalone build when I am testing on Testflight. I just need to rebuild the same version to fix it. But if I rebuild it, I will face the “Redundant Binary Upload” error from Apple:

ERROR ITMS-4238: "Redundant Binary Upload. You’ve already uploaded a build with build number 'x.x.x' for version number 'x.x.x'.

So I need to increase my version number of iOS build. But when I increase it and rebuild, the edited app.json is not used in the new build, because:

$ exp build:ios --release-channel prod-v1 --no-publish
20:34:11 [exp] Making sure project is set up correctly...
20:34:18 [exp] Your project looks good!
20:34:18 [exp] Checking if current build exists...

20:34:19 [exp] No currently active or previous builds for this project.
20:34:20 [exp] Using existing credentials for this build
20:34:20 [exp] Looking for releases...
20:34:21 [exp] Using existing release on channel "prod-v1":
  publicationId: xxxxxxxxxxxx
  publishedTime: xxxxxxxxxxxx
20:34:21 [exp] Building...
20:34:22 [exp] Build started, it may take a few minutes to complete.
20:34:22 [exp] You can monitor the build at
...

Note "Using existing release on channel “prod-v1"”. Normally if you publish it when building, it will use the local app.json. Without publishing, it ignores the local one.

Maybe just publish JS bundle when building ios?

No. As of SDK v27, I have some logics on prompting the users to reload js if new version is downloaded. So if I publish when building ios standalone, the old android one (on Google Play) will always has a new JS version waiting for it (and prompt on every new download).

Solution:

  1. Increase version number
  2. Publish again
  3. Build both ios and android again
  4. Resubmit everything onto the store

Conclusion

This is driving me crazy because sometimes there are just some bug on Expo build server, for example this time with SDK v27 deployment. I uploaded the Android version and waited for iOS build service for a whole week to build it. And then to find out some building bug on Testflight. And then I need to put down my Android app on Google Play in order to have a new iOS build.

Please point out if I am doing wrong on something. If not, please see if the workflow can be improved. More specifically, standalone build config should not depend on the published app.json.

This topic was automatically closed 15 days after the last reply. New replies are no longer allowed.