iOS 15: Cannot launch enterprise signed application

I installed the iOS 15 beta to test our apps that are distributed internally and signed with enterprise distribution (no app store)

“My App Name” Needs to be updated

The developer of this app needs to update it to work with this version of iOS.

Only mention I was able to find is: https://developer.apple.com/forums/thread/681792?answerId=678622022

Which seems to indicate that the app must be built and signed with the beta version of XCode. I would guess that the Expo build servers are not using this yet. That said it’s a fairly vague message, so this is just a guess.

Expo go still seems to work fine.

2 Likes

We will add xcode 13 image when version GM will become available, in a meantime, you can also try


2021-10-01 Update from the Expo team (RESOLVED)

The OS of the classic build servers has been upgraded and now uses a newer version of the code-signing software that is compatible with iOS 15 without Xcode 13.

This thread’s issue is resolved: new Enterprise builds created with expo build:ios are compatible with iOS 15.

We have specifically tested with the latest SDK version, SDK 42. Older SDK versions supported by expo build:ios are also expected to work.


2021-09-29 Update from the Expo team

Xcode 13 is required to address the issue in this thread’s first post. The newest version of Xcode introduced several breaking changes and requires more investigation and work than only installing Xcode 13. Currently, EAS Build (both cloud and local builds) supports Xcode 13 and we are still investigating Xcode 13 support for local classic builds (turtle-cli) and cloud classic builds (expo build:ios) for the latest SDK.

Using EAS Build (currently working)

EAS Build is a service for building Expo apps with support for custom native code. With EAS Build, you can run builds locally on your own hardware (eas build --local) without an EAS subscription plan.

Developers who have signed up for the EAS preview also can build with cloud servers (eas build).

These are the instructions for migrating a project to work with EAS Build.

Manually re-signing the IPA (currently working)

Thank you to @pocketencasa for sharing the steps they took. See their nice post here.

Running turtle build:ios locally with Turtle CLI (partly working)

Using turtle-cli, you can build your app locally. The guide on Turtle CLI explains how to install turtle-cli and run turtle build:ios.

There is at least one known issue with app version numbers not matching the numbers in app.json: Incorrect version/build number in iOS IPA’s Info.plist with Xcode 13 · Issue #333 · expo/turtle · GitHub.

Using expo build:ios (not working)

We’re still looking into Xcode 13 support for expo build:ios and need to support it for the next SDK release, SDK 43. The complexity comes from the breaking changes introduced with Xcode 13. We are also looking into supporting Xcode 13 with SDK 42. Older SDK versions may no longer compile or run properly when built with Xcode 13 and apps that require being built with Xcode 13 need to upgrade to SDK 42.

Using the latest build server image resolved the issue for me. The documentation wasn’t very clear to me, so here’s how you do it:

Add this line to your eas.json file:

{
  "builds": {
    "ios": {
      "release": {
        "workflow": "generic"
      },
      "preview": {
        "distribution": "internal",
        "workflow": "generic",
        "image": "latest" // Add this line
      }
    }
  }
}

Can you clarify what part was not clear, so we can improve the docs?

Was the problem with finding docs for image field? or did you tried setting image to “macos-big-sur-11.4-xcode-12.5”?

if the second one, then it was correct, image field should accept “macos-big-sur-11.4-xcode-12.5”, but we didn’t release a new cli version that supports this value.

Sure. To be clear, I was able to figure out exactly what I needed to do on my first try using the docs, but I still think there’s room for improvement. Looking at that page you linked to, it says you need set your “image” to “macos-big-sur-11.4-xcode-12.5” or “latest”. The page mentions putting this into your eas.json file, but it doesn’t say where you should put the “image” key in your config file.

Looking at the article on how to configure your eas.json file, the “image” key is referenced, which is good. However, the only example of how to use “image” looks like this:

