expo / eas-cli

Fastest way to build, submit, and update iOS and Android apps
https://docs.expo.dev/eas/
MIT License
823 stars 84 forks source link

EAS Update: Failed to parse manifest data #1748

Open berilsanda opened 1 year ago

berilsanda commented 1 year ago

Build/Submit details page URL

https://expo.dev/accounts/hkgusti/projects/mobile-absensi/builds/5855f21e-4482-42f8-8cb8-a7a4aaff34ae

Summary

EAS Update didn't do any update on my phone

I have an internal build with channel "staging", this error came when

  1. I run npx eas build --profile staging --platform android
  2. Run npx eas update --branch staging --message "Update fix issue" (This update work perfectly)
  3. Since I want to do some new updates (add expo-image-loader) I run a new build with npx eas build --profile staging --platform android download the app and install it after uninstalling the previous app
  4. Do a small text changes update on a new branch npx eas update --branch staging_temp --message "Temp update"
  5. Move the channel update branch with npx eas channel:edit staging --branch staging_temp and get the message "Users with builds on channel staging will now receive the active update on staging_temp"

That way the update should be downloaded but it didn't. I tried to force quit and close open the app multiple times but it still didn't receive the update. image

I can find the new update, new branch on expo dev dashboard or by using npx branch/update:list, on my staging channel it says the linked branch is staging_temp image

I didn't do any changes to my project, app.json, or eas config/setting whatsoever I just run the build and update command. Tried to wait for an hour for the update to roll, even my previous build and the newest one happened in less than 30 minutes so I don't think it's some server problem

/// UPDATE ///

So it seems that I get "failed to download manifest error" while trying to fetch new update and when I try to open my update URL it says

"runtime-version" is not allowed to be empty. The headers "expo-runtime-version", "expo-channel-name", and "expo-platform" are required. They can also be set with the query parameters "runtime-version", "channel-name", and "platform".

even though I already set my runtime-version to

"runtimeVersion": {
      "policy": "nativeVersion"
    }

Managed or bare?

Managed

Environment

expo-env-info 1.0.5 environment info: System: OS: Windows 10 10.0.22000 Binaries: Node: 16.19.1 - C:\Program Files\nodejs\node.EXE Yarn: 1.22.19 - ~\AppData\Roaming\npm\yarn.CMD npm: 8.19.3 - C:\Program Files\nodejs\npm.CMD npmPackages: expo: ^43.0.0 => 43.0.5 react: 17.0.1 => 17.0.1 react-dom: 17.0.1 => 17.0.1 react-native: 0.64.3 => 0.64.3 react-native-web: 0.17.1 => 0.17.1 Expo Workflow: managed

expo doctor 🎉 Didn't find any issues with the project!

eas.json

{
  "cli": {
    "version": ">= 3.1.1"
  },
  "build": {
    "development": {
      "channel": "development",
      "developmentClient": true,
      "distribution": "internal"
    },
    "staging": {
      "channel": "staging",
      "distribution": "internal"
    },
    "production": {
      "channel":"production"
    }
  },
  "submit": {
    "production": {}
  }
}

Error output

No response

Reproducible demo or steps to reproduce from a blank project

See environment

mikkan-39 commented 1 year ago

Same here, expo 48

expo-env-info 1.0.5 environment info:
    System:
      OS: macOS 13.2.1
      Shell: 5.8.1 - /bin/zsh
    Binaries:
      Node: 16.13.0 - ~/.nvm/versions/node/v16.13.0/bin/node
      Yarn: 1.22.19 - /opt/homebrew/bin/yarn
      npm: 8.1.0 - ~/.nvm/versions/node/v16.13.0/bin/npm
      Watchman: 2023.03.13.00 - /opt/homebrew/bin/watchman
    Managers:
      CocoaPods: 1.11.3 - /usr/local/bin/pod
    SDKs:
      iOS SDK:
        Platforms: DriverKit 22.2, iOS 16.2, macOS 13.1, tvOS 16.1, watchOS 9.1
      Android SDK:
        API Levels: 30, 31, 33
        Build Tools: 29.0.2, 30.0.3, 31.0.0, 33.0.0
        System Images: android-33 | Google APIs ARM 64 v8a
    IDEs:
      Android Studio: 2021.3 AI-213.7172.25.2113.9014738
      Xcode: 14.2/14C18 - /usr/bin/xcodebuild
    npmPackages:
      expo: ^48.0.0 => 48.0.9 
      react: 18.2.0 => 18.2.0 
      react-dom: 18.2.0 => 18.2.0 
      react-native: 0.71.4 => 0.71.4 
    npmGlobalPackages:
      eas-cli: 3.8.1
      expo-cli: 6.3.2
    Expo Workflow: managed
quinlanj commented 1 year ago

Thanks for reporting this issue! In order of usefullness, here are some things you can provide to help us root cause the problem:

Very Helpful

A simple app where you’ve been able to reproduce this issue. Please share: 
- the app code
 
