EAS Release Problem mit iOS Version

Beim Release kommt folgender oder ähnlicher Fehler

SDK version issue. This app was built with the iOS 16.4 SDK. Starting April 29, 2024, all iOS and iPadOS apps must be built with the iOS 17 SDK or later, included in Xcode 15 or later, in order to be uploaded to App Store Connect or submitted for distribution. (90725)

Für den Build in der EAS-Cloud kann man folgendes in der eas.json angeben, damit immer mit der aktuellsten iOS und XCode-Version gebaut wird:

production:{
     "ios":{
         "image": "latest"
     }
}Code-Sprache: JavaScript (javascript)

Damit wird immer die aktuellste XCode und iOS Version gemommen. Oder man gibt eine spezifische Version an:

production:{
     "ios":{
         "image": "<span style="background-color: initial; font-family: inherit; font-size: inherit; color: initial;">macos-ventura-13.6-xcode-15.0</span>"
     }
}Code-Sprache: JavaScript (javascript)

Quelle

Exporelease für Android vs. Google Play Uploadzertifikat

  • Die App-Installations-Bundles für Google Android Apps müssen mit einem Schlüsselpaar generiert werden
  • Dieses Schlüsselpaar enthält Urheberinformationen
  • Auf Basis dieses Schlüsselpaares wird ein Zertifikatsschlüssel für den Upload generiert
  • Dieser Zertifikatsschlüssel wird bei Google hinterlegt
  • Beim Upload von App-Installation-Bundles gleicht Google ab, ob die App mit einem Schlüsselpaar generiert wurde, welches zum Zertifikatsschlüssel passt
  • Nur wenn beides übereinstimmt, wird das App-Release zugelassen

Neues Schlüsselpaar generieren

<em>keytool -genkeypair -alias upload -keyalg RSA -keysize 2048 -validity 9125 -keystore keystore.jks</em>Code-Sprache: HTML, XML (xml)

PEM-Datei (Uploadzertifikat) aus dem Schlüsselpaar generieren

<em>keytool -export -rfc -alias upload -file upload_certificate.pem -keystore keystore.jks </em>Code-Sprache: HTML, XML (xml)

Uploadzertifikat in der Google Play Android Console hochladen

Unter Einrichten > App-Signatur auf Zurücksetzen des Upload-Schlüssels anfordern gehen und dort das generierte PEM-File hochladen.

Achtung: Es kann bis zu 48 Stunden dauern, bis der neue Schlüssel verwendet werden kann.

Expo Anleitung dazu

EAS Cheatsheet

Stage Release für Plattformen

eas build --profile stage --platform ios
eas build --profile stage --platform android

Production Release für Plattformen bauen

eas build --profile production --platform ios
eas build --profile production --platform android

Production Release für Plattformen veröffentlichen

eas submit --platform ios
eas submit --platform android

Over the air Update für alle Apps in Release-Channel „staging“

expo publish --release-channel staging

Ein neues Update mit einem neuen Branch erstellen

eas update --branch Campaignadvertisement --message "Kampagnenwerbung integriert"Code-Sprache: JavaScript (javascript)

Einem Channel einen Branch zuweisen

channel:edit production –branch version-2.0

Dokumentation

Fehler in react-native-gesture-handler

NUR beim Ausführen der nativen App kommt es zu dem Fehler. Während der Entwicklung fällt der Fehler nicht auf.

Nachvollziehen kann man den Fehler, bevor man einen Releasbuild in der Expo-Cloud macht, auch schon durch einen lokalen Build. So spart man sich Zeit und vorallem Buildkontingent im Free-Plan von Expo.

Dafür macht man den Prebuild, startet das Projekt (.workspace-Datei !) in XCode und führt es am besten im Simulator aus. Dabei kommt es zu folgendem Fehler:

ERROR TypeError: Cannot read property 'dropGestureHandler' of nullCode-Sprache: JavaScript (javascript)

Der Stack in dem Fall dazu war:

This error is located at:
in PanGestureHandler (created by PanGestureHandler)
in PanGestureHandler (created by Card)
in RCTView (created by View)
in View
in Unknown (created by Card)
in RCTView (created by View)
in View (created by Card)
in Card (created by CardContainer)
in CardContainer (created by CardStack)
in RNSScreen
in Unknown (created by InnerScreen)
in Suspender (created by Freeze)
in Suspense (created by Freeze)
in Freeze (created by DelayedFreeze)
in DelayedFreeze (created by InnerScreen)
in InnerScreen (created by Screen)
in Screen (created by MaybeScreen)
in MaybeScreen (created by CardStack)
in RNSScreenContainer (created by ScreenContainer)
in ScreenContainer (created by MaybeScreenContainer)
in MaybeScreenContainer (created by CardStack)
in RCTView (created by View)
in View (created by Background)
in Background (created by CardStack)
in CardStack (created by HeaderShownContext)
in RNCSafeAreaProvider (created by SafeAreaProvider)
in SafeAreaProvider (created by SafeAreaInsetsContext)
in SafeAreaProviderCompat (created by StackView)
in RCTView (created by View)
in View (created by GestureHandlerRootView)
in GestureHandlerRootView (created by StackView)
in StackView (created by StackNavigator)
in PreventRemoveProvider (created by NavigationContent)
in NavigationContent
in Unknown (created by StackNavigator)
in StackNavigator (created by AppNavigator)
in EnsureSingleNavigator
in BaseNavigationContainer
in ThemeProvider
in NavigationContainerInner (created by AppNavigator)
in RCTView (created by View)
in View (created by AppNavigator)
in AppNavigator (created by Connect(AppNavigator))
in Connect(AppNavigator) (created by App)
in Provider (created by App)
in App (created by withDevTools(App))
in withDevTools(App)
in RCTView (created by View)
in View (created by AppContainer)
in RCTView (created by View)
in View (created by AppContainer)
in AppContainer
in main(RootComponent), js engine: hermes

