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

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: []
				}
			}
		}
	}
2 Likes

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

1 Like