- links to your update. Also whether you are loading via ios or android 
- 
link to your build which you tried to load the update from


Somewhat Helpful

In your existing app, please share:

FRCassarino commented 1 year ago

Same here. @berilsanda did you figure out the issue? @mikkan-39

FRCassarino commented 1 year ago

@quinlanj In this image the link is gray:

image

Should it normally be blue? Is gray indicating something about the link is inactive?

berilsanda commented 1 year ago

@FRCassarino

Should it normally be blue? Is gray indicating something about the link is inactive?

I have another project with working eas update it show the same gray link image

Same here. @berilsanda did you figure out the issue? @mikkan-39

nope still got the issue,

@quinlanj

In your existing app, please share:

  • package.json at the time you made the build
  • package.json at the time you made the problematic update

sadly I can't attach more info from the time I created this thread since I tried to undo my expo SDK update, delete the build, channel, branch and recreate it multiple times

but since I still got the issues I will give more info that I get after some debugging process

following the debugging step Viewing network requests I get that my accept header is missing the multipart/mixed value so I decompile the apk using APK Studio and then add it to my AndroidManifest.xml by editing this line

<meta-data android:name="expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY" android:value="{&quot;expo-channel-name&quot;:&quot;preview&quot;}"/>

to

<meta-data android:name="expo.modules.updates.UPDATES_CONFIGURATION_REQUEST_HEADERS_KEY" android:value="{&quot;expo-channel-name&quot;:&quot;preview&quot;&#44;&quot;accept&quot;:&quot;application/expo+json, application/json, multipart/mixed&quot;}"/>

also I just want to make sure by Inspecting expo-updates configuration after prebuild that the properties on my AndroidManifest.xml are right since before upgrading to expo sdk 43 (previously my app is on expo sdk 42) my expo.modules.updates.EXPO_UPDATE_URL is still using the old https://exp.host/@hkgusti/mobile-absensi even thought I already use eas and my updates.url on app.json already set to "https://u.expo.dev/5f3dfd81-a98f-4031-b0ab-6df77e72c5b3"

after add the missing key on AndroidManifest.xml I still get the error but this time the error is different I tried to check adb logcat it seems that my update is failed to download and the problem for this Failed to parse manifest data error is this

