├── .gitignore ├── README.md ├── aapt-png-crunch.md ├── absolute-path-expo-modules.md ├── advice-dont-ask-about-solutions.md ├── advice-dont-ask-to-ask.md ├── advice-dont-wait-to-ask.md ├── already-on-app-stores.md ├── android-071-rc-build-failure.md ├── android-app-size.md ├── android-navigation-bar-visible-deprecated.md ├── android-package.md ├── android-r.md ├── android-reset-keystore.md ├── apns-entitlement-sdk-51.md ├── apple-2fa-sms-issues-workaround.md ├── apple-app-specific-password.md ├── apple-team.md ├── asc-app-id.md ├── asc-issuer-id.md ├── assets ├── android-r │ ├── ask_for_dir_permissions.png │ ├── background_permissions_modal.png │ ├── foreground_permissions_modal.png │ └── modifying_media_request.PNG ├── android-reset-keystore │ └── playstore-console-reset-key.png ├── apple-team │ ├── membership-details.png │ └── membership-tab.png ├── asc-app-id │ └── finding-app-id.png ├── asc-issuer-id │ ├── 01-open-app-store-connect-portal.png │ └── 02-issuer-id.png ├── bumping-android-version-code │ ├── 01-bumping-android-version-code.png │ ├── 02-upload-with-submission-service.png │ └── 03-check-release-page.png ├── bumping-ios-build-number │ ├── 01-bumping-ios-build-number.png │ ├── 01b-bumping-in-xcode.png │ ├── 02-submitting.png │ └── 03-check-asc-page.png ├── creating-asc-api-key │ ├── 01-open-app-store-connect-portal.png │ ├── 02-big-plus-button.png │ ├── 03-key-fields.png │ ├── 04-download-key.png │ └── 05-other-info.png ├── creating-google-service-account │ ├── 01-new-google-cloud-project.png │ ├── 02-service-accounts.png │ ├── 03-create-service-account.png │ ├── 04-manage-keys.png │ ├── 05-create-new-key.png │ ├── 06-key-type.png │ ├── 07-key-saved.png │ ├── 08-play-developer-api.png │ ├── 09-users-permissions.png │ ├── 10-invite-user.png │ ├── 11-set-permissions.png │ ├── 12-copy-service-account-email.png │ ├── 13-select-existing-service-account.png │ ├── 14-create-new-key.png │ ├── 15-select-json-key-type.png │ └── 16-service-key-created.png ├── delete-build │ └── delete-build.png ├── expo-modules-migration │ └── xcode-iphoneos-deployment-target.png ├── first-android-submission │ ├── 01-open-google-play-console.png │ ├── 02-create-application.png │ ├── 03-dashboard.png │ ├── 04-steps.png │ ├── 05-create-email-list.png │ ├── 05-testing.png │ ├── 06-create-release.png │ ├── 07-google-app-signing.png │ ├── 08-upload-aab-archive.png │ ├── 09-view-version-code.png │ ├── 10-submit-first-release.png │ ├── 11-release-summary.png │ ├── 12-testers-copy-link.png │ └── 13-pending-tasks.png ├── missing-privacy-policy │ ├── 01-privacy-policy-error.png │ ├── 02-open-google-play-console.png │ ├── 03-app-content.png │ ├── 04-privacy-policy-form.png │ ├── 05-internal-releases.png │ ├── 06-release-summary-2.png │ └── 06-release-summary.png ├── splash-screen-hanging │ └── error-console.png ├── sso-setup-general │ └── 01-expo-org.png ├── sso-setup-google-ws │ ├── 01-select-new-project.png │ ├── 02-oauth-consent-screen.png │ ├── 03-select-user-type.png │ ├── 04-enter-required-app-info.png │ ├── 05-add-domain-and-enter-contact.png │ ├── 06-click-add-scopes.png │ ├── 07-select-scopes.png │ ├── 08-complete-scope-selection.png │ ├── 09-go-to-create-credentials.png │ ├── 10-select-oauth2-client-id.png │ ├── 11-select-web-application-type.png │ ├── 12-complete-client-configuration.png │ ├── 13-to-access-credentials.png │ └── 14-credentials-shown-on-right.png ├── sso-setup-microsoft │ ├── 01-app-registrations.png │ ├── 02-new-registration.png │ ├── 03-register-new-app.png │ ├── 04-authentication.png │ ├── 04-new-platform.png │ ├── 05-configure-web.png │ ├── 06-add-redirect-uri.png │ ├── 07-api-permissions.png │ ├── 08-add-permissions.png │ ├── 09-microsoft-graph.png │ ├── 10-openid-permissions.png │ ├── 11-owners.png │ ├── 12-add-owners.png │ ├── 13-overview.png │ ├── 14-add-a-secret.png │ ├── 15-new-secret.png │ ├── 16-entra-id.png │ ├── 17-users.png │ ├── 18-open-a-user.png │ ├── 19-client-and-tenant-id.png │ ├── 20-enterprise-applications.png │ ├── 21-enterprise-application.png │ ├── 22-assign-users-and-groups.png │ ├── 23-users-assigned.png │ ├── 24-id-token-set.png │ ├── 25-user-read-scope.png │ └── config-flag-migration.md ├── sso-setup-okta │ ├── 01-applications-menu.png │ ├── 02-create-app-integration.png │ ├── 03-oidc-web-app.png │ ├── 04-auth-code-option.png │ ├── 05-redirect-uris.png │ ├── 06-assignments.png │ ├── 07-client-id.png │ └── 08-subdomain.png └── sso-setup-onelogin │ ├── 01-applications-menu.png │ ├── 02-add-app.png │ ├── 03-find-oidc.png │ ├── 04-display-name.png │ ├── 05-redirect-uris.png │ ├── 06-users.png │ ├── 07-application.png │ └── 08-sso-tab.png ├── auth-proxy-migration.md ├── authorize-android-device.md ├── barcode-scanner-to-expo-camera.md ├── black-screen-before-splash.md ├── bumping-android-version-code.md ├── bumping-ios-build-number.md ├── bundle-identifier.md ├── creating-asc-api-key.md ├── creating-google-service-account.md ├── credentials-non-interactive.md ├── cryptic-error-eas.md ├── delete-build.md ├── deprecated-globals.md ├── deprecating-ar.md ├── dev-client.md ├── eas-build-archive.md ├── eas-build-queues.md ├── eas-config-mismatch.md ├── eas-json.md ├── eas-patch-package.md ├── eas-project-id.md ├── eas-update-asset-limits.md ├── eas-update-config.md ├── eas-update-missing-headers.md ├── eas-update-rollouts.md ├── eas-update.md ├── eas-vcs-workflow.md ├── edge-to-edge-system-bars.md ├── embedded-assets.md ├── enabling-web-service-workers.md ├── expo-app-auth-deprecated.md ├── expo-extension-migration.md ├── expo-go-usage.md ├── expo-module-local-autolinking.md ├── expo-modules-gradle8-migration.md ├── expo-modules-migration.md ├── expo-sdk-xcode-compatibility.md ├── expo-updates-config.md ├── expo-upload-android.md ├── expo-upload-ios.md ├── face-detector-removed.md ├── fb-batched-bridge-config-web.md ├── firebase-js-auth-setup.md ├── firebase-migration-guide.md ├── first-android-submission.md ├── hermes-android-config.md ├── hermes-ios-config.md ├── intel-to-m1.md ├── ipad-requires-fullscreen.md ├── its-not-working.md ├── javascript-bundle-sizes.md ├── legacy-notifications-to-expo-notifications.md ├── macos-ignorecase.md ├── managed-app-size.md ├── manifest-url.md ├── manual-debugging.md ├── missing-privacy-policy.md ├── no-registered-application.md ├── outdated-sdk-versions.md ├── payments-migration-guide.md ├── prebuild-cleanup.md ├── prebuild-without-npm-access.md ├── prebuilding.md ├── prebuilt-modules.md ├── presenting-notifications-deprecated.md ├── project-page.md ├── provisioning-profile-missing-capabilities.md ├── react-native-releases.md ├── redirects ├── dev-build ├── disable-bundle-resource-signing ├── edge-to-edge-rollout └── sdk-44-remove-unimodules ├── release-builds-with-expo-updates.md ├── remove-alpha-channel.md ├── root-expo-object.md ├── router-navigation-deps.md ├── sentry-expo-migration.md ├── setup-android-uri-scheme.md ├── setup-xcode-signing.md ├── splash-screen-hanging.md ├── sso-setup-google-ws.md ├── sso-setup-microsoft.md ├── sso-setup-okta.md ├── sso-setup-onelogin.md ├── start.md ├── subscribing-to-app-events.md ├── troubleshooting-sdk-upgrades.md ├── unverified-app-expo-go.md ├── webpack-report-property-is-deprecated.md ├── whats-in-the-sdk.md ├── why-constants-expoconfig.md ├── wsl.md └── xcode-env-local.md /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | **/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # expo.fyi 2 | 3 | **tl;dr:** it's a tool to link people to markdown files in [https://github.com/expo/fyi](https://github.com/expo/fyi) with a concise and pretty link. For example, [https://expo.fyi/bundle-identifier](https://expo.fyi/bundle-identifier) 4 | 5 | ## What is it? 6 | 7 | This website is a useful URL shortener that redirects users to a markdown file on the [https://github.com/expo/fyi](https://github.com/expo/fyi) repository. For example, [https://expo.fyi/bundle-identifier](https://expo.fyi/bundle-identifier) will redirect the user to [https://github.com/expo/fyi/blob/master/bundle-identifier.md](https://github.com/expo/fyi/blob/master/bundle-identifier.md). 8 | 9 | It is useful to remove any friction to create a shareable link to a persistent explanation of some piece of knowledge that is useful to developers using Expo tools. 10 | 11 | ## Why might I want to use this? 12 | 13 | Imagine that you're working on [Expo CLI](https://docs.expo.dev/more/expo-cli/) and want to add more context on some terminology that you are using in a prompt to the user. Maybe you need to ask them for a "bundle identifier". You want to make sure that the user has easy access to more information about what that means, but you don't want to inline a whole explanation of it and crowd the interface. At the same time, you can't be bothered to create a docs page for this, or maybe the existing docs page doesn't provide the most relevant context for the situation the user is in. That's understandable. So instead let's just create an FYI! 14 | 15 | ## How do I create an FYI? 16 | 17 | - Go to [https://github.com/expo/fyi](https://github.com/expo/fyi). 18 | - Click "Create a new file". 19 | - Pick a name for it and include the `.md` extension. If you are teaching people about the "tunnel" connection type in expo-cli, maybe you want to call it `tunnel-connection.md` and then the URL will be [https://expo.fyi/tunnel-connection](https://expo.fyi/tunnel-connection). 20 | 21 | ## FYI 22 | 23 | - You can add any arbitrary string like `this-does-not-exist` to the URL and it will just bring you to the GitHub 404 pages: [https://expo.fyi/this-does-not-exist](https://expo.fyi/this-does-not-exist). You probably do not want to do this, so instead create a file and link to it, and don't delete the file if it's linked to from somewhere already. 24 | - If you go to [https://expo.fyi](https://expo.fyi) it will just redirect you to the GitHub repo. 25 | - You can create your own domain like this by cloning [https://github.com/expo/expo-fyi](https://github.com/expo/expo-fyi) — a small service that you can deploy to, for example, Vercel or Netlify. Customize the URLs it uses in [index.js](https://github.com/expo/expo-fyi/blob/master/index.js). 26 | -------------------------------------------------------------------------------- /aapt-png-crunch.md: -------------------------------------------------------------------------------- 1 | # Android App Packaging Tool (AAPT2) and PNG optimization 2 | 3 | Android Gradle Plugin (AGP) will automatically run PNG Crunch to losslessly compress PNG images during release builds of your app, as part of the AAPT2 packaging process. 4 | 5 | ## Common problems 6 | 7 | ### Build errors when processing .png files that not actually PNGs 8 | 9 | In some cases, developers may end up with **.png** files that are actually JPEG files, or some other file type. When PNG Crunch attempts to compress these files, it will error and the build will fail. The error message will look something like this: 10 | 11 | ``` 12 | ERROR:/home/expo/workingdir/build/android/app/build/generated/res/createBundleReleaseJsAndAssets/drawable-mdpi/image.png: AAPT: error: file failed to compile. 13 | ``` 14 | 15 | To fix this, you can either delete the offending file, or convert it to a PNG file. 16 | 17 | ### Inflating file size by processing compressed PNG files 18 | 19 | If you are already performing your own PNG optimization in advance of your build (which you may be doing in order to ensure the best possible compression and that the PNGs are also optimized for web and iOS), then running the files through PNG Crunch again may result in larger file sizes ([source](https://developer.android.com/topic/performance/reduce-apk-size#groovy)). 20 | 21 | ## Disabling PNG Crunch 22 | 23 | You can disable it by setting `enablePngCrunchInReleaseBuilds` to `false` on [the `android` config in expo-build-properties](https://docs.expo.dev/versions/latest/sdk/build-properties/#pluginconfigtypeandroid). 24 | 25 | ```json 26 | { 27 | "name": "my-app", 28 | "plugins": [ 29 | [ 30 | "expo-build-properties", 31 | { 32 | "android": { 33 | "enablePngCrunchInReleaseBuilds": false 34 | } 35 | } 36 | ] 37 | ] 38 | } 39 | ``` 40 | 41 | Alternatively, if you do not use [CNG](https://docs.expo.dev/workflow/continuous-native-generation/), you can make the following change to your `android/app/build.gradle` file: 42 | 43 | ``` 44 | android { 45 | // ...existing configuration 46 | 47 | buildTypes { 48 | release { 49 | // ... existing configuration 50 | 51 | pngCrunch false 52 | } 53 | } 54 | } 55 | ``` 56 | -------------------------------------------------------------------------------- /absolute-path-expo-modules.md: -------------------------------------------------------------------------------- 1 | # Using absolute import paths with local Expo Modules 2 | 3 | **When importing an Expo module created using `npx create-expo-module --local`**: 4 | 5 | You can use an absolute import path in place of a regular relative import: 6 | 7 | `import module from "my-module";`, 8 | 9 | 10 | To do this you need to include the `paths.*` wildcard in [your tsconfig file](https://www.typescriptlang.org/tsconfig#paths). 11 | > 12 | ```tsconfig.json 13 | { 14 | "compilerOptions": { 15 | "paths": { 16 | "*": ["./modules/*"] 17 | } 18 | }, 19 | "extends": "expo/tsconfig.base" 20 | } 21 | ``` 22 | 23 | And change the `metro.config.js` file to the following: 24 | 25 | ```metro.config.js 26 | // Learn more https://docs.expo.io/guides/customizing-metro 27 | const { getDefaultConfig } = require("expo/metro-config"); 28 | const path = require("path"); 29 | 30 | const defaultConfig = getDefaultConfig(__dirname); 31 | 32 | defaultConfig.resolver.nodeModulesPaths = [ 33 | ...defaultConfig.resolver.nodeModulesPaths, 34 | path.resolve(__dirname, "modules"), 35 | ]; 36 | module.exports = defaultConfig; 37 | 38 | ``` 39 | -------------------------------------------------------------------------------- /advice-dont-ask-about-solutions.md: -------------------------------------------------------------------------------- 1 | # Don't ask about solutions[^1] 2 | 3 | You may have been sent this document because **you asked about solutions** to a problem, rather than the problem itself, or without explaining your original problem. 4 | This is called ["The XY Problem"](https://en.wikipedia.org/wiki/XY_problem) 5 | 6 | > [!TIP] 7 | > **tl;dr:** don't ask "Why is `` not working?", but rather ask: 8 | > - "How do I solve `` given ``?" 9 | > - "I tried `` because of `` while working on ``. What is an alternative solution?" 10 | > - "I ran into ``, when trying to do ``. What's happening and what's a possible solution?" 11 | 12 | We often encounter problems that appear to have multiple, possible solutions. These solutions themselves however could cause more problems, which in turn have multiple solutions, which in turn may cause more problems... 13 | 14 | You may have asked a question that mostly consists of what you tried or what you're trying to do, rather than giving context on **why it is you think you have to do this in the first place**. For example, 15 | 16 | > User A: "How do I replace the display on my iPhone?"
17 | > User B: "Do this and that"
18 | > User C: "Why do you need to replace the display?"
19 | > User A: "Because my iPhone screen is too dark to read."
20 | > User C: "That's weird. Make sure to check the display brightness settings!"
21 | > User A: "Ah, thank you, that fixed it!" 22 | 23 | Leading into conversations with an assumed solution leads to wasted time and energy, both for you and those trying to help you. 24 | If you come to someone with a solution rather than the problem, you're denying them: 25 | - the chance to evaluate if your solution may solve the problem 26 | - the context on why this problem occurred and what you did 27 | - reproduction steps that they may recognize 28 | 29 | In the best case scenario, you may have mentioned your original problem, but spent more time describing the solution. **Instead, explain how you ran into the problem, and set your solution aside, so others have a chance to arrive at the same point you did.** 30 | 31 | In the worst case scenario, you may have completely omitted information on your original problem, and you may have been sent this document because the issue you posted above hints at another problem. **Instead, explain the context of what you did before you started working on what you posted about.** 32 | 33 | If you're not sure what to ask about, think back of when you started your task, and explain: 34 | > I started to work on `` and wanted to achieve ``. 35 | > Instead of ``, I encountered ``. 36 | 37 | If you talk about your original goals and problems rather than your later solutions, you're telling others the full story of what happened and you may save yourself and them some time having to hunt down where your problem originally started. 38 | 39 | [^1]: This document was inspired by https://xyproblem.info/ 40 | -------------------------------------------------------------------------------- /advice-dont-ask-to-ask.md: -------------------------------------------------------------------------------- 1 | # Don't ask to ask[^1] 2 | 3 | You may have been sent this document because **you asked to ask** a question, such as: 4 | 5 | > You: Can someone message me about React Native?
6 | > You: Can anyone help me with Expo Updates?
7 | > You: Does anyone know about Swift UI with Expo? 8 | 9 | These questions aren't particularly productive and don't often lead to others being able to help you. 10 | 11 | > [!TIP] 12 | > **tl;dr:** don't ask "Does anyone know about ``?", but rather ask: 13 | > - "How do I solve `` given ``?" 14 | > - "Why is `` occurring when I do ``?" 15 | > - "What do I do when I see ``, after I've done ``?" 16 | 17 | There are plenty of reasons why people who otherwise would help you, may not be able to or may not commit to replying to you. If you ask to ask, you're omitting information about your problem or question, since you haven't formalized it. You are instead asking for something more broad and a large commitment from strangers. 18 | 19 | Questions like the above cause conflict and problems because they: 20 | - ask others to take responsibility to take the lead 21 | - question people's confidence and knowledge 22 | - wall out people who might be able to answer your question 23 | - ask for someone's undivided attention in real time 24 | - prompt people to commit to interviewing you to figure out your real question 25 | - obscure any replies, which prevents it from being useful to other people 26 | 27 | Others might see this as you not having done the work to diagnose your problem - and conclude that if _you_ didn't make any effort, why should _they_ now have to put in all the work to help solve the problem for you. 28 | 29 | **Instead, take the time to form a question please.** 30 | 31 | The solution to the problem is not to ask to ask, but just to ask. Someone may see your question, and if they have an idea or recognize the problem, you are much more likely to get a reply. 32 | 33 | **If you're not sure what to ask, describe your issue.** 34 | 35 | For example: 36 | 37 | > Can someone help me with ``?
38 | > I'm seeing ``, I've tried ``,
39 | > but instead of ``, I get ``. 40 | 41 | Instead of leaving a message that only asks about a subject or topic, try describing your issue, even if you don't know what question to ask. If people recognize your problem or are interested in it, they are much more likely to help you, than if you had asked to ask. 42 | 43 | [^1]: This document was inspired by https://dontasktoask.com/ 44 | -------------------------------------------------------------------------------- /advice-dont-wait-to-ask.md: -------------------------------------------------------------------------------- 1 | # Don't wait to ask[^1] 2 | 3 | You may have been sent this document because **you waited to ask** a question, such as: 4 | 5 | > You: Hi
6 | > You: Anyone got a second?
7 | > You: Quick question.
8 | > You: `@someone`? 9 | 10 | In asynchronous messaging, this is similar to calling someone, then putting them on hold after they pick up. If you prompt someone to respond before asking your question, you won't get an answer sooner but are instead asking for someone's attention. 11 | 12 | > [!TIP] 13 | > **tl;dr:** don't wait to ask your question or wait for someone to respond, but rather 14 | > write your question immediately. 15 | 16 | Not writing your question in the first message causes conflict and problems because: 17 | - no one may respond, since they can't prioritize your message 18 | - someone may respond while you won't be there to ask your question 19 | - someone is prompted to give you their full attention to wait for your question 20 | 21 | You may have done this with good intentions, tried to be polite, wanted to ease someone into your question, or introduce yourself before jumping into a request or asking for someone to commit to helping you - like one would in person or on the phone? Your intentions are admirable, but online chats and forums have different etiquette. 22 | 23 | By asking to ask, instead of letting someone respond in their own time, you're making them acknowledge your message first, then wait for you to phrase your question, which is lost time for both you and the person responding (and that's frustrating for everyone). 24 | 25 | **Instead, just ask your question.** 26 | 27 | If you ask a question rather than asking for attention first, it's much more likely for someone to see your question or problem, and leave a quick reply. In chats, since messages can be read at any time and don't require someone's immediate attention, this makes sure chats stay asynchronous. 28 | 29 | **If you feel it's rude to simply ask a question, combine your question with an introduction.** 30 | 31 | > You: Hi everyone, I'm ``! What command do I run to upgrade to the new Expo SDK? 32 | 33 | If you ask a question immediately, there's nothing stopping you from combining it with the introduction you originally wanted to write first - like a letter. This not only gives you time to formulate and write about your question or issue before others see it, it also allows you to introduce yourself. 34 | 35 | [^1]: This document was inspired by https://nohello.net/en/ 36 | -------------------------------------------------------------------------------- /already-on-app-stores.md: -------------------------------------------------------------------------------- 1 | # Replacing your existing app on the app stores 2 | 3 | If you have a new version of your app built with Expo tools and you'd like to replace your existing app on the app stores with it, here's a simple guide to help you through the process. 4 | 5 | ## iOS 6 | 7 | 1. **Configure bundle identifier:** 8 | 9 | - Ensure your Expo app uses the same [bundle identifier](https://docs.expo.dev/versions/latest/config/app/#bundleidentifier) as your existing App Store listing. 10 | 11 | 2. **Build and deployment:** 12 | 13 | - If you're using EAS Build, then you can build and let automatic credential management use the rest. If you're not, then you can reuse whatever your previous deployment process was. 14 | 15 | ## Android 16 | 17 | 1. **Configure application identifier:** 18 | 19 | - Ensure your Expo app uses the same application identifier ([`package` in app config](https://docs.expo.dev/versions/latest/config/app/#package)) as your existing Play Store listing. 20 | 21 | 2. **Signing the app using existing keystore:** 22 | 23 | - Ensure that you sign your Android app using your existing keystore. If you're using EAS Build, you can learn more about how to do that in the ["Use existing credentials" guide](https://docs.expo.dev/app-signing/existing-credentials/). 24 | 25 | ## Other considerations 26 | 27 | You may want to consider how to migrate your application data. This may require [writing a native module](https://docs.expo.dev/modules/overview/) to be able to read it and write it to a new location / format. For example, to ensure users remain authenticated. -------------------------------------------------------------------------------- /android-071-rc-build-failure.md: -------------------------------------------------------------------------------- 1 | # Android build errors after React Native 0.71-rc release 2 | 3 | On November 4, 2022, React Native 0.71-rc was released, which introduced an issue for projects using libraries that depend on `'com.facebook.react:react-native:+'`. **This impacted Android builds across every version of React Native**. 4 | 5 | There is no single error message that will surface in every project when this happens. If you are using react-native-reanimated, you may see the following: 6 | 7 | ``` 8 | [stderr] /home/expo/workingdir/build/workspaces/app/node_modules/react-native-reanimated/android/src/main/java/com/swmansion/reanimated/layoutReanimation/ReanimatedUIManager.java:38: error: no suitable constructor found for UIManagerModule(ReactApplicationContext,List,ReaUiImplementationProvider,int) 9 | [stderr] super( 10 | [stderr] ^ 11 | [stderr] constructor UIManagerModule.UIManagerModule(ReactApplicationContext,ViewManagerResolver,int) is not applicable 12 | [stderr] (actual and formal argument lists differ in length) 13 | [stderr] constructor UIManagerModule.UIManagerModule(ReactApplicationContext,List,int) is not applicable 14 | [stderr] (actual and formal argument lists differ in length) 15 | ``` 16 | 17 | **If you use prebuild on EAS Build** (ie: you don't have commit `ios` and `android` directories to Git) then this regression has already been resolved for you, and no action is required. If you encountered this error when building on November 4th, then run your build again. 18 | 19 | **If you have a bare project**, then you can either regenerate your `android` directory with `prebuild` or you can manually apply the following patch to your `android/build.gradle`: 20 | 21 | ```diff 22 | +def REACT_NATIVE_VERSION = new File(['node', '--print', "JSON.parse(require('fs').readFileSync(require.resolve('react-native/package.json'), 'utf-8')).version"].execute(null, rootDir).text.trim()) 23 | + 24 | allprojects { 25 | + configurations.all { 26 | + resolutionStrategy { 27 | + force "com.facebook.react:react-native:" + REACT_NATIVE_VERSION 28 | + } 29 | + } 30 | + 31 | repositories { 32 | mavenLocal() 33 | maven { 34 | ``` 35 | 36 |
37 | 38 | - Curious for more details? See [facebook/react-native/issues/35204](https://github.com/facebook/react-native/issues/35204) for discussion about this issue. 39 | -------------------------------------------------------------------------------- /android-app-size.md: -------------------------------------------------------------------------------- 1 | # Android app size 2 | 3 | Let's address a common question: a developer runs a build for a simple app and then looks at the resulting artifact and asks "why is my app 50mb? That's huge!" 4 | 5 | The reason is that **this is not actually the size of your app as it will be distributed on the Google Play Store** (or other stores). Learn more about why this is the case and how to get a more accurate picture of your app's size. 6 | 7 | ## APKs (Android Packages) 8 | 9 | When you build an APK with Gradle in a React Native project, the default behavior is to create a universal binary, which contains all the resources for all the different device types that your app supports. For example, it includes asset for every screen size, every CPU architecture, and every language, even though a single device will only need one of each. This means you can share this one file with anybody to install directly to their device, perhaps with [Orbit](https://expo.dev/orbit) or `adb` directly, and that will work. 10 | 11 | Of course, if you're running an incredibly popular app store that serves millions of users, you don't want to send the same 50 MB file to every single user, especially if they're only going to use a fraction of the resources in the APK. This is why the Google Play Store and other app stores have a feature called "App Bundles" (Android) that allows you to upload a single binary and then the store will generate a custom binary for each user based on their device's needs. 12 | 13 | ## AABs (Android App Bundles) 14 | 15 | On Android, all new apps submitted to the Play Store must be built as an [Android App Bundle (.aab)](https://developer.android.com/platform/technology/app-bundle). Only once you have submitted the binaries to their respective stores will you be able to see the download size for various different device types. 16 | 17 | ## "So how big is my app?" 18 | 19 | Typically, what app developers care about the "download size" on the Play Store (what the users see in the store listing when they go to download the app). This will be the size of the APK that Google Play generates from your AAB, which is tailored to the user's device. This is the size that users will see when they go to download your app. 20 | 21 | The only truly accurate way to see what your final app size will be shipped to users is to upload your app to the stores and download on a physical device. Google Play also provides a reliable estimate for the expected download size on your developer dashboard. 22 | 23 | ## FAQ 24 | 25 | ### Why did my APK size increase after upgrading to React Native 0.73? 26 | 27 | React Native 0.73, which is used in Expo SDK 50, bumped the Android `minSdkVersion` to `23`. This had the side effect of changing the default value of [`extractNativeLibs`](https://developer.android.com/guide/topics/manifest/application-element#extractNativeLibs`) to `false`. 28 | 29 | > If set to "false", your native libraries are stored uncompressed in the APK. Although your APK might be larger, your application loads faster because the libraries load directly from the APK at runtime. 30 | 31 | The following table shows that while the APK size increased, which may slightly impact download time for testers with [internal distribution](https://docs.expo.dev/build/internal-distribution/), the Google Play Store size remained the same. 32 | 33 | | SDK | APK (debug variant) | APK (release variant) | AAB | Google Play | 34 | |-----|---------------------|-----------------------|---------|-------------| 35 | | 49 | 66 MB | 27.6 MB | 28.2 MB | 11.7 MB | 36 | | 50 | 168.1 MB | 62.1 MB | 27.4 MB | 11.7 MB | 37 | 38 | If you would like to revert to the previous behavior, you can set `useLegacyPackaging` to `true` in your **gradle.properties** or by using [`expo-build-properties`](https://docs.expo.dev/versions/latest/sdk/build-properties/). 39 | -------------------------------------------------------------------------------- /android-package.md: -------------------------------------------------------------------------------- 1 | # Android Package 2 | 3 | A unique id for your application using [reverse domain name notation](https://en.wikipedia.org/wiki/Reverse_domain_name_notation). The package for the Expo client app is `host.exp.exponent`, but it could also be `io.expo.client` or any other unique string that follows this notation. You don't need to own the domain to use the package. The package name also determines the path for your source files inside of your project. 4 | 5 | To set the package name in your Expo app, follow the instructions [here](https://docs.expo.dev/versions/latest/config/app/#package). 6 | -------------------------------------------------------------------------------- /android-reset-keystore.md: -------------------------------------------------------------------------------- 1 | # Resetting your Android Upload key 2 | ## Background 3 | [Google Play App Signing](https://support.google.com/googleplay/android-developer/answer/9842756?hl=en) is a security service where Google manages the app signing key on behalf of you as a developer. All newer apps (and many others) that are live on the Play Store are opted into Play App Signing. 4 | 5 | With Play App Signing, Google maintains the signing key used to verify that your app is authentic. Meanwhile, when your app is built, it is signed with a separate "Upload key". Google Play checks your upload key when you are going to publish your app to ensure the app binary is from you. If you lose this key, as long as you still have access to your Play Store account, you can reset it and continue publishing your app. 6 | 7 | ## Reset your key with EAS-managed credentials 8 | Google provides the most up-to-date information on how to reset your key in their [Play Console Help section on Play App Signing](https://support.google.com/googleplay/android-developer/answer/9842756?visit_id=637973748658459850-3395295471&rd=1#reset), so be sure to consult that if you have any questions. However, the process is generally a little easier if you use EAS to manage your Android app credentials because the EAS CLI can create the new upload keystore for you. 9 | 10 | ### Generate a new Upload keystore 11 | 1. Run `eas credentials`. 12 | 2. Choose "Android". 13 | 3. Choose the correct build profile, generally your "production" build profile. 14 | 4. Choose the "Keystore: Manage everything needed to build your project" option. 15 | 5. Delete your old keystore. 16 | 6. Choose "Set up a new keystore". 17 | 7. Finally, choose "Download existing keystore" to download the latest keystore you have created in the previous step. This will display fingerprint info for your keystore and download a **.jks** file at the root of your project directory. 18 | 19 | ### Reset your upload key on the Play Store 20 | These directions can change at Google's discretion, so it is always best to check [their latest instructions](https://support.google.com/googleplay/android-developer/answer/9842756?visit_id=637973748658459850-3395295471&rd=1#reset). As of November 2023, you can reset your upload key via an option under your app in the Play Store Console: 21 | [](./assets/android-reset-keystore/playstore-console-reset-key.png) 22 | -------------------------------------------------------------------------------- /apns-entitlement-sdk-51.md: -------------------------------------------------------------------------------- 1 | # Change to APNS entitlement handling in SDK 51 2 | 3 | Prior to SDK 51, Expo prebuild was automatically adding the Apple push notification entitlement for all iOS apps built with the Expo SDK. 4 | 5 | In response to customers who are not using notifications, and who did not want this entitlement added, we [modified the Expo prebuild code](https://github.com/expo/expo/pull/27924) so that the APNS entitlement is only added automatically if the app has the `expo-notifications` package installed. 6 | 7 | Since the APNS entitlement is no longer always present, this will lead to a warning when submitting an app to the App Store. _Note that this is a warning only, and will not cause the app to be rejected._ Example message: 8 | 9 | > Your app appears to register with the Apple Push Notification service, but the app signature's entitlements do not include the "aps-environment" entitlement. If your app uses the Apple Push Notification service, make sure your App ID is enabled for Push Notification in the Provisioning Portal, and resubmit after signing your app with a Distribution provisioning profile that includes the "aps-environment" entitlement. 10 | 11 | ## What impact does this warning have on my app? 12 | 13 | If you are not using push notifications, then it has no impact - you can ignore it. 14 | 15 | ## What is responsible for triggering this warning? 16 | 17 | This warning is coming from two different checks that Apple is doing: 18 | 19 | 1. Apple will send this warning if there is a mismatch between the capabilities information previously sent to Apple’s developer portal, and the entitlements file in the app. A mismatch can also happen in a newly created app with SDK 51 if the app is created without `expo-notifications`, a provisioning profile is created, and then the `expo-notifications` package and notifications code is added later. 20 | 2. Apple also checks the application binary for calls to the `UIApplicationDelegate` method `application:didRegisterForRemoteNotificationsWithDeviceToken:`. Apple will send the warning if it finds a call to this method, even if that call is in a 3rd party library and not in your application's app delegate. The `expo-modules-core` package's `ExpoAppDelegate` class implements this method for all Expo apps, in order to support applications that use notifications. Expo is currently investigating different approaches for removing this call from apps that do not need it. 21 | 22 | ## How can I stop receiving this warning? 23 | 24 | ### If you do not use push notifications in your app 25 | 26 | - Go to the Apple developer portal and delete the APNS capability from the app there, if it is present. 27 | - Due to the App Store static analysis that looks for notification methods in code, as described above, this will not yet be sufficient to prevent the warning. We're working on a good long-term solution, but for now you can [use patch-package](https://expo.fyi/eas-patch-package) to remove the [3 notification delegate methods from ExpoAppDelegate in expo-modules-core](https://github.com/expo/expo/blob/98732cc16e6d24017499eb152aba4af98bd2fed6/packages/expo-modules-core/ios/AppDelegates/ExpoAppDelegate.swift#L108-L159). We will update this FYI in the future when we have a better solution. 28 | 29 | ### If you do want to use push notifications in your app 30 | 31 | - Ensure that you have added the notifications entitlement. You can do configure this in Xcode if you are manage your iOS project directly, or expo-notifications will handle it automatically if you use [CNG](https://docs.expo.dev/workflow/continuous-native-generation/). Alternative notification libraries should provide a config plugin to add the entitlement. If not, [you can add it manually in your app config](https://docs.expo.dev/build-reference/ios-capabilities/#entitlements). 32 | 33 | ## Additional information 34 | 35 | More information on how to work with Apple capabilities and entitlements can be found in our [documentation](https://docs.expo.dev/build-reference/ios-capabilities/). 36 | -------------------------------------------------------------------------------- /apple-2fa-sms-issues-workaround.md: -------------------------------------------------------------------------------- 1 | # Workaround for Apple 2FA SMS issues 2 | 3 | > [!NOTE] 4 | > On 2024-11-15 it was reported that [Apple API was throwing internal server errors while trying to send 2FA SMS codes for American phone numbers, when authenticating through EAS CLI](https://github.com/expo/eas-cli/issues/2698). The Expo team has since updated the EAS CLI to match the new authentication requests. The issue should be fixed in version `14.0.3`. 5 | 6 | If you are experiencing persistent issues with Apple SMS 2FA while logging in through EAS CLI, **you should switch to using the `device` 2FA method**. Apple has recently changed their APIs in a way that has made this auth method less reliable for external tools (for example, see [fastlane#28816](https://github.com/fastlane/fastlane/issues/28816)). At Expo, we have adjusted our implementation to fix many cases but we do not have any direct access to the information that would allow us to feel confident that we can fix it in every scenario. For this reason, we strongly recommend moving to device 2FA instead. 7 | 8 | We'll continue improving the SMS 2FA as best we can, and EAS CLI currently handles it better than any other tool that we are aware of, but we can't guarantee that it will be reliable. It is possible that Apple may be moving away from the SMS 2FA method, given that it is generally considered to be less secure than alternative approaches. 9 | 10 | ## How to setup and use `device` 2FA method with EAS CLI 11 | 12 | Follow [these Apple docs](https://support.apple.com/en-us/102660) to set a trusted device ([for example your Mac](https://github.com/expo/eas-cli/issues/2698#issuecomment-2525401555)) for your Apple account. 13 | Once the trusted device is set up, you can use the `device` 2FA method when prompted `How do you want to validate your account?` in the EAS CLI. 14 | This method will send a 2FA code to your trusted device, which you can then enter in the CLI to authenticate. 15 | 16 | ## Remove EAS CLI Apple authentication cache (if you are using EAS CLI version >= `14.0.3`) 17 | 18 | If you still encounter this issue while using EAS CLI version >= `14.0.3`, you can try to remove old Apple authentication cache. 19 | It seems to fix the issue for some users. 20 | 21 | Run the following command to remove the Apple authentication cache used by EAS CLI: 22 | 23 | ```bash 24 | rm -rf ~/.app-store/ 25 | ``` 26 | 27 | After removing the cache, try logging in again with the EAS CLI. 28 | -------------------------------------------------------------------------------- /apple-app-specific-password.md: -------------------------------------------------------------------------------- 1 | # Apple App-Specific Password 2 | 3 | The Apple app-specific password is a password for your Apple ID account that lets you sign in to your Apple account securely from a third-party app. It is one of the authentication methods that can be used by the EAS Submit service to submit your build to the Apple App Store. 4 | 5 | ### Security 6 | 7 | > [!WARNING] 8 | > This authentication method is considered less secure than using the App Store Connect API key because of the broad permissions the app-specific password grants to the actor/service who has it. We recommend using the App Store Connect API key for submitting your builds to the Apple App Store (this is default and recommended authentication method). [Learn more](https://docs.expo.dev/app-signing/security/#apple-app-specific-password). 9 | 10 | ### How do I generate an app-specific password? 11 | 12 | 1. Sign in to your [Apple ID account](https://appleid.apple.com/account/home). 13 | 2. Go to the _Security_ section and click `Generate Password` under _App-Specific Passwords_. 14 | 3. Follow the instructions on your screen. 15 | 16 | > [!NOTE] 17 | > **Important note**: To generate and use app-specific passwords, your Apple ID must be protected with [two-factor authentication](https://support.apple.com/kb/HT204915) (2FA). 18 | 19 | You can learn more about app-specific passwords [here](https://support.apple.com/en-us/HT204397). 20 | 21 | ## How do I use the app-specific password once I have generated it? 22 | 23 | You can use [EAS CLI](https://github.com/expo/eas-cli) to submit your build to the Apple App Store using the app-specific password. 24 | The app-specific password is passed to the EAS CLI as an environment variable called `EXPO_APPLE_APP_SPECIFIC_PASSWORD`. 25 | 26 | Use the following command to submit your iOS build using the app-specific password: 27 | 28 | ```bash 29 | EXPO_APPLE_APP_SPECIFIC_PASSWORD=your_app_specific_password eas submit -p ios 30 | ``` 31 | -------------------------------------------------------------------------------- /apple-team.md: -------------------------------------------------------------------------------- 1 | # Apple Team 2 | 3 | You can find information about your Apple Team at the [Developer Portal](https://developer.apple.com). 4 | 5 | - Click **Membership details** from the top panel to navigate to the membership details section. 6 | 7 | 8 | 9 | - You will find your Apple Team ID and membership type in the details section. 10 | 11 | 12 | -------------------------------------------------------------------------------- /asc-app-id.md: -------------------------------------------------------------------------------- 1 | # App Store Connect app ID 2 | 3 | A unique ID for every application existing in App Store Connect. It is typically a 10-digit number. 4 | 5 | `ascAppId` can be configured per Submit Profile in [`eas.json` config](https://docs.expo.dev/submit/eas-json/#ios-specific-options). 6 | 7 | ### How do I find my App ID? 8 | 9 | If your application is already on App Store Connect, please follow these steps: 10 | 1. Sign in to [App Store Connect](https://appstoreconnect.apple.com/) and select your team 11 | 2. Navigate to the [Apps](https://appstoreconnect.apple.com/apps) section if you're not already there 12 | 3. Click on your app name and ensure that _App Store_ tab is active at the top (next to your app's name) 13 | 4. On the left pane, under _General_ section, select _App Information_ 14 | 5. Your App ID can be found under _General Information_ section, called `Apple ID` 15 | > Confusingly, _Apple ID_ in this context does not refer to your Apple account username, it refers to your App ID. 16 | 17 | [](./assets/asc-app-id/finding-app-id.png) 18 | -------------------------------------------------------------------------------- /asc-issuer-id.md: -------------------------------------------------------------------------------- 1 | # Finding your App Store Connect Issuer ID 2 | 3 | An Issuer ID identifies the issuer who created the authentication token in App Store Connect. This page will guide you through the process of finding your Issuer ID. 4 | 5 | 1. Open the [App Store Connect Portal](https://appstoreconnect.apple.com/access/users) and go to the **Keys** tab under the Users and Access section. 6 | 7 | [](./assets/asc-issuer-id/01-open-app-store-connect-portal.png) 8 | 9 | 2. Your Issuer ID can be found in the red box in the picture below: 10 | 11 | [](./assets/asc-issuer-id/02-issuer-id.png) 12 | -------------------------------------------------------------------------------- /assets/android-r/ask_for_dir_permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/android-r/ask_for_dir_permissions.png -------------------------------------------------------------------------------- /assets/android-r/background_permissions_modal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/android-r/background_permissions_modal.png -------------------------------------------------------------------------------- /assets/android-r/foreground_permissions_modal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/android-r/foreground_permissions_modal.png -------------------------------------------------------------------------------- /assets/android-r/modifying_media_request.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/android-r/modifying_media_request.PNG -------------------------------------------------------------------------------- /assets/android-reset-keystore/playstore-console-reset-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/android-reset-keystore/playstore-console-reset-key.png -------------------------------------------------------------------------------- /assets/apple-team/membership-details.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/apple-team/membership-details.png -------------------------------------------------------------------------------- /assets/apple-team/membership-tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/apple-team/membership-tab.png -------------------------------------------------------------------------------- /assets/asc-app-id/finding-app-id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/asc-app-id/finding-app-id.png -------------------------------------------------------------------------------- /assets/asc-issuer-id/01-open-app-store-connect-portal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/asc-issuer-id/01-open-app-store-connect-portal.png -------------------------------------------------------------------------------- /assets/asc-issuer-id/02-issuer-id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/asc-issuer-id/02-issuer-id.png -------------------------------------------------------------------------------- /assets/bumping-android-version-code/01-bumping-android-version-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/bumping-android-version-code/01-bumping-android-version-code.png -------------------------------------------------------------------------------- /assets/bumping-android-version-code/02-upload-with-submission-service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/bumping-android-version-code/02-upload-with-submission-service.png -------------------------------------------------------------------------------- /assets/bumping-android-version-code/03-check-release-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/bumping-android-version-code/03-check-release-page.png -------------------------------------------------------------------------------- /assets/bumping-ios-build-number/01-bumping-ios-build-number.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/bumping-ios-build-number/01-bumping-ios-build-number.png -------------------------------------------------------------------------------- /assets/bumping-ios-build-number/01b-bumping-in-xcode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/bumping-ios-build-number/01b-bumping-in-xcode.png -------------------------------------------------------------------------------- /assets/bumping-ios-build-number/02-submitting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/bumping-ios-build-number/02-submitting.png -------------------------------------------------------------------------------- /assets/bumping-ios-build-number/03-check-asc-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/bumping-ios-build-number/03-check-asc-page.png -------------------------------------------------------------------------------- /assets/creating-asc-api-key/01-open-app-store-connect-portal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-asc-api-key/01-open-app-store-connect-portal.png -------------------------------------------------------------------------------- /assets/creating-asc-api-key/02-big-plus-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-asc-api-key/02-big-plus-button.png -------------------------------------------------------------------------------- /assets/creating-asc-api-key/03-key-fields.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-asc-api-key/03-key-fields.png -------------------------------------------------------------------------------- /assets/creating-asc-api-key/04-download-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-asc-api-key/04-download-key.png -------------------------------------------------------------------------------- /assets/creating-asc-api-key/05-other-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-asc-api-key/05-other-info.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/01-new-google-cloud-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/01-new-google-cloud-project.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/02-service-accounts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/02-service-accounts.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/03-create-service-account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/03-create-service-account.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/04-manage-keys.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/04-manage-keys.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/05-create-new-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/05-create-new-key.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/06-key-type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/06-key-type.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/07-key-saved.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/07-key-saved.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/08-play-developer-api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/08-play-developer-api.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/09-users-permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/09-users-permissions.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/10-invite-user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/10-invite-user.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/11-set-permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/11-set-permissions.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/12-copy-service-account-email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/12-copy-service-account-email.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/13-select-existing-service-account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/13-select-existing-service-account.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/14-create-new-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/14-create-new-key.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/15-select-json-key-type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/15-select-json-key-type.png -------------------------------------------------------------------------------- /assets/creating-google-service-account/16-service-key-created.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/creating-google-service-account/16-service-key-created.png -------------------------------------------------------------------------------- /assets/delete-build/delete-build.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/delete-build/delete-build.png -------------------------------------------------------------------------------- /assets/expo-modules-migration/xcode-iphoneos-deployment-target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/expo-modules-migration/xcode-iphoneos-deployment-target.png -------------------------------------------------------------------------------- /assets/first-android-submission/01-open-google-play-console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/01-open-google-play-console.png -------------------------------------------------------------------------------- /assets/first-android-submission/02-create-application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/02-create-application.png -------------------------------------------------------------------------------- /assets/first-android-submission/03-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/03-dashboard.png -------------------------------------------------------------------------------- /assets/first-android-submission/04-steps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/04-steps.png -------------------------------------------------------------------------------- /assets/first-android-submission/05-create-email-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/05-create-email-list.png -------------------------------------------------------------------------------- /assets/first-android-submission/05-testing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/05-testing.png -------------------------------------------------------------------------------- /assets/first-android-submission/06-create-release.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/06-create-release.png -------------------------------------------------------------------------------- /assets/first-android-submission/07-google-app-signing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/07-google-app-signing.png -------------------------------------------------------------------------------- /assets/first-android-submission/08-upload-aab-archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/08-upload-aab-archive.png -------------------------------------------------------------------------------- /assets/first-android-submission/09-view-version-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/09-view-version-code.png -------------------------------------------------------------------------------- /assets/first-android-submission/10-submit-first-release.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/10-submit-first-release.png -------------------------------------------------------------------------------- /assets/first-android-submission/11-release-summary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/11-release-summary.png -------------------------------------------------------------------------------- /assets/first-android-submission/12-testers-copy-link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/12-testers-copy-link.png -------------------------------------------------------------------------------- /assets/first-android-submission/13-pending-tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/first-android-submission/13-pending-tasks.png -------------------------------------------------------------------------------- /assets/missing-privacy-policy/01-privacy-policy-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/missing-privacy-policy/01-privacy-policy-error.png -------------------------------------------------------------------------------- /assets/missing-privacy-policy/02-open-google-play-console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/missing-privacy-policy/02-open-google-play-console.png -------------------------------------------------------------------------------- /assets/missing-privacy-policy/03-app-content.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/missing-privacy-policy/03-app-content.png -------------------------------------------------------------------------------- /assets/missing-privacy-policy/04-privacy-policy-form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/missing-privacy-policy/04-privacy-policy-form.png -------------------------------------------------------------------------------- /assets/missing-privacy-policy/05-internal-releases.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/missing-privacy-policy/05-internal-releases.png -------------------------------------------------------------------------------- /assets/missing-privacy-policy/06-release-summary-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/missing-privacy-policy/06-release-summary-2.png -------------------------------------------------------------------------------- /assets/missing-privacy-policy/06-release-summary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/missing-privacy-policy/06-release-summary.png -------------------------------------------------------------------------------- /assets/splash-screen-hanging/error-console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/splash-screen-hanging/error-console.png -------------------------------------------------------------------------------- /assets/sso-setup-general/01-expo-org.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-general/01-expo-org.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/01-select-new-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/01-select-new-project.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/02-oauth-consent-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/02-oauth-consent-screen.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/03-select-user-type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/03-select-user-type.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/04-enter-required-app-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/04-enter-required-app-info.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/05-add-domain-and-enter-contact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/05-add-domain-and-enter-contact.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/06-click-add-scopes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/06-click-add-scopes.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/07-select-scopes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/07-select-scopes.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/08-complete-scope-selection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/08-complete-scope-selection.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/09-go-to-create-credentials.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/09-go-to-create-credentials.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/10-select-oauth2-client-id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/10-select-oauth2-client-id.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/11-select-web-application-type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/11-select-web-application-type.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/12-complete-client-configuration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/12-complete-client-configuration.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/13-to-access-credentials.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/13-to-access-credentials.png -------------------------------------------------------------------------------- /assets/sso-setup-google-ws/14-credentials-shown-on-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-google-ws/14-credentials-shown-on-right.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/01-app-registrations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/01-app-registrations.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/02-new-registration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/02-new-registration.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/03-register-new-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/03-register-new-app.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/04-authentication.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/04-authentication.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/04-new-platform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/04-new-platform.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/05-configure-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/05-configure-web.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/06-add-redirect-uri.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/06-add-redirect-uri.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/07-api-permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/07-api-permissions.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/08-add-permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/08-add-permissions.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/09-microsoft-graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/09-microsoft-graph.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/10-openid-permissions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/10-openid-permissions.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/11-owners.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/11-owners.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/12-add-owners.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/12-add-owners.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/13-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/13-overview.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/14-add-a-secret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/14-add-a-secret.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/15-new-secret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/15-new-secret.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/16-entra-id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/16-entra-id.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/17-users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/17-users.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/18-open-a-user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/18-open-a-user.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/19-client-and-tenant-id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/19-client-and-tenant-id.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/20-enterprise-applications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/20-enterprise-applications.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/21-enterprise-application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/21-enterprise-application.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/22-assign-users-and-groups.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/22-assign-users-and-groups.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/23-users-assigned.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/23-users-assigned.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/24-id-token-set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/24-id-token-set.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/25-user-read-scope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-microsoft/25-user-read-scope.png -------------------------------------------------------------------------------- /assets/sso-setup-microsoft/config-flag-migration.md: -------------------------------------------------------------------------------- 1 | # Migrating away from `--config` in Expo CLI 2 | 3 | > Note: this document is intended for outdated versions of Expo tools, and it refers to the classic build service and the global Expo CLI. These tools have both been replaced, by EAS Build and Expo CLI respectively. If you are reading this document and this note, there is a good chance that the contents here do not apply to you. 4 | 5 | The `--config` flag for commands like `expo start` and `expo publish` was added to provide developers with a mechanism to switch between different `app.json` configuration files to support use cases like staging environments and white labeling. 6 | 7 | At the time the flag was introduced, dynamic configuration with `app.config.js` was not possible. Now that it is, we are deprecating the `--config` flag in favor of using `app.config.js`. The `--config` flag will continue to work for existing use cases, but it won't be supported in new scenarios, such as on EAS Build and embedding app config when building native projects locally. 8 | 9 | The migration process itself is quick, here's how you can do it. 10 | 11 | ### Migrating from using multiple `app.json` files with `--config` to `app.config.js` 12 | 13 | Imagine you have three config files: `app.json`, `app.staging.json`, and `app.production.json`. When you run your app locally for development, you run `expo start`. When you build and publish for staging, you run `expo build:[ios|android] --config app.staging.json` and `expo publish --config app.staging.json`. You'd use a similar sort of thing for `app.production.json`. 14 | 15 | Here's an example `app.json` for development, if you're reading this you probably already understand what you would change for staging and production. 16 | 17 | ``` 18 | { 19 | "expo": { 20 | "name": "MyApp (Development)", 21 | "slug": "myapp", 22 | "icon": "./assets/icon.png", 23 | "splash": "./assets/splash.png", 24 | "extra": { 25 | "apiUrl": "https://localhost:3000/api" 26 | } 27 | } 28 | } 29 | ``` 30 | 31 | We can migrate to `app.config.js` and switch the configuration that we use depending on an environment variable. We can specify the environment variable at the same time as we run a command with Expo CLI, for example: `APP_ENV=production expo build:android`. On Windows this will be slightly different and it depends on your shell, but you can use `npx cross-env APP_ENV=production expo build:android` if you're not sure what to do. 32 | 33 | While there is essentially unlimited flexibility in how you structure your project, here are two possible ways you may do this: move all of the config to `app.config.js`, or keep the config files separate and load the appropriate file from `app.config.js`. 34 | 35 | #### 1. **Move all config to `app.config.js`** 36 | 37 | Create `app.config.js`, and copy and paste your config into one file. 38 | 39 | ```js 40 | const commonConfig = { 41 | slug: "myapp", 42 | icon: "./assets/icon.png", 43 | splash: "./assets/splash.png", 44 | }; 45 | 46 | module.exports = () => { 47 | if (process.env.APP_ENV === "production") { 48 | return { 49 | ...commonConfig, 50 | name: "MyApp", 51 | extra: { 52 | apiUrl: "https://production.com/api", 53 | }, 54 | }; 55 | } else if (process.env.APP_ENV === "staging") { 56 | return { 57 | ...commonConfig, 58 | name: "MyApp (Staging)", 59 | extra: { 60 | apiUrl: "https://staging.com/api", 61 | }, 62 | }; 63 | } else { 64 | return { 65 | ...commonConfig, 66 | name: "MyApp (Development)", 67 | extra: { 68 | apiUrl: "https://localhost:3000/api", 69 | }, 70 | }; 71 | } 72 | }; 73 | ``` 74 | 75 | #### 2. **Keep config in separate files, select the config in `app.config.js`** 76 | 77 | Rename your `app.json` to `app.development.json` and create `app.config.js` with the following contents: 78 | 79 | ```js 80 | module.exports = () => { 81 | if (process.env.APP_ENV === "production") { 82 | return require("./app.production.json"); 83 | } else if (process.env.APP_ENV === "staging") { 84 | return require("./app.staging.json"); 85 | } else { 86 | return require("./app.development.json"); 87 | } 88 | }; 89 | ``` 90 | 91 | ### Verifying your configuration 92 | 93 | You can use the `expo config` command to verify that your config is switching based on environment variables as expected. For example, run `APP_ENV=production expo config --type public` to see what your app config evaluates to with the `APP_ENV` set to `production`. 94 | -------------------------------------------------------------------------------- /assets/sso-setup-okta/01-applications-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-okta/01-applications-menu.png -------------------------------------------------------------------------------- /assets/sso-setup-okta/02-create-app-integration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-okta/02-create-app-integration.png -------------------------------------------------------------------------------- /assets/sso-setup-okta/03-oidc-web-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-okta/03-oidc-web-app.png -------------------------------------------------------------------------------- /assets/sso-setup-okta/04-auth-code-option.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-okta/04-auth-code-option.png -------------------------------------------------------------------------------- /assets/sso-setup-okta/05-redirect-uris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-okta/05-redirect-uris.png -------------------------------------------------------------------------------- /assets/sso-setup-okta/06-assignments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-okta/06-assignments.png -------------------------------------------------------------------------------- /assets/sso-setup-okta/07-client-id.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-okta/07-client-id.png -------------------------------------------------------------------------------- /assets/sso-setup-okta/08-subdomain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-okta/08-subdomain.png -------------------------------------------------------------------------------- /assets/sso-setup-onelogin/01-applications-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-onelogin/01-applications-menu.png -------------------------------------------------------------------------------- /assets/sso-setup-onelogin/02-add-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-onelogin/02-add-app.png -------------------------------------------------------------------------------- /assets/sso-setup-onelogin/03-find-oidc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-onelogin/03-find-oidc.png -------------------------------------------------------------------------------- /assets/sso-setup-onelogin/04-display-name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-onelogin/04-display-name.png -------------------------------------------------------------------------------- /assets/sso-setup-onelogin/05-redirect-uris.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-onelogin/05-redirect-uris.png -------------------------------------------------------------------------------- /assets/sso-setup-onelogin/06-users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-onelogin/06-users.png -------------------------------------------------------------------------------- /assets/sso-setup-onelogin/07-application.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-onelogin/07-application.png -------------------------------------------------------------------------------- /assets/sso-setup-onelogin/08-sso-tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/expo/fyi/5c7bb1c85df7ecfd776226417c69d8d1bf515b7e/assets/sso-setup-onelogin/08-sso-tab.png -------------------------------------------------------------------------------- /authorize-android-device.md: -------------------------------------------------------------------------------- 1 | # Authorize Android Device 2 | 3 | Android devices can only be used for debugging apps if your computer is "authorized" to develop on. 4 | 5 | ## Devices 6 | 7 | > If Expo CLI is running, stop it with ctrl+c -- this will stop [ADB][adb]. 8 | 9 | 1. Disconnect your Android device from the computer. 10 | 2. Revoke USB Debugging on the device: 11 | - Open the `Settings` app on your device. 12 | - **Navigate:** `Developer Options` -> select _Revoke USB debugging authorizations_. 13 | 3. Reconnect the device: 14 | - The device will prompt you to agree to connect the computer. You must confirm it. 15 | 4. The computer is now authorized for debugging! 16 | 17 | ## Genymotion 18 | 19 | 1. Open `Genymotion` -> `Settings` -> `ADB` -> select _Use custom Android SDK tools_ 20 | 2. Point it to your Android SDK directory. 21 | 22 | By default, Android Studio installs the SDK tools in the following folders: 23 | 24 | - **Linux**: `/home/your_username/Android/Sdk` 25 | - **macOS**: `/Users/your_username/Library/Android/sdk` 26 | - **Windows**: `%AppData%\Local\Android\Sdk` 27 | 28 | > For more help with Genymotion, refer to [their docs][genymotion]. 29 | 30 | [adb]: https://developer.android.com/studio/command-line/adb 31 | [genymotion]: https://docs.genymotion.com/desktop/3.0/02_Application/021_Configuring_Genymotion.html#adb 32 | -------------------------------------------------------------------------------- /barcode-scanner-to-expo-camera.md: -------------------------------------------------------------------------------- 1 | ## How to migrate from `expo-barcode-scanner` to `expo-camera`. 2 | 3 | `expo-barcode-scanner` is deprecated in favor of using the built in scanner in `expo-camera`. 4 | 5 | ### Set up 6 | 7 | Install `expo-camera` by running the following command: 8 | 9 | ```shell 10 | npx expo install expo-camera 11 | ``` 12 | 13 | [Learn more about installing and configuring expo-camera](https://docs.expo.dev/versions/latest/sdk/camera/#installation), some additional configuration is required if you don't use [CNG](https://docs.expo.dev/workflow/continuous-native-generation/). 14 | 15 | ### Usage 16 | 17 | You may have implemented something like this using the `BarCodeScanner` component 18 | 19 | ```typescript 20 | import React, { useState, useEffect } from "react"; 21 | import { Text, View, StyleSheet, Button } from "react-native"; 22 | import { BarCodeScanner } from "expo-barcode-scanner"; 23 | 24 | export default function App() { 25 | const [hasPermission, setHasPermission] = useState(null); 26 | const [scanned, setScanned] = useState(false); 27 | 28 | useEffect(() => { 29 | const getBarCodeScannerPermissions = async () => { 30 | const { status } = await BarCodeScanner.requestPermissionsAsync(); 31 | setHasPermission(status === "granted"); 32 | }; 33 | 34 | getBarCodeScannerPermissions(); 35 | }, []); 36 | 37 | const handleBarCodeScanned = ({ type, data }) => { 38 | setScanned(true); 39 | alert(`Bar code with type ${type} and data ${data} has been scanned!`); 40 | }; 41 | 42 | if (hasPermission === null) { 43 | return Requesting for camera permission; 44 | } 45 | if (hasPermission === false) { 46 | return No access to camera; 47 | } 48 | 49 | return ( 50 | 51 | 55 | {scanned && ( 56 |