<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Expo on Aamnah - Frontend Web Developer</title>
    <link>https://aamnah.com/notes/expo/</link>
    <description>Recent content in Expo on Aamnah - Frontend Web Developer</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 14 Jul 2020 23:10:01 +0500</lastBuildDate>
    <atom:link href="https://aamnah.com/notes/expo/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Handling permissions in Expo</title>
      <link>https://aamnah.com/notes/expo/expo-handling-permissions/</link>
      <pubDate>Tue, 14 Jul 2020 23:10:01 +0500</pubDate>
      <guid>https://aamnah.com/notes/expo/expo-handling-permissions/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;expo install expo-permissions&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;You can check if a permission is granted with &lt;code&gt;Permissions.getAsync(...permissionTypes)&lt;/code&gt; and ask for a permission with &lt;code&gt;Permissions.askAsync(...types)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Both return a &lt;code&gt;Promise&lt;/code&gt; with has &lt;code&gt;status&lt;/code&gt; and &lt;code&gt;expires&lt;/code&gt; as well as details about scope&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;status&lt;/code&gt; is usually &lt;code&gt;granted&lt;/code&gt; or &lt;code&gt;denied&lt;/code&gt;. It could also be &lt;code&gt;undetermined&lt;/code&gt; in case of &lt;code&gt;Permissions.NOTIFICATIONS&lt;/code&gt; for iOS, as iOS does not disambiguate &lt;code&gt;undetermined&lt;/code&gt; from &lt;code&gt;denied&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Make sure you&amp;rsquo;re basing your logic on &lt;code&gt;granted&lt;/code&gt; and &lt;code&gt;!granted&lt;/code&gt; to account for cases like &lt;code&gt;undetermined&lt;/code&gt; that only happen on iOS and only for some permissions&lt;/li&gt;&#xA;&lt;li&gt;on iOS remote notifications only show if &lt;code&gt;allowsSound&lt;/code&gt;, &lt;code&gt;allowsAlert&lt;/code&gt; or &lt;code&gt;allowsBadge&lt;/code&gt; is set.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;There are about a dozen permission types&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;NOTIFICATIONS&lt;/li&gt;&#xA;&lt;li&gt;USER_FACING_NOTIFICATIONS&lt;/li&gt;&#xA;&lt;li&gt;LOCATION&lt;/li&gt;&#xA;&lt;li&gt;CAMERA&lt;/li&gt;&#xA;&lt;li&gt;AUDIO_RECORDING&lt;/li&gt;&#xA;&lt;li&gt;CONTACTS&lt;/li&gt;&#xA;&lt;li&gt;CAMERA_ROLL&lt;/li&gt;&#xA;&lt;li&gt;CALENDAR&lt;/li&gt;&#xA;&lt;li&gt;REMINDERS&lt;/li&gt;&#xA;&lt;li&gt;SYSTEM_BRIGHTNESS&lt;/li&gt;&#xA;&lt;li&gt;MOTION&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Environment variables in Expo using Release Channels</title>
      <link>https://aamnah.com/notes/expo/environment-variables-release-channels-expo/</link>
      <pubDate>Mon, 13 Jul 2020 14:01:06 +0500</pubDate>
      <guid>https://aamnah.com/notes/expo/environment-variables-release-channels-expo/</guid>
      <description>&lt;ul&gt;&#xA;&lt;li&gt;You can reference the release channel with &lt;code&gt;Constants.manifest.releaseChannel&lt;/code&gt;. It&amp;rsquo;s part of &lt;code&gt;expo-constants&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Default values for &lt;code&gt;releaseChannel&lt;/code&gt; are:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;undefined&lt;/code&gt; in dev mode&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;default&lt;/code&gt; in production&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Constants.manifest.releaseChannel&lt;/code&gt; does NOT exist in dev mode, it&amp;rsquo;ll return &lt;code&gt;undefined&lt;/code&gt;. It does exist, however when you explicitly publish / build with it.&lt;/li&gt;&#xA;&lt;li&gt;If you don&amp;rsquo;t specify a release channel, it&amp;rsquo;ll publish to a channel called &lt;code&gt;default&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s what i use, it uses &lt;code&gt;indexOf&lt;/code&gt; to accomodate for different variations in channel names and &lt;code&gt;__DEV__&lt;/code&gt; to set default environment when &lt;code&gt;releaseChannel&lt;/code&gt; is &lt;code&gt;undefined&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Expo builds vs. Turtle builds</title>
      <link>https://aamnah.com/notes/expo/expo-build-vs-turtle-build/</link>
      <pubDate>Wed, 01 Jul 2020 16:58:06 +0500</pubDate>
      <guid>https://aamnah.com/notes/expo/expo-build-vs-turtle-build/</guid>
      <description>&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Expo&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Turtle&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;App hosted on Expo servers&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Self-hosted&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Calls Expo URL for future OTAs &lt;code&gt;exp://i3-kvb.ccheever.an-example.exp.direct:80&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Calls our server&amp;rsquo;s URL for furture OTAs &lt;code&gt;http://build.myserver.com/android-index.json&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;OTAs will fetch JS bundles and assets from Expo’s CDN&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;OTAs will fetch JS bundles and assets from your servers&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;Build is put in a build queue, you wait for your turn&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;No build queue&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;~ 32 minutes in pipeline&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;~ 8 minutes in pipeline&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;The entire pipeline including installing JDK, setting up Android SDK, the actual build of the app bundle, and uploading of the artifacts took less than 8 minutes.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Expo keystore invalid format error</title>
      <link>https://aamnah.com/notes/expo/expo-keystore-invalid-format/</link>
      <pubDate>Mon, 29 Jun 2020 23:58:08 +0500</pubDate>
      <guid>https://aamnah.com/notes/expo/expo-keystore-invalid-format/</guid>
      <description>&lt;h3 id=&#34;issue&#34;&gt;ISSUE&lt;/h3&gt;&#xA;&lt;p&gt;Build fails giving the following erros&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Failed to read key xxxxxxxlc3BlbxxxxxxxxnBwcmVhY3Ruxxxxxxxx from store &amp;#34;/tmp/turtle/keystore-dfb2d7a0-91d0-44c0-b085-2486ec2039b8.jks&amp;#34;: Invalid keystore format&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;get-keystore-details&#34;&gt;Get keystore details&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;expo fetch:android:keystore&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Keystore credentials&#xA;  Keystore password: xx299bxxxxxxxx98a9a42e1cxxxxxxxx&#xA;  Key alias:         xxxxxxxlc3BlbxxxxxxxxnBwcmVhY3Ruxxxxxxxx&#xA;  Key password:      3d1xxxxxxxx744xxxxxxxx9bcxxxxxxx&#xA;&#xA;  Path to Keystore:  /media/aamnah/Files/Sites/appreactnative/appreactnative.jks&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;use-the-keystore-details-to-get-details-about-the-keystore-format&#34;&gt;Use the keystore details to get details about the keystore format&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;keytool -list -keystore appreactnative.jks -alias &lt;span class=&#34;s2&#34;&gt;&amp;#34;xxxxxxxlc3BlbxxxxxxxxnBwcmVhY3Ruxxxxxxxx&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Enter keystore password:&#xA;xxxxxxxlc3BlbxxxxxxxxnBwcmVhY3Ruxxxxxxxx, Jan 15, 2020, PrivateKeyEntry,&#xA;Certificate fingerprint (SHA-256): AA:BB:CC:1D:BB:C8:00:7B:35:12:12:21:21:12:12:12:12:12:34:56:78:90:E5:E5:A3:EB:1A:56:E3:2C:73:63&#xA;&#xA;Warning:&#xA;The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using &amp;#34;keytool -importkeystore -srckeystore appreactnative.jks -destkeystore appreactnative.jks -deststoretype pkcs12&amp;#34;.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If for some reason your keystore is not the right format, expect the following errors instead of seeing the details above&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setup a publish, build and distribute pipeline for Expo based React Native project</title>
      <link>https://aamnah.com/notes/expo/expo-bitbucket-pipeline-build-publish-distribute-standalone-app/</link>
      <pubDate>Mon, 29 Jun 2020 23:58:07 +0500</pubDate>
      <guid>https://aamnah.com/notes/expo/expo-bitbucket-pipeline-build-publish-distribute-standalone-app/</guid>
      <description>&lt;p&gt;Steps&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Build your app and let Expo manage your key&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Generate a keystore&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Sign the app and set it up in the Play Console&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Setup Netlify to serve the app&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Export the app to Netlify&amp;rsquo;s public URL&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Build the app and mention that URL (will be used for OTA)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Send the builds (&lt;code&gt;.aab&lt;/code&gt; and &lt;code&gt;.ipa&lt;/code&gt;)to a distribution service (Firebase App Distribution or Microsoft AppCenter)&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The reason i&amp;rsquo;m building with &lt;code&gt;turtle&lt;/code&gt; and not with &lt;code&gt;expo&lt;/code&gt; is because Expo builds are put in a build queue, which can take up to 45 minutes to build your app.. I can not waste this many minutes in a CI/CD pipeline. For reference, the Bitbucket free plan gives you only 50 build minutes for an entire month. I actually ran out of build minutes while putting the pipeline together..&lt;/p&gt;</description>
    </item>
    <item>
      <title>Project structure - Expo vs. React Native</title>
      <link>https://aamnah.com/notes/expo/react-native-vs-expo-project-structure/</link>
      <pubDate>Wed, 24 Jun 2020 20:13:39 +0500</pubDate>
      <guid>https://aamnah.com/notes/expo/react-native-vs-expo-project-structure/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# create a react native project with typescript&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;npx react-native init AwesomeTSProject --template react-native-template-typescript&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;.&#xA;├── android/&#xA;├── app.json&#xA;├── App.tsx&#xA;├── babel.config.js&#xA;├── index.js&#xA;├── ios/&#xA;├── metro.config.js&#xA;├── node_modules/&#xA;├── package.json&#xA;├── package-lock.json&#xA;├── __tests__/&#xA;└── tsconfig.json&#xA;&#xA;4 directories, 8 files&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# create an Expo project&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;expo init my-project&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;.&#xA;├── app.config.js&#xA;├── App.tsx&#xA;├── assets&#xA;├── babel.config.js&#xA;├── components&#xA;├── constants&#xA;├── hooks&#xA;├── navigation&#xA;├── node_modules&#xA;├── package.json&#xA;├── screens&#xA;├── tsconfig.json&#xA;└── types.tsx&#xA;&#xA;7 directories, 6 files&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Ejecting from Expo</title>
      <link>https://aamnah.com/notes/expo/eject-expo/</link>
      <pubDate>Thu, 11 Jun 2020 19:05:21 +0500</pubDate>
      <guid>https://aamnah.com/notes/expo/eject-expo/</guid>
      <description>&lt;p&gt;Cons&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The expo build tool chain&lt;/li&gt;&#xA;&lt;li&gt;You start doing react &lt;em&gt;native&lt;/em&gt; development for iOS and Android&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Pros&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;full Firebase SDK&lt;/li&gt;&#xA;&lt;li&gt;automate deployments and distributionn to app stores&lt;/li&gt;&#xA;&lt;li&gt;CodePush or RemoteConfig&lt;/li&gt;&#xA;&lt;li&gt;SDKs for React Native by Google and Microsoft&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;links&#34;&gt;Links&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://forums.expo.io/t/firebase-expokit-and-bare-confusion/22276&#34;&gt;Firebase, ExpoKit, and bare confusion&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.expo.io/you-can-now-use-expo-apis-in-any-react-native-app-7c3a93041331&#34;&gt;You can now use Expo APIs in any React Native app&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.expo.io/time-to-start-using-expos-bare-workflow-expokit-now-deprecated-d6052890c18b&#34;&gt;Time to Start Using Expo’s Bare Workflow. ExpoKit Now Deprecated.&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Building Standalone Expo React Native apps locally with Turtle CLI</title>
      <link>https://aamnah.com/notes/expo/expo-react-native-turtle-standalone-local-build/</link>
      <pubDate>Thu, 04 Jun 2020 22:30:31 +0500</pubDate>
      <guid>https://aamnah.com/notes/expo/expo-react-native-turtle-standalone-local-build/</guid>
      <description>&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Get a secure URL to publish project to &lt;code&gt;ngrok http 127.0.0.1:8080 -host-header=&amp;quot;127.0.0.1:8080&amp;quot;&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Export project to secure URL &lt;code&gt;rm -rf dist/ &amp;amp;&amp;amp; expo export --public-url https://XXXXXXXXXXXX.ngrok.io&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Run project on secure local server &lt;code&gt;cd dist/ &amp;amp;&amp;amp; npx http-server&lt;/code&gt; and confirm it&amp;rsquo;s running &lt;code&gt;curl https://XXXXXXXXXXXX.ngrok.io/android-index.json&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Build project using &lt;code&gt;turtle-cli&lt;/code&gt; with &lt;code&gt;--public-url&lt;/code&gt; pointing to the secure server&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;EXPO_ANDROID_KEYSTORE_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;XXXXXXXX&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;EXPO_ANDROID_KEY_PASSWORD&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;XXXXXXXX&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;turtle build:android &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  --keystore-path /PATH/TO/YOUR/KEYSTORE_FILE.jks &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  --keystore-alias PUT_KEYSTORE_ALIAS_HERE&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  --public-url https://XXXXXXXXXXXX.ngrok.io/android-index.json&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#xA;&lt;p&gt;Right now when you run the expo build command, it puts you into a queue, and stores the build on Expo servers. I obviously don&amp;rsquo;t want that because a queue slows me down (the build keeps failing..) and once the build is done i have to manually download it in order to be able to upload it somewhere else..&lt;/p&gt;</description>
    </item>
    <item>
      <title>Changing from Expo generated Android keystore to your own</title>
      <link>https://aamnah.com/notes/expo/change-update-expo-keystore/</link>
      <pubDate>Fri, 07 Feb 2020 00:00:00 +0500</pubDate>
      <guid>https://aamnah.com/notes/expo/change-update-expo-keystore/</guid>
      <description>&lt;p&gt;This assumes that you have a new app and have not published it to Google Play Store before.&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-opt-in-to-google-play-app-signing&#34;&gt;1. Opt in to Google Play App Signing&lt;/h3&gt;&#xA;&lt;p&gt;You can either do that directly through the Play Console, or you can run this Expo command&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;expo opt-in-google-play-signing&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;which will basically walk you through it&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-backup-the-expo-generated-keystore-and-save-the-outputted-details&#34;&gt;2. Backup the Expo generated keystore and save the outputted details&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;expo fetch:android:keystore&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Keystore credentials&#xA;Keystore credentials&#xA;  Keystore password: xx299bxxxxxxxx98a9a42e1cxxxxxxxx&#xA;  Key alias:         xxxxxxxlc3BlbxxxxxxxxnBwcmVhY3Ruxxxxxxxx&#xA;  Key password:      3d1xxxxxxxx744xxxxxxxx9bcxxxxxxx&#xA;&#xA;  Path to Keystore:  /media/aamnah/Files/Sites/appreactnative/appreactnative.jks&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;3-generate-a-keystore&#34;&gt;3. Generate a keystore&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;keytool -genkeypair -v -keyalg RSA -keysize &lt;span class=&#34;m&#34;&gt;4096&lt;/span&gt; -validity &lt;span class=&#34;m&#34;&gt;10000&lt;/span&gt; -keystore KEYSTORE_OUTPUT_FILE.keystore -alias KEY_ALIAS&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;4-clear-the-keystore-that-expo-generated-and-attach-your-own-keystore&#34;&gt;4. Clear the keystore that Expo generated and attach your own keystore&lt;/h3&gt;&#xA;&lt;p&gt;Keep in mind that &lt;code&gt;--clear-credentials&lt;/code&gt; will permanently delete your existing keystore from Expo servers and this is something that can not be reversed. Make absolutely sure that you have the correct keystore that you&amp;rsquo;re using with Play Store.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Firebase Crashlytics and Expo</title>
      <link>https://aamnah.com/notes/expo/expo-crashlytics-firebase/</link>
      <pubDate>Thu, 09 Jan 2020 14:36:10 +0500</pubDate>
      <guid>https://aamnah.com/notes/expo/expo-crashlytics-firebase/</guid>
      <description>&lt;p&gt;&lt;em&gt;tl;dr&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You can&amp;rsquo;t use Crashlytics in Expo without ejecting. &lt;a href=&#34;https://blog.expo.io/using-firebase-in-expo-e13844061832&#34;&gt;link&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;You can use the &lt;a href=&#34;https://github.com/firebase/firebase-js-sdk&#34;&gt;Firebase JS SDK&lt;/a&gt; in Expo, but that only supports Database and Storage&lt;/li&gt;&#xA;&lt;li&gt;You can use &lt;a href=&#34;https://github.com/invertase/react-native-firebase&#34;&gt;Firebase React Native&lt;/a&gt; for full Firebase functionality, once you eject from Expo&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Integrating Sentry with Expo</title>
      <link>https://aamnah.com/notes/expo/sentry-expo/</link>
      <pubDate>Thu, 04 Apr 2019 13:57:37 +0500</pubDate>
      <guid>https://aamnah.com/notes/expo/sentry-expo/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;npm i sentry-expo --save&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create an &lt;a href=&#34;https://sentry.io/api/&#34;&gt;API auth token&lt;/a&gt;. Must have &lt;code&gt;project:write&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;app.json&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;hooks&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;postPublish&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;file&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;sentry-expo/upload-sourcemaps&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 5&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;config&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 6&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;organization&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;your organization&amp;#39;s short name here&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 7&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;project&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;your project name here&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 8&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;authToken&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;your auth token here&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt; 9&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;12&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;App.js&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;sentry-expo&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Remove this once Sentry is correctly setup.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;enableInExpoDevelopment&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;ln&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Sentry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;your Public DSN goes here&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;install&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;links&#34;&gt;Links&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.expo.io/versions/latest/guides/using-sentry/&#34;&gt;https://docs.expo.io/versions/latest/guides/using-sentry/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
  </channel>
</rss>