Das Problem ist, dass die Expo-Mitinstallierte Version des Packages sich offensichtlich von der offiziellen Version unterscheidet. In dem Fall ist die Bibliothek React Navigation auch von dem Package abhängig und kommt mit der Expo-Version nicht klar.

LÖSUNG:

Unter node_modules den Ordner react-native-gesture-handler löschen und mit bspw. Yarn als Dependency hinzufügen:

yarn add react-native-gesture-handler

Expo – Tooling für lokal Build

Fastlane installieren

sudo gem install fastlane -NV

Fastlane in PATH für die jeweilige Shell aufnehmen

export PATH="/usr/local/bin/fastlane:$PATH"Code-Sprache: JavaScript (javascript)

iOS Plattform für XCode Kommandozeile installieren

xcodebuild -downloadPlatform iOS

Bauen der App über EAS

eas build --local --platform ios

Um einen Prebuild der App zu bauen (XCode Projekt) folgendes ausführen

npx expo prebuild --platform ios --clean

Expo – Debuggen von Releasebuilds

Das Problem mit der Fehlernachvollziehbarkeit bei Releasebuild ist, die Logs dazu auszulesen.
Dafür kann man aber unter iOS:

  • Das Device an den Mac anschließen
  • Die App Konsole öffnen
  • Das Device auswählen
  • Über die Suche den Namen der App für Prozesse eingeben
  • Die App starten und die Logs einsehen

Für Android

  • Das Device an den PC anschließen
  • Android Studio öffnen
  • Die App starten
  • Nach dem Namen der App filtern
  • Über LogCat die Logs auslesen

Expo Artikel dazu.

Expo JS EAS Workflow – Kompakt erklärt

In der EAS – Konfiguration eas.json im Projektverzeichnis werden grundlegend die Channels und deren
Eigenschaften festgelegt. Es werden die Profile „stage“ und „production“ festgelegt und welchen
Channels diese zuzuordnen sind. (Bspw. stage gehört zum Channel staging)

Wenn man nun ein Release in der EAS-Cloud bauen lässt, wird dieses automatisch dem jeweiligen Channel
zugeordnet.

Man kann Branches anlegen, diese einem Channel zuweisen, wiederum Updates einspielen und diese einem
Branch zuweisen. (Kette)

Somit ist man in der Lage einen Build, bspw. Production schnell auf einen vorigen Branch zurückzustellen.

Updates werden über den Branch in den zugewiesen Channels übertragen und OHNE neues Release
im Store sofort per Over The Air Update ausgerollt. Nutzer bekommen dieses Update automatisch
ausgeliefert.

Beispiel eas.json

{
  "cli": {
    "version": ">= 0.52.0"
  },
  "build": {
    "development": {
      "env": {
        "ENV": "development"
      },
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "env": {
        "ENV": "development"
      },
      "distribution": "internal"
    },
    "stage": {
      "env": {
        "ENV": "production"
      },
      "distribution": "internal",
      "channel": "staging"
    },
    "production": {
      "env": {
        "ENV": "production"
      },
      "channel": "production"
    }
  },
  "submit": {
    "production": {
      "ios": {
        "appleId": "APPLE_ID",
        "appleTeamId": "APPLE_TEAM_ID"
      }
    }
  }
}Code-Sprache: JSON / JSON mit Kommentaren (json)

EAS – Cheatsheet

Stage Release für Plattformen

eas build –profile stage –platform ios
eas build –profile stage –platform android

Production Release für Plattformen bauen

eas build –profile production –platform ios
eas build –profile production –platform android

Production Release für Plattformen veröffentlichen

eas submit –platform ios
eas submit –platform android

Over the air Update für alle Apps in Release-Channel „staging“

expo publish –release-channel staging

Ein neues Update mit einem neuen Branch erstellen

eas update –branch Campaignadvertisement –message „Kampagnenwerbung integriert“

Einem Channel einen Branch zuweisen

eas channel:edit production –branch version-2.0

DOC https://docs.expo.dev/eas-update/eas-cli/ und https://docs.expo.dev/eas-update/how-it-works/

Expo SDK 49 Update

Für das Upgrade eines bestehenden Projektes sollte man folgendem Guide folgen ExpoBlog

Wenn man die ReactNavigation implementiert hat, muss man die Bibliothek react-native-gesture-handler entfernen, da Expo diese selbst integriert hat und sonst mit folgender Fehlermeldung quittiert:

Tried to register two views with the same name RNGestureHandlerButtonCode-Sprache: JavaScript (javascript)

Deshalb folgende Vorgehensweise:

  • Alle laufenden Instanzen der App schließen
  • node_modules – Ordner löschen
  • package-lock.json löschen
  • react-native-gesture-handler aus package.json entfernen
  • npm i oder yarn ausführen
  • yarn start

Quelle Stackoverflow