04-19 15:12:47.150 17949 20801 E RemoteLoader: Failed to parse manifest data 04-19 15:12:47.150 17949 20801 E RemoteLoader: java.io.IOException: Manifest string is not a valid JSONObject or JSONArray: -------ExpoManifestBoundary-saFsqFEdRTOosSxVfA8X6w 04-19 15:12:47.150 17949 20801 E RemoteLoader: Content-Disposition: form-data; name="manifest" 04-19 15:12:47.150 17949 20801 E RemoteLoader: Content-Type: application/json 04-19 15:12:47.150 17949 20801 E RemoteLoader: 04-19 15:12:47.150 17949 20801 E RemoteLoader: {"id":"b1a... ---UPDATE FILE--- 04-19 15:12:47.150 17949 20801 E RemoteLoader: -------ExpoManifestBoundary-saFsqFEdRTOosSxVfA8X6w 04-19 15:12:47.150 17949 20801 E RemoteLoader: Content-Disposition: form-data; name="extensions" 04-19 15:12:47.150 17949 20801 E RemoteLoader: Content-Type: application/json 04-19 15:12:47.150 17949 20801 E RemoteLoader: 04-19 15:12:47.151 17949 20801 E RemoteLoader: {"assetRequ... ---UPDATE FILE--- 04-19 15:12:47.151 17949 20801 E RemoteLoader: at expo.modules.updates.loader.FileDownloader.extractUpdateResponseJson(FileDownloader.java:267) 04-19 15:12:47.151 17949 20801 E RemoteLoader: at expo.modules.updates.loader.FileDownloader.access$100(FileDownloader.java:36) 04-19 15:12:47.151 17949 20801 E RemoteLoader: at expo.modules.updates.loader.FileDownloader$2.onResponse(FileDownloader.java:114) 04-19 15:12:47.151 17949 20801 E RemoteLoader: at expo.modules.updates.loader.FileDownloader$4.onResponse(FileDownloader.java:242) 04-19 15:12:47.151 17949 20801 E RemoteLoader: at okhttp3.RealCall$AsyncCall.execute(RealCall.java:203) 04-19 15:12:47.151 17949 20801 E RemoteLoader: at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 04-19 15:12:47.151 17949 20801 E RemoteLoader: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 04-19 15:12:47.151 17949 20801 E RemoteLoader: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 04-19 15:12:47.151 17949 20801 E RemoteLoader: at java.lang.Thread.run(Thread.java:923) 04-19 15:12:47.151 17949 20801 E RemoteLoader: Caused by: org.json.JSONException: Value -------ExpoManifestBoundary-saFsqFEdRTOosSxVfA8X6w of type java.lang.String cannot be converted to JSONArray 04-19 15:12:47.151 17949 20801 E RemoteLoader: at org.json.JSON.typeMismatch(JSON.java:112) 04-19 15:12:47.151 17949 20801 E RemoteLoader: at org.json.JSONArray.(JSONArray.java:98) 04-19 15:12:47.151 17949 20801 E RemoteLoader: at org.json.JSONArray.(JSONArray.java:110) 04-19 15:12:47.151 17949 20801 E RemoteLoader: at expo.modules.updates.loader.FileDownloader.extractUpdateResponseJson(FileDownloader.java:258) 04-19 15:12:47.151 17949 20801 E RemoteLoader: ... 8 more 04-19 15:12:47.151 17949 20801 E LoaderTask: Failed to download remote update 04-19 15:12:47.151 17949 20801 E LoaderTask: java.io.IOException: Manifest string is not a valid JSONObject or JSONArray: -------ExpoManifestBoundary-saFsqFEdRTOosSxVfA8X6w 04-19 15:12:47.151 17949 20801 E LoaderTask: Content-Disposition: form-data; name="manifest" 04-19 15:12:47.151 17949 20801 E LoaderTask: Content-Type: application/json 04-19 15:12:47.151 17949 20801 E LoaderTask: 04-19 15:12:47.151 17949 20801 E LoaderTask: {"id" ---UPDATE FILE--- 04-19 15:12:47.152 17949 20801 E LoaderTask: -------ExpoManifestBoundary-saFsqFEdRTOosSxVfA8X6w-- 04-19 15:12:47.152 17949 20801 E LoaderTask: 04-19 15:12:47.152 17949 20801 E LoaderTask: at expo.modules.updates.loader.FileDownloader.extractUpdateResponseJson(FileDownloader.java:267) 04-19 15:12:47.152 17949 20801 E LoaderTask: at expo.modules.updates.loader.FileDownloader.access$100(FileDownloader.java:36) 04-19 15:12:47.152 17949 20801 E LoaderTask: at expo.modules.updates.loader.FileDownloader$2.onResponse(FileDownloader.java:114) 04-19 15:12:47.152 17949 20801 E LoaderTask: at expo.modules.updates.loader.FileDownloader$4.onResponse(FileDownloader.java:242) 04-19 15:12:47.152 17949 20801 E LoaderTask: at okhttp3.RealCall$AsyncCall.execute(RealCall.java:203) 04-19 15:12:47.152 17949 20801 E LoaderTask: at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 04-19 15:12:47.152 17949 20801 E LoaderTask: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 04-19 15:12:47.152 17949 20801 E LoaderTask: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 04-19 15:12:47.152 17949 20801 E LoaderTask: at java.lang.Thread.run(Thread.java:923) 04-19 15:12:47.152 17949 20801 E LoaderTask: Caused by: org.json.JSONException: Value -------ExpoManifestBoundary-saFsqFEdRTOosSxVfA8X6w of type java.lang.String cannot be converted to JSONArray 04-19 15:12:47.152 17949 20801 E LoaderTask: at org.json.JSON.typeMismatch(JSON.java:112) 04-19 15:12:47.152 17949 20801 E LoaderTask: at org.json.JSONArray.(JSONArray.java:98) 04-19 15:12:47.152 17949 20801 E LoaderTask: at org.json.JSONArray.(JSONArray.java:110) 04-19 15:12:47.152 17949 20801 E LoaderTask: at expo.modules.updates.loader.FileDownloader.extractUpdateResponseJson(FileDownloader.java:258) 04-19 15:12:47.152 17949 20801 E LoaderTask: ... 8 more

the update file can be accessed on update from u.expo.dev


Also, I have another project with the same issue old expo project tried to upgrade to eas -> can't receive update from eas

but when I tried to recreate the app on a new project with 100% same code it can receive the update just fine I wonder if migrating from the old expo project to eas mostly give this kind of error (maybe eas update file can't be received or parsed on old expo-updates dependencies?)

jp928 commented 1 year ago

Same here. Any workaround is appreciated.

jp928 commented 1 year ago

I figured it out. In the app.config.js u have to specify

 requestHeaders: {
        "expo-runtime-version": xxx,
        "expo-channel-name": xxx
      },
berilsanda commented 1 year ago

I figured it out. In the app.config.js u have to specify

 requestHeaders: {
        "expo-runtime-version": xxx,
        "expo-channel-name": xxx
      },

where did u put it on app config? i tried it on app json as this docs state but it give me error when i build the app

EDIT: figure it out where to add but it still give me failed to parse manifest data 😔 even adding useClassicUpdates still give an error

hssdiv commented 1 year ago

I figured it out. In the app.config.js u have to specify

 requestHeaders: {
        "expo-runtime-version": xxx,
        "expo-channel-name": xxx
      },

Thanks, it worked for me. Earlier I had specified expo.runtimeVersion as "1.0.0", maybe that's why it was failing without expo.updates.requestHeaders.expo-runtime-version: "1.0.0"

or maybe because I'm using dynamic app.json aka app.config.js