1"use strict";(self.webpackChunkreact_native_website=self.webpackChunkreact_native_website||[]).push([["14237"],{21603(e,n,o){o.r(n),o.d(n,{metadata:()=>i,default:()=>g,frontMatter:()=>l,contentTitle:()=>c,toc:()=>h,assets:()=>u});var i=JSON.parse('{"id":"running-on-device","title":"Running On Device","description":"It\'s always a good idea to test your app on an actual device before releasing it to your users. This document will guide you through the necessary steps to run your React Native app on a device and to get it ready for production.","source":"@site/versioned_docs/version-0.81/running-on-device.md","sourceDirName":".","slug":"/running-on-device","permalink":"/docs/0.81/running-on-device","draft":false,"unlisted":false,"editUrl":"[{\\"label\\":\\"Edit page for next release\\",\\"href\\":\\"https://github.com/facebook/react-native-website/edit/main/docs/running-on-device.md\\"},{\\"label\\":\\"Edit page for 0.81 release\\",\\"href\\":\\"https://github.com/facebook/react-native-website/edit/main/website/versioned_docs/version-0.81/running-on-device.md\\"}]","tags":[],"version":"0.81","lastUpdatedAt":1763547393000,"frontMatter":{"id":"running-on-device","title":"Running On Device","hide_table_of_contents":true},"sidebar":"docs","previous":{"title":"Out-of-Tree Platforms","permalink":"/docs/0.81/out-of-tree-platforms"},"next":{"title":"Fast Refresh","permalink":"/docs/0.81/fast-refresh"}}'),r=o(62540),t=o(43023),a=o(77779),s=o(98263),d=o(38469);let l={id:"running-on-device",title:"Running On Device",hide_table_of_contents:!0},c,u={},h=[{value:"Running your app on Android devices",id:"running-your-app-on-android-devices",level:2},{value:"Development OS",id:"development-os",level:4},{value:"1. Enable Debugging over USB",id:"1-enable-debugging-over-usb",level:3},{value:"2. Plug in your device via USB",id:"2-plug-in-your-device-via-usb",level:3},{value:"3. Run your app",id:"3-run-your-app",level:3},{value:"Method 1: Using adb reverse (recommended)",id:"method-1-using-adb-reverse-recommended",level:3},{value:"Method 2: Connect via Wi-Fi",id:"method-2-connect-via-wi-fi",level:3},{value:"Building your app for production",id:"building-your-app-for-production",level:2},{value:"1. Enable Debugging over USB",id:"1-enable-debugging-over-usb-1",level:3},{value:"2. Plug in your device via USB",id:"2-plug-in-your-device-via-usb-1",level:3},{value:"3. Run your app",id:"3-run-your-app-1",level:3},{value:"Method 1: Using adb reverse (recommended)",id:"method-1-using-adb-reverse-recommended-1",level:3},{value:"Method 2: Connect via Wi-Fi",id:"method-2-connect-via-wi-fi-1",level:3},{value:"Building your app for production",id:"building-your-app-for-production-1",level:2},{value:"1. Enable Debugging over USB",id:"1-enable-debugging-over-usb-2",level:3},{value:"2. Plug in your device via USB",id:"2-plug-in-your-device-via-usb-2",level:3},{value:"3. Run your app",id:"3-run-your-app-2",level:3},{value:"Method 1: Using adb reverse (recommended)",id:"method-1-using-adb-reverse-recommended-2",level:3},{value:"Method 2: Connect via Wi-Fi",id:"method-2-connect-via-wi-fi-2",level:3},{value:"Building your app for production",id:"building-your-app-for-production-2",level:2},{value:"Running your app on iOS devices",id:"running-your-app-on-ios-devices",level:2},{value:"Development OS",id:"development-os-1",level:4},{value:"1. Plug in your device via USB",id:"1-plug-in-your-device-via-usb",level:3},{value:"2. Configure code signing",id:"2-configure-code-signing",level:3},{value:"3. Build and Run your app",id:"3-build-and-run-your-app",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3},{value:"1. Wi-Fi network.",id:"1-wi-fi-network",level:4},{value:"2. IP address",id:"2-ip-address",level:4},{value:"Building your app for production",id:"building-your-app-for-production-3",level:2}];function p(e){let n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"It's always a good idea to test your app on an actual device before releasing it to your users. This document will guide you through the necessary steps to run your React Native app on a device and to get it ready for production."}),"\n",(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["If you used ",(0,r.jsx)(n.code,{children:"create-expo-app"})," to set up your project, you can run your app on a device in Expo Go by scanning the QR code that is displayed when you run ",(0,r.jsx)(n.code,{children:"npm start"}),". Refer to the Expo guide for ",(0,r.jsx)(n.a,{href:"https://docs.expo.dev/get-started/expo-go/",children:"running your project on your device"})," for more information."]})}),"\n",(0,r.jsxs)(a.A,{groupId:"platform",queryString:!0,defaultValue:d.A.defaultPlatform,values:d.A.platforms,className:"pill-tabs",children:[(0,r.jsxs)(s.A,{value:"android",children:[(0,r.jsx)(n.h2,{id:"running-your-app-on-android-devices",children:"Running your app on Android devices"}),(0,r.jsx)(n.h4,{id:"development-os",children:"Development OS"}),(0,r.jsxs)(a.A,{groupId:"os",queryString:!0,defaultValue:d.A.defaultOs,values:d.A.oses,className:"pill-tabs",children:[(0,r.jsxs)(s.A,{value:"macos",children:[(0,r.jsx)(n.h3,{id:"1-enable-debugging-over-usb",children:"1. Enable Debugging over USB"}),(0,r.jsx)(n.p,{children:"Most Android devices can only install and run apps downloaded from Google Play, by default. You will need to enable USB Debugging on your device in order to install your app during development."}),(0,r.jsxs)(n.p,{children:['To enable USB debugging on your device, you will first need to enable the "Developer options" menu by going to ',(0,r.jsx)(n.strong,{children:"Settings"})," \u2192 ",(0,r.jsx)(n.strong,{children:"About phone"})," \u2192 ",(0,r.jsx)(n.strong,{children:"Software information"})," and then tapping the ",(0,r.jsx)(n.code,{children:"Build number"})," row at the bottom seven times. You can then go back to ",(0,r.jsx)(n.strong,{children:"Settings"})," \u2192 ",(0,r.jsx)(n.strong,{children:"Developer options"}),' to enable "USB debugging".']}),(0,r.jsx)(n.h3,{id:"2-plug-in-your-device-via-usb",children:"2. Plug in your device via USB"}),(0,r.jsx)(n.p,{children:"Let's now set up an Android device to run our React Native projects. Go ahead and plug in your device via USB to your development machine."}),(0,r.jsxs)(n.p,{children:["Now check that your device is properly connecting to ADB, the Android Debug Bridge, by running ",(0,r.jsx)(n.code,{children:"adb devices"}),"."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ adb devices\nList of devices attached\nemulator-5554 offline # Google emulator\n14ed2fcc device # Physical device\n"})}),(0,r.jsxs)(n.p,{children:["Seeing ",(0,r.jsx)(n.code,{children:"device"})," in the right column means the device is connected. You must have ",(0,r.jsx)(n.strong,{children:"only one device connected"})," at a time."]}),(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["If you see ",(0,r.jsx)(n.code,{children:"unauthorized"})," in the list you will need to run ",(0,r.jsx)(n.code,{children:"adb reverse tcp:8081 tcp:8081"})," and press allow USB debugging on the device."]})}),(0,r.jsx)(n.h3,{id:"3-run-your-app",children:"3. Run your app"}),(0,r.jsx)(n.p,{children:"From the root of your project; type the following in your command prompt to install and launch your app on the device:"}),(0,r.jsxs)(a.A,{groupId:"package-manager",queryString:!0,defaultValue:d.A.defaultPackageManager,values:d.A.packageManagers,children:[(0,r.jsx)(s.A,{value:"npm",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"npm run android\n"})})}),(0,r.jsx)(s.A,{value:"yarn",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"yarn android\n"})})})]}),(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:['If you get a "bridge configuration isn\'t available" error, see ',(0,r.jsx)(n.a,{href:"/docs/0.81/running-on-device#method-1-using-adb-reverse-recommended",children:"Using adb reverse"}),"."]})}),(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["You can also use the ",(0,r.jsx)(n.code,{children:"React Native CLI"})," to generate and run a ",(0,r.jsx)(n.code,{children:"release"})," build (e.g. from the root of your project: ",(0,r.jsx)(n.code,{children:"yarn android --mode release"}),")."]})}),(0,r.jsx)("h2",{children:"Connecting to the development server"}),(0,r.jsx)(n.p,{children:"You can also iterate quickly on a device by connecting to the development server running on your development machine. There are several ways of accomplishing this, depending on whether you have access to a USB cable or a Wi-Fi network."}),(0,r.jsx)(n.h3,{id:"method-1-using-adb-reverse-recommended",children:"Method 1: Using adb reverse (recommended)"}),(0,r.jsx)(n.p,{children:"You can use this method if your device is running Android 5.0 (Lollipop) or newer, it has USB debugging enabled, and it is connected via USB to your development machine."}),(0,r.jsx)(n.p,{children:"Run the following in a command prompt:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ adb -s <device name> reverse tcp:8081 tcp:8081\n"})}),(0,r.jsx)(n.p,{children:"To find the device name, run the following adb command:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ adb devices\n"})}),(0,r.jsxs)(n.p,{children:["You can now enable Fast Refresh from the ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#opening-the-dev-menu",children:"Dev Menu"}),". Your app will reload whenever your JavaScript code has changed."]}),(0,r.jsx)(n.h3,{id:"method-2-connect-via-wi-fi",children:"Method 2: Connect via Wi-Fi"}),(0,r.jsx)(n.p,{children:"You can also connect to the development server over Wi-Fi. You'll first need to install the app on your device using a USB cable, but once that has been done you can debug wirelessly by following these instructions. You'll need your development machine's current IP address before proceeding."}),(0,r.jsxs)(n.p,{children:["You can find the IP address in ",(0,r.jsx)(n.strong,{children:"System Settings (or System Preferences)"})," \u2192 ",(0,r.jsx)(n.strong,{children:"Network"}),"."]}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Make sure your laptop and your phone are on the ",(0,r.jsx)(n.strong,{children:"same"})," Wi-Fi network."]}),"\n",(0,r.jsx)(n.li,{children:"Open your React Native app on your device."}),"\n",(0,r.jsxs)(n.li,{children:["You'll see a ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#logbox",children:"red screen with an error"}),". This is OK. The following steps will fix that."]}),"\n",(0,r.jsxs)(n.li,{children:["Open the in-app ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#opening-the-dev-menu",children:"Dev Menu"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Go to ",(0,r.jsx)(n.strong,{children:"Dev Settings"})," \u2192 ",(0,r.jsx)(n.strong,{children:"Debug server host & port for device"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Type in your machine's IP address and the port of the local dev server (e.g. ",(0,r.jsx)(n.code,{children:"10.0.1.1:8081"}),")."]}),"\n",(0,r.jsxs)(n.li,{children:["Go back to the ",(0,r.jsx)(n.strong,{children:"Dev Menu"})," and select ",(0,r.jsx)(n.strong,{children:"Reload JS"}),"."]}),"\n"]}),(0,r.jsxs)(n.p,{children:["You can now enable Fast Refresh from the ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#opening-the-dev-menu",children:"Dev Menu"}),". Your app will reload whenever your JavaScript code has changed."]}),(0,r.jsx)(n.h2,{id:"building-your-app-for-production",children:"Building your app for production"}),(0,r.jsxs)(n.p,{children:["You have built a great app using React Native, and you are now itching to release it in the Play Store. The process is the same as any other native Android app, with some additional considerations to take into account. Follow the guide for ",(0,r.jsx)(n.a,{href:"/docs/0.81/signed-apk-android",children:"generating a signed APK"})," to learn more."]})]}),(0,r.jsxs)(s.A,{value:"windows",children:[(0,r.jsx)(n.h3,{id:"1-enable-debugging-over-usb-1",children:"1. Enable Debugging over USB"}),(0,r.jsx)(n.p,{children:"Most Android devices can only install and run apps downloaded from Google Play, by default. You will need to enable USB Debugging on your device in order to install your app during development."}),(0,r.jsxs)(n.p,{children:['To enable USB debugging on your device, you will first need to enable the "Developer options" menu by going to ',(0,r.jsx)(n.strong,{children:"Settings"})," \u2192 ",(0,r.jsx)(n.strong,{children:"About phone"})," \u2192 ",(0,r.jsx)(n.strong,{children:"Software information"})," and then tapping the ",(0,r.jsx)(n.code,{children:"Build number"})," row at the bottom seven times. You can then go back to ",(0,r.jsx)(n.strong,{children:"Settings"})," \u2192 ",(0,r.jsx)(n.strong,{children:"Developer options"}),' to enable "USB debugging".']}),(0,r.jsx)(n.h3,{id:"2-plug-in-your-device-via-usb-1",children:"2. Plug in your device via USB"}),(0,r.jsx)(n.p,{children:"Let's now set up an Android device to run our React Native projects. Go ahead and plug in your device via USB to your development machine."}),(0,r.jsxs)(n.p,{children:["Now check that your device is properly connecting to ADB, the Android Debug Bridge, by running ",(0,r.jsx)(n.code,{children:"adb devices"}),"."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ adb devices\nList of devices attached\nemulator-5554 offline # Google emulator\n14ed2fcc device # Physical device\n"})}),(0,r.jsxs)(n.p,{children:["Seeing ",(0,r.jsx)(n.code,{children:"device"})," in the right column means the device is connected. You must have ",(0,r.jsx)(n.strong,{children:"only one device connected"})," at a time."]}),(0,r.jsx)(n.h3,{id:"3-run-your-app-1",children:"3. Run your app"}),(0,r.jsx)(n.p,{children:"From the root of your project, run the following in your command prompt to install and launch your app on the device:"}),(0,r.jsxs)(a.A,{groupId:"package-manager",queryString:!0,defaultValue:d.A.defaultPackageManager,values:d.A.packageManagers,children:[(0,r.jsx)(s.A,{value:"npm",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"npm run android\n"})})}),(0,r.jsx)(s.A,{value:"yarn",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"yarn android\n"})})})]}),(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["You can also use the ",(0,r.jsx)(n.code,{children:"React Native CLI"})," to generate and run a ",(0,r.jsx)(n.code,{children:"release"})," build (e.g. from the root of your project: ",(0,r.jsx)(n.code,{children:"yarn android --mode release"}),")."]})}),(0,r.jsx)("h2",{children:"Connecting to the development server"}),(0,r.jsx)(n.p,{children:"You can also iterate quickly on a device by connecting to the development server running on your development machine. There are several ways of accomplishing this, depending on whether you have access to a USB cable or a Wi-Fi network."}),(0,r.jsx)(n.h3,{id:"method-1-using-adb-reverse-recommended-1",children:"Method 1: Using adb reverse (recommended)"}),(0,r.jsx)(n.p,{children:"You can use this method if your device is running Android 5.0 (Lollipop) or newer, it has USB debugging enabled, and it is connected via USB to your development machine."}),(0,r.jsx)(n.p,{children:"Run the following in a command prompt:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ adb -s <device name> reverse tcp:8081 tcp:8081\n"})}),(0,r.jsx)(n.p,{children:"To find the device name, run the following adb command:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ adb devices\n"})}),(0,r.jsxs)(n.p,{children:["You can now enable Fast Refresh from the ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#opening-the-dev-menu",children:"Dev Menu"}),". Your app will reload whenever your JavaScript code has changed."]}),(0,r.jsx)(n.h3,{id:"method-2-connect-via-wi-fi-1",children:"Method 2: Connect via Wi-Fi"}),(0,r.jsx)(n.p,{children:"You can also connect to the development server over
1 Wi-Fi. You'll first need to install the app on your device using a USB cable, but once that has been done you can debug wirelessly by following these instructions. You'll need your development machine's current IP address before proceeding."}),(0,r.jsxs)(n.p,{children:["Open the command prompt and type ",(0,r.jsx)(n.code,{children:"ipconfig"})," to find your machine's IP address (",(0,r.jsx)(n.a,{href:"https://windows.microsoft.com/en-us/windows/using-command-line-tools-networking-information",children:"more info"}),")."]}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Make sure your laptop and your phone are on the ",(0,r.jsx)(n.strong,{children:"same"})," Wi-Fi network."]}),"\n",(0,r.jsx)(n.li,{children:"Open your React Native app on your device."}),"\n",(0,r.jsxs)(n.li,{children:["You'll see a ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#logbox",children:"red screen with an error"}),". This is OK. The following steps will fix that."]}),"\n",(0,r.jsxs)(n.li,{children:["Open the in-app ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#opening-the-dev-menu",children:"Dev Menu"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Go to ",(0,r.jsx)(n.strong,{children:"Dev Settings"})," \u2192 ",(0,r.jsx)(n.strong,{children:"Debug server host & port for device"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Type in your machine's IP address and the port of the local dev server (e.g. ",(0,r.jsx)(n.code,{children:"10.0.1.1:8081"}),")."]}),"\n",(0,r.jsxs)(n.li,{children:["Go back to the ",(0,r.jsx)(n.strong,{children:"Dev Menu"})," and select ",(0,r.jsx)(n.strong,{children:"Reload JS"}),"."]}),"\n"]}),(0,r.jsxs)(n.p,{children:["You can now enable Fast Refresh from the ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#opening-the-dev-menu",children:"Dev Menu"}),". Your app will reload whenever your JavaScript code has changed."]}),(0,r.jsx)(n.h2,{id:"building-your-app-for-production-1",children:"Building your app for production"}),(0,r.jsxs)(n.p,{children:["You have built a great app using React Native, and you are now itching to release it in the Play Store. The process is the same as any other native Android app, with some additional considerations to take into account. Follow the guide for ",(0,r.jsx)(n.a,{href:"/docs/0.81/signed-apk-android",children:"generating a signed APK"})," to learn more."]})]}),(0,r.jsxs)(s.A,{value:"linux",children:[(0,r.jsx)(n.h3,{id:"1-enable-debugging-over-usb-2",children:"1. Enable Debugging over USB"}),(0,r.jsx)(n.p,{children:"Most Android devices can only install and run apps downloaded from Google Play, by default. You will need to enable USB Debugging on your device in order to install your app during development."}),(0,r.jsxs)(n.p,{children:['To enable USB debugging on your device, you will first need to enable the "Developer options" menu by going to ',(0,r.jsx)(n.strong,{children:"Settings"})," \u2192 ",(0,r.jsx)(n.strong,{children:"About phone"})," \u2192 ",(0,r.jsx)(n.strong,{children:"Software information"})," and then tapping the ",(0,r.jsx)(n.code,{children:"Build number"})," row at the bottom seven times. You can then go back to ",(0,r.jsx)(n.strong,{children:"Settings"})," \u2192 ",(0,r.jsx)(n.strong,{children:"Developer options"}),' to enable "USB debugging".']}),(0,r.jsx)(n.h3,{id:"2-plug-in-your-device-via-usb-2",children:"2. Plug in your device via USB"}),(0,r.jsx)(n.p,{children:"Let's now set up an Android device to run our React Native projects. Go ahead and plug in your device via USB to your development machine."}),(0,r.jsxs)(n.p,{children:["Next, check the manufacturer code by using ",(0,r.jsx)(n.code,{children:"lsusb"})," (on mac, you must first ",(0,r.jsx)(n.a,{href:"https://github.com/jlhonora/lsusb",children:"install lsusb"}),"). ",(0,r.jsx)(n.code,{children:"lsusb"})," should output something like this:"]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ lsusb\nBus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub\nBus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub\nBus 001 Device 003: ID 22b8:2e76 Motorola PCS\nBus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub\nBus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub\nBus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub\nBus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub\n"})}),(0,r.jsx)(n.p,{children:"These lines represent the USB devices currently connected to your machine."}),(0,r.jsx)(n.p,{children:"You want the line that represents your phone. If you're in doubt, try unplugging your phone and running the command again:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"$ lsusb\nBus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub\nBus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub\nBus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub\nBus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub\nBus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub\nBus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub\n"})}
1),(0,r.jsx)(n.p,{children:'You\'ll see that after removing the phone, the line which has the phone model ("Motorola PCS" in this case) disappeared from the list. This is the line that we care about.'}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"Bus 001 Device 003: ID 22b8:2e76 Motorola PCS"})}),(0,r.jsx)(n.p,{children:"From the above line, you want to grab the first four digits from the device ID:"}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"22b8:2e76"})}),(0,r.jsxs)(n.p,{children:["In this case, it's ",(0,r.jsx)(n.code,{children:"22b8"}),". That's the identifier for Motorola."]}),(0,r.jsx)(n.p,{children:"You'll need to input this into your udev rules in order to get up and running:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:'echo \'SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", MODE="0666", GROUP="plugdev"\' | sudo tee /etc/udev/rules.d/51-android-usb.rules\n'})}),(0,r.jsxs)(n.p,{children:["Make sure that you replace ",(0,r.jsx)(n.code,{children:"22b8"})," with the identifier you get in the above command."]}),(0,r.jsxs)(n.p,{children:["Now check that your device is properly connecting to ADB, the Android Debug Bridge, by running ",(0,r.jsx)(n.code,{children:"adb devices"}),"."]}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ adb devices\nList of devices attached\nemulator-5554 offline # Google emulator\n14ed2fcc device # Physical device\n"})}),(0,r.jsxs)(n.p,{children:["Seeing ",(0,r.jsx)(n.code,{children:"device"})," in the right column means the device is connected. You must have ",(0,r.jsx)(n.strong,{children:"only one device connected"})," at a time."]}),(0,r.jsx)(n.h3,{id:"3-run-your-app-2",children:"3. Run your app"}),(0,r.jsx)(n.p,{children:"From the root of your project, type the following in your command prompt to install and launch your app on the device:"}),(0,r.jsxs)(a.A,{groupId:"package-manager",queryString:!0,defaultValue:d.A.defaultPackageManager,values:d.A.packageManagers,children:[(0,r.jsx)(s.A,{value:"npm",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"npm run android\n"})})}),(0,r.jsx)(s.A,{value:"yarn",children:(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"yarn android\n"})})})]}),(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:['If you get a "bridge configuration isn\'t available" error, see ',(0,r.jsx)(n.a,{href:"/docs/0.81/running-on-device#method-1-using-adb-reverse-recommended",children:"Using adb reverse"}),"."]})}),(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["You can also use the ",(0,r.jsx)(n.code,{children:"React Native CLI"})," to generate and run a ",(0,r.jsx)(n.code,{children:"release"})," build (e.g. from the root of your project: ",(0,r.jsx)(n.code,{children:"yarn android --mode release"}),")."]})}),(0,r.jsx)("h2",{children:"Connecting to the development server"}),(0,r.jsx)(n.p,{children:"You can also iterate quickly on a device by connecting to the development server running on your development machine. There are several ways of accomplishing this, depending on whether you have access to a USB cable or a Wi-Fi network."}),(0,r.jsx)(n.h3,{id:"method-1-using-adb-reverse-recommended-2",children:"Method 1: Using adb reverse (recommended)"}),(0,r.jsx)(n.p,{children:"You can use this method if your device is running Android 5.0 (Lollipop) or newer, it has USB debugging enabled, and it is connected via USB to your development machine."}),(0,r.jsx)(n.p,{children:"Run the following in a command prompt:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ adb -s <device name> reverse tcp:8081 tcp:8081\n"})}),(0,r.jsx)(n.p,{children:"To find the device name, run the following adb command:"}),(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-shell",children:"$ adb devices\n"})}),(0,r.jsxs)(n.p,{children:["You can now enable Fast Refresh from the ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#opening-the-dev-menu",children:"Dev Menu"}),". Your app will reload whenever your JavaScript code has changed."]}),(0,r.jsx)(n.h3,{id:"method-2-connect-via-wi-fi-2",children:"Method 2: Connect via Wi-Fi"}),(0,r.jsx)(n.p,{children:"You can also connect to the development server over Wi-Fi. You'll first need to install the app on your device using a USB cable, but once that has been done you can debug wirelessly by following these instructions. You'll need your development machine's current IP address before proceeding."}),(0,r.jsxs)(n.p,{children:["Open a terminal and type ",(0,r.jsx)(n.code,{children:"/sbin/ifconfig"})," to find your machine's IP address."]}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Make sure your laptop and your phone are on the ",(0,r.jsx)(n.strong,{children:"same"})," Wi-Fi network."]}),"\n",(0,r.jsx)(n.li,{children:"Open your React Native app on your device."}),"\n",(0,r.jsxs)(n.li,{children:["You'll see a ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#logbox",children:"red screen with an error"}),". This is OK. The following steps will fix that."]}),"\n",(0,r.jsxs)(n.li,{children:["Open the in-app ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#opening-the-dev-menu",children:"Dev Menu"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Go to ",(0,r.jsx)(n.strong,{children:"Dev Settings"})," \u2192 ",(0,r.jsx)(n.strong,{children:"Debug server host & port for device"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Type in your machine's IP address and the port of the local dev server (e.g. ",(0,r.jsx)(n.code,{children:"10.0.1.1:8081"}),")."]}),"\n",(0,r.jsxs)(n.li,{children:["Go back to the ",(0,r.jsx)(n.strong,{children:"Dev Menu"})," and select ",(0,r.jsx)(n.strong,{children:"Reload JS"}),"."]}),"\n"]}),(0,r.jsxs)(n.p,{children:["You can now enable Fast Refresh from the ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#opening-the-dev-menu",children:"Dev Menu"}),". Your app will reload whenever your JavaScript code has changed."]}),(0,r.jsx)(n.h2,{id:"building-your-app-for-production-2",children:"Building your app for production"}),(0,r.jsxs)(n.p,{children:["You have built a great app using React Native, and you are now itching to release it in the Play Store. The process is the same as any other native Android app, with some additional considerations to take into account. Follow the guide for ",(0,r.jsx)(n.a,{href:"/docs/0.81/signed-apk-android",children:"generating a signed APK"})," to learn more."]})]})]})]}),(0,r.jsxs)(s.A,{value:"ios",children:[(0,r.jsx)(n.h2,{id:"running-your-app-on-ios-devices",children:"Running your app on iOS devices"}),(0,r.jsx)(n.h4,{id:"development-os-1",children:"Development OS"}),(0,r.jsxs)(a.A,{groupId:"os",queryString:!0,defaultValue:d.A.defaultOs,values:d.A.oses,className:"pill-tabs",children:[(0,r.jsxs)(s.A,{value:"macos",children:[(0,r.jsx)(n.h3,{id:"1-plug-in-your-device-via-usb",children:"1. Plug in your device via USB"}),(0,r.jsxs)(n.p,{children:["Connect your iOS device to your Mac using a USB to Lightning or USB-C cable. Navigate to the ",(0,r.jsx)(n.code,{children:"ios"})," folder in your project, then open the ",(0,r.jsx)(n.code,{children:".xcodeproj"})," file, or if you are using CocoaPods open ",(0,r.jsx)(n.code,{children:".xcworkspace"}),", within it using Xcode."]}
1),(0,r.jsxs)(n.p,{children:["If this is your first time running an app on your iOS device, you may need to register your device for development. Open the ",(0,r.jsx)(n.strong,{children:"Product"})," menu from Xcode's menubar, then go to ",(0,r.jsx)(n.strong,{children:"Destination"}),". Look for and select your device from the list. Xcode will then register your device for development."]}),(0,r.jsx)(n.h3,{id:"2-configure-code-signing",children:"2. Configure code signing"}),(0,r.jsxs)(n.p,{children:["Register for an ",(0,r.jsx)(n.a,{href:"https://developer.apple.com/",children:"Apple Developer account"})," if you don't have one yet."]}),(0,r.jsx)(n.p,{children:'Select your project in the Xcode Project Navigator, then select your main target (it should share the same name as your project). Look for the "General" tab. Go to "Signing" and make sure your Apple Developer account or team is selected under the Team dropdown. Do the same for the tests target (it ends with Tests, and is below your main target).'}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Repeat"})," this step for the ",(0,r.jsx)(n.strong,{children:"Tests"})," target in your project."]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:o(20118).A+"",width:"809",height:"446"})}),(0,r.jsx)(n.h3,{id:"3-build-and-run-your-app",children:"3. Build and Run your app"}),(0,r.jsxs)(n.p,{children:["If everything is set up correctly, your device will be listed as the build target in the Xcode toolbar, and it will also appear in the Devices pane (",(0,r.jsx)("kbd",{children:"Shift \u21E7"})," + ",(0,r.jsx)("kbd",{children:"Cmd \u2318"})," + ",(0,r.jsx)("kbd",{children:"2"}),"). You can now press the ",(0,r.jsx)(n.strong,{children:"Build and run"})," button (",(0,r.jsx)("kbd",{children:"Cmd \u2318"})," + ",(0,r.jsx)("kbd",{children:"R"}),") or select ",(0,r.jsx)(n.strong,{children:"Run"})," from the ",(0,r.jsx)(n.strong,{children:"Product"})," menu. Your app will launch on your device shortly."]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:o(40043).A+"",width:"641",height:"29"})}),(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["If you run into any issues, please take a look at Apple's ",(0,r.jsx)(n.a,{href:"https://developer.apple.com/library/content/documentation/IDEs/Conceptual/AppDistributionGuide/LaunchingYourApponDevices/LaunchingYourApponDevices.html#//apple_ref/doc/uid/TP40012582-CH27-SW4",children:"Launching Your App on a Device"})," docs."]})}),(0,r.jsx)("h2",{children:"Connecting to the development server"}),(0,r.jsxs)(n.p,{children:["You can also iterate quickly on a device using the development server. You only have to be on the same Wi-Fi network as your computer. Shake your device to open the ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#opening-the-dev-menu",children:"Dev Menu"}),", then enable Fast Refresh. Your app will reload whenever your JavaScript code has changed."]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:o(11252).A+"",width:"1600",height:"840"})}),(0,r.jsx)(n.h3,{id:"troubleshooting",children:"Troubleshooting"}),(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsx)(n.p,{children:"If you have any issues, ensure that your Mac and device are on the same network and can reach each other. Many open wireless networks with captive portals are configured to prevent devices from reaching other devices on the network. You may use your device's Personal Hotspot feature in this case. You may also share your internet (Wi-Fi/Ethernet) connection from your Mac to your device via USB and connect to the bundler through this tunnel for very high transfer speeds."})}),(0,r.jsxs)(n.p,{children:["When trying to connect to the development server you might get a ",(0,r.jsx)(n.a,{href:"/docs/0.81/debugging#logbox",children:"red screen with an error"})," saying:"]}),(0,r.jsx)(n.admonition,{type:"note",children:(0,r.jsxs)(n.p,{children:["Connection to ",(0,r.jsx)(n.code,{children:"http://localhost:8081/debugger-proxy?role=client"})," timed out. Are you running node proxy? If you are running on the device, check if you have the right IP address in ",(0,r.jsx)(n.code,{children:"RCTWebSocketExecutor.m"}),"."]})}),(0,r.jsx)(n.p,{children:"To solve this issue check the following points."}),(0,r.jsx)(n.h4,{id:"1-wi-fi-network",children:"1. Wi-Fi network."}),(0,r.jsxs)(n.p,{children:["Make sure your laptop and your phone are on the ",(0,r.jsx)(n.strong,{children:"same"})," Wi-Fi network."]}),(0,r.jsx)(n.h4,{id:"2-ip-address",children:"2. IP address"}),(0,r.jsxs)(n.p,{children:["Make sure that the build script detected the IP address of your machine correctly (e.g. ",(0,r.jsx)(n.code,{children:"10.0.1.123"}),")."]}),(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{src:o(4208).A+"",width:"1400",height:"936"})}),(0,r.jsxs)(n.p,{children:["Open the ",(0,r.jsx)(n.strong,{children:"Report navigator"})," tab, select the last ",(0,r.jsx)(n.strong,{children:"Build"})," and search for ",(0,r.jsx)(n.code,{children:"IP="})," followed by an IP address. The IP address which gets embedded in the app should match your machines IP address."]}),(0,r.jsx)(n.h2,{id:"building-your-app-for-production-3",children:"Building your app for production"}),(0,r.jsxs)(n.p,{children:["You have built a great app using React Native, and you are now itching to release it in the App Store. The process is the same as any other native iOS app, with some additional considerations to take into account. Follow the guide for ",(0,r.jsx)(n.a,{href:"/docs/0.81/publishing-to-app-store",children:"publishing to the Apple App Store"})," to learn more."]})]}),(0,r.jsx)(s.A,{value:"windows",children:(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsxs)(n.p,{children:["A Mac is required in order to build your app for iOS devices. Alternatively, you can refer to our ",(0,r.jsx)(n.a,{href:"environment-setup",children:"environment setup guide"})," to learn how to build your app using Expo CLI, which will allow you to run your app using the Expo client app."]})})}),(0,r.jsx)(s.A,{value:"linux",children:(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsxs)(n.p,{children:["A Mac is required in order to build your app for iOS devices. Alternatively, you can refer to our ",(0,r.jsx)(n.a,{href:"environment-setup",children:"environment setup guide"})," to learn how to build your app using Expo CLI, which will allow you to run your app using the Expo client app."]})})})]})]})]})]})}function g(e={}){let{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},20118(e,n,o){o.d(n,{A:()=>i});let i=o.p+"assets/images/RunningOnDeviceCodeSigning-daffe4c45a59c3f5031b35f6b24def1d.png"},40043(e,n,o){o.d(n,{A:()=>i});let i="data:image/png;base64,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"},4208(e,n,o){o.d(n,{A:()=>i});let i=o.p+"assets/images/XcodeBuildIP-dfc8243436f5436466109acb8f9e0502.png"},11252(e,n,o){o.d(n,{A:()=>i});let i=o.p+"assets/images/debugging-dev-menu-076-0057c62ed9b02b1447966892b11ee39a.jpg"},98263(e,n,o){o.d(n,{A:()=>s});var i=o(62540);o(63696);var r=o(11750),t=o(23865);function a({children:e,className:n,hidden:o}){return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)("tabItem_wHwb",n),hidden:o,children:e})}function s({children:e,className:n,value:o}){let{selectedValue:r,lazy:d}=(0,t.uc)(),l=o===r;return!l&&d?null:(0,i.jsx)(a,{className:n,hidden:!l,children:e})}},77779(e,n,o){o.d(n,{A:()=>h});var i=o(62540);o(63696);var r=o(11750),t=o(46065),a=o(23865),s=o(45194),d=o(83029);function l({className:e}){let{selectedValue:n,selectValue:o,tabValues:t,block:d}=(0,a.uc)(),c=[],{blockElementScrollPositionUntilNextRender:u}=(0,s.a_)(),h=e=>{let i=e.currentTarget,r=t[c.indexOf(i)].value;r!==n&&(u(i),o(r))},p=e=>{let n=null;switch(e.key){case"Enter":h(e);break;case"ArrowRight":{let o=c.indexOf(e.currentTarget)+1;n=c[o]??c[0];break}case"ArrowLeft":{let o=c.indexOf(e.currentTarget)-1;n=c[o]??c[c.length-1]}}n?.focus()};return(0,i.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":d},e),children:t.map(({value:e,label:o,attributes:t})=>(0,i.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{c.push(e)},onKeyDown:p,onClick:h,...t,className:(0,r.A)("tabs__item","tabItem_l0OV",t?.className,{"tabs__item--active":n===e}),children:o??e},e))})}function c({children:e}){return(0,i.jsx)("div",{className:"margin-top--md",children:e})}function u({className:e,children:n}){return(0,i.jsxs)("div",{className:(0,r.A)(t.G.tabs.container,"tabs-container","tabList_J5MA"),children:[(0,i.jsx)(l,{className:e}),(0,i.jsx)(c,{children:n})]})}function h(e){let n=(0,d.A)(),o=(0,a.OC)(e);return(0,i.jsx)(a.O_,{value:o,children:(0,i.jsx)(u,{className:e.className,children:(0,a.vT)(e.children)})},String(n))}},23865(e,n,o){o.d(n,{OC:()=>h,O_:()=>v,uc:()=>g,vT:()=>c});var i=o(62540),r=o(63696),t=o(49519),a=o(6743),s=o(88511),d=o(15396),l=o(89030);function c(e){return r.Children.toArray(e).filter(e=>"\n"!==e)}function u({value:e,tabValues:n}){return n.some(n=>n.value===e)}function h(e){let n,{defaultValue:o,queryString:i=!1,groupId:c}=e,h=function(e){let{values:n,children:o}=e;return(0,r.useMemo)(()=>{let e=n??r.Children.toArray(o).flatMap(e=>{if(!e)return[];if((0,r.isValidElement)(e)&&function(e){let{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return[e];
1let n="string"==typeof e.type?e.type:e.type.name;throw Error(`Docusaurus error: Bad <Tabs> child <${n}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop. 2If you do not want to pass on a "value" prop to the direct children of <Tabs>, you can also pass an explicit <Tabs values={...}> prop.`)}).map(({props:{value:e,label:n,attributes:o,default:i}})=>({value:e,label:n,attributes:o,default:i})),i=(0,d.XI)(e,(e,n)=>e.value===n.value);if(i.length>0)throw Error(`Docusaurus error: Duplicate values "${i.map(e=>`'${e.value}'`).join(", ")}" found in <Tabs>. Every value needs to be unique.`);return e},[n,o])}(e),[p,g]=(0,r.useState)(()=>(function({defaultValue:e,tabValues:n}){if(0===n.length)throw Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!u({value:e,tabValues:n}))throw Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}let o=n.find(e=>e.default)??n[0];if(!o)throw Error("Unexpected error: 0 tabValues");return o.value})({defaultValue:o,tabValues:h})),[v,x]=function({queryString:e=!1,groupId:n}){let o=(0,t.W6)(),i=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,s.aZ)(i),(0,r.useCallback)(e=>{if(!i)return;let n=new URLSearchParams(o.location.search);n.set(i,e),o.replace({...o.location,search:n.toString()})},[i,o])]}({queryString:i,groupId:c}),[f,m]=function({groupId:e}){let n=e?`docusaurus.tab.${e}`:null,[o,i]=(0,l.Dv)(n);return[o,(0,r.useCallback)(e=>{n&&i.set(e)},[n,i])]}({groupId:c}),b=u({value:n=v??f,tabValues:h})?n:null;return(0,a.A)(()=>{b&&g(b)},[b]),{selectedValue:p,selectValue:(0,r.useCallback)(e=>{if(!u({value:e,tabValues:h}))throw Error(`Can't select invalid tab value=${e}`);g(e),x(e),m(e)},[x,m,h]),tabValues:h,lazy:e.lazy??!1,block:e.block??!1}}let p=(0,r.createContext)(null);function g(){let e=r.useContext(p);if(!e)throw Error("useTabsContext() must be used within a Tabs component");return e}function v(e){return(0,i.jsx)(p.Provider,{value:e.value,children:e.children})}},38469(e,n,o){o.d(n,{A:()=>a});var i=o(93227);let r=!!i.A.canUseDOM&&navigator.platform.startsWith("Mac"),t=!!i.A.canUseDOM&&navigator.platform.startsWith("Win"),a={defaultGuide:"quickstart",defaultJsDebugger:"flipper",defaultOs:r?"macos":t?"windows":"linux",defaultPackageManager:"npm",defaultPlatform:r?"ios":"android",defaultSyntax:"functional",defaultAndroidLanguage:"java",defaultAppleLanguage:"objc",defaultJavaScriptSpecLanguages:"typescript",getDevNotesTabs:(e=["android","ios","web","windows"])=>[e.includes("android")?{label:"Android",value:"android"}:void 0,e.includes("ios")?{label:"iOS",value:"ios"}:void 0,e.includes("web")?{label:"Web",value:"web"}:void 0,e.includes("windows")?{label:"Windows",value:"windows"}:void 0].filter(Boolean),guides:[{label:"Expo Go Quickstart",value:"quickstart"},{label:"React Native CLI Quickstart",value:"native"}],oses:[{label:"macOS",value:"macos"},{label:"Windows",value:"windows"},{label:"Linux",value:"linux"}],packageManagers:[{label:"npm",value:"npm"},{label:"Yarn",value:"yarn"}],platforms:[{label:"Android",value:"android"},{label:"iOS",value:"ios"}],syntax:[{label:"Function Component",value:"functional"},{label:"Class Component",value:"classical"}],androidLanguages:[{label:"Java",value:"java"},{label:"Kotlin",value:"kotlin"}],appleLanguages:[{label:"ObjectiveC",value:"objc"},{label:"Swift",value:"swift"}],javaScriptSpecLanguages:[{label:"TypeScript",value:"typescript"},{label:"Flow",value:"flow"}],jsDebuggers:[{label:"Hermes Debugger / Expo",value:"hermes"},{label:"Flipper",value:"flipper"},{label:"New Debugger (Experimental)",value:"new-debugger"}],snackLanguages:[{label:"TypeScript",value:"typescript"},{label:"JavaScript",value:"javascript"}],defaultSnackLanguage:"typescript"}},43023(e,n,o){o.d(n,{R:()=>a,x:()=>s});var i=o(63696);let r={},t=i.createContext(r);function a(e){let n=i.useContext(t);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.