{
  "workflow": "generic",
  "extends": string,
  "credentialsSource": "local" | "remote", // default: "remote"
  "scheme": string,
  "schemeBuildConfiguration": string,
  "artifactPath": string, // default: "ios/build/App.ipa"
  "releaseChannel": string, // default: "default"
  "distribution": "store" | "internal" | "simulator", // default: "store"
  "enterpriseProvisioning": "adhoc" | "universal",
  "autoIncrement": boolean | "version" | "buildNumber", // default: false
  "image": string, // default: "default"
  "node": string,
  "yarn": string,
  "bundler": string,
  "fastlane": string,
  "cocoapods": string,
  "env": Record<string, string>,
  "cache": {
    "disabled" : boolean, // default: false
    "key": string,
    "cacheDefaultPaths": boolean, // default: true
    "customPaths": string[] // default: []
  }
}

But my eas.json file looked like this:

{
  "builds": {
    "android": {
      "release": {
        "workflow": "generic"
      },
      "preview": {
        "distribution": "internal",
        "workflow": "generic"
      }
    },
    "ios": {
      "release": {
        "workflow": "generic"
      },
      "preview": {
        "distribution": "internal",
        "workflow": "generic"
      }
    }
  }
}

At what level of nesting are you supposed to put the “image” key? I figured it out because I noticed that your example was missing the “builds” key, but did have the “workflow” key at the top-level, so I inferred that the example in the docs was showing a nested object inside of the overall eas.json object. So I guessed (correctly) that I should put the “image” key in the same nesting level as “workflow”.

I think most people would be able to figure out what to do like I did, but my only feedback for the docs would be to use the full eas.json structure in your examples. So I would update the example in your doc to look like this:

{
	"builds": {
		"ios": {
			"BUILD_PROFILE_NAME": {
				"workflow": "generic",
				"extends": string,
				"credentialsSource": "local" | "remote", // default: "remote"
				"scheme": string,
				"schemeBuildConfiguration": string,
				"artifactPath": string, // default: "ios/build/App.ipa"
				"releaseChannel": string, // default: "default"
				"distribution": "store" | "internal" | "simulator", // default: "store"
				"enterpriseProvisioning": "adhoc" | "universal",
				"autoIncrement": boolean | "version" | "buildNumber", // default: false
				"image": string, // default: "default"
				"node": string,
				"yarn": string,
				"bundler": string,
				"fastlane": string,
				"cocoapods": string,
				"env": Record < string,
				string > ,
				"cache": {
					"disabled": boolean, // default: false
					"key": string,
					"cacheDefaultPaths": boolean, // default: true
					"customPaths": string[] // default: []
				}
			}
		}
	}
1 Like

So iOS 15 releases in 6 days: iOS 15, iPadOS 15, watchOS 8, and tvOS 15 Will Be Released On September 20 - MacRumors

And I don’t yet have a solution here. My app uses classic builds from an NX Monorepo, and I just tried a new build built just now and still will not launch on the latest iOS 15 beta.

So is the only way to get this working to migrate to EAS? Or is there some way that I can tweak the classic builds to make this work?

Thanks for any hints here!

we will update to xcode 13 soon after the gm is released. if you want to build with xcode 13 beta locally you can use turtle-cli

1 Like

@notbrent When can we expect the update to go through - we’re blocked by this too.

soon after xcode 13 is released. you can install beta or rc on your machine and build locally until then. not sure what you mean by blocked because iOS 15 and xcode 13 aren’t released yet

Hi brents - what we’re trying to do, is work out how to use the expo build:ios command to issue a build to Xcode 12.5 remotely rather than 12.4. At the moment using this command builds on 12.4 and therefore is useless for iOS15

hi, this category on the forum is focused on eas build, stuff related to classic builds should be posted in Expo-CLI/Build Service category. btw eas supports xcode 12.5 images

To answer your question,

  • classic build service is building all supported sdks on single image, so just updating xcode there would break older versions.
  • when building for iOS, classic builds are using the same prebuild binary for all apps that was built earlier, build setice is mostly updating som plist files and signing
  • so to update the version of xcode for classic builds, we need to fix all supported sdk to work with it, rebuild them and then update xcode on build service, it does not really make sense to that until ios15 (and xcode 13) goes out of beta and most likely we will need to wait for github actions to support xcode 13 (we use it to create those prebuilds)

At the moment using this command builds on 12.4

currently, the classic build service is using xcode 12.1, but prebuilds might have been created using newer version

As far as I can tell only issue that enterprise builds have is some new requirements for signing, so it’s possible that building it locally using turtle-cli, or resigning ipa file created by expo build:ios might work.

if you really need that to work on day one and above option doe not help you wlll need to build it on eas.

2 Likes

Turtle CLI got the job done once I gathered all the right certs and credentials. Thanks for the hint on that.

Appreciate all the hard work you guys do. Thank you.

Any update on this @wkozyra or do I need to tell my client that we should migrate to eas / turtle-cli to make it work on iOS 15? As currently “classic” builds do not seem to work.

Edit: Resigning the “Expo classic built” app locally fixed it and made it work on iOS 15.

Adrian @dept can you quickly explain, how to resign an app?

You can use fastlane resign - fastlane docs

2 Likes

This should NOT normally be required but just in case here are some steps that worked for me. This was necessary to fix an issue when iOS was updated to version 15 and our application stopped working. Users were presented with the following error which was not very helpful.

image

The underlying problem is the app was signed with an older (and now incompatible with enterprise distributuons) version of xcode.

One solution is to resign the app but there aren’t fully clear steps anywhere for that so here we go…

These steps were cobbled together from several expo forum posts, stack overflow posts and a quick chat with Brent from Expo.

Steps to manually resign an IPA:

  1. brew install fastlane

  2. go to your project root folder in terminal and run “expo prebuild”. This lays down the ios (and anrdoid but that’s irrelevant) projects so we can use fastlane. Don’t worry you haven’t “ejected”.

  3. in same folder run “cd ios” then run “fastlane init”

  4. Open keychain access manager on mac os and then go to File // Import then go pick your .p12 distribution cert (you should have this already but if not you can download it from https://expo.dev/accounts/your_account/projects/your_project/credentials?platform=ios assuming it’s been cached there)

  5. Now back in the terminal you want to resign the ipa file using fastlane with the following command (just make sure the paths are correct first!):

fastlane sigh resign /path/to/<your_app>.ipa --signing_identity “<your_signing_identity>” -p “path/to/<your_provisioning_profile>”

The provisioning profile file you should have this already but if not you can download it from https://expo.dev/accounts/your_account/projects/your_project/credentials?platform=ios assuming it’s been cached there.

If you don’t know <your_signing_identity> you can just not include the signing_identity option and then copy paste the one that is shown when the program runs into the prompt. When you run the command it lists out the available identities… Just copy/paste the weird long number/string not the whole thing.

If it says no applicable identities then you didn’t do 4) correctly.

If it complains about no ios project or whatever then you didn’t do 3) correctly or you’re not currently in the /ios

https://docs.fastlane.tools/actions/sigh/

https://docs.fastlane.tools/getting-started/ios/setup/

2 Likes

we will work on getting xcode 13 ready tomorrow, but we may not ship it until monday. thanks for the patience! we’ll get faster at this in the future when we’re in GA :slight_smile: thanks everyone who shared information about workarounds

1 Like

Current expo version that I’m using is sdk 36. Tried to rebuild with expo build:ios but the issue still exist. This is the only solution? It workable in sdk 36? after done all the step just run expo build:ios to generate the ipa?

After running the steps i wrote above your ipa is good to go and be used. No need to rebuild or anything. I tested running the above steps on an IPA that was built with Expo 39. I can’t comment whether it would work with 36 but you should try and let us know for the benefit of everybody reading this.

@brents any updates regarding this one?