├── .expo-shared └── assets.json ├── .github └── workflows │ └── codeql.yml ├── .gitignore ├── App.js ├── README.md ├── android ├── app │ ├── BUCK │ ├── build.gradle │ ├── build_defs.bzl │ ├── debug.keystore │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── roboflow │ │ │ └── RobofloExpoExample │ │ │ └── ReactNativeFlipper.java │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── roboflow │ │ │ └── RobofloExpoExample │ │ │ ├── MainActivity.java │ │ │ └── MainApplication.java │ │ └── res │ │ ├── drawable-hdpi │ │ └── splashscreen_image.png │ │ ├── drawable-mdpi │ │ └── splashscreen_image.png │ │ ├── drawable-xhdpi │ │ └── splashscreen_image.png │ │ ├── drawable-xxhdpi │ │ └── splashscreen_image.png │ │ ├── drawable-xxxhdpi │ │ └── splashscreen_image.png │ │ ├── drawable │ │ └── splashscreen.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_foreground.png │ │ └── ic_launcher_round.png │ │ ├── values-night │ │ └── colors.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── app.json ├── assets ├── adaptive-icon.png ├── favicon.png ├── icon.png └── splash.png ├── babel.config.js ├── index.js ├── ios ├── Podfile ├── Podfile.lock ├── Podfile.properties.json ├── RoboflowExpoExample.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ └── RoboflowExpoExample.xcscheme ├── RoboflowExpoExample.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings └── RoboflowExpoExample │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Images.xcassets │ ├── AppIcon.appiconset │ │ ├── App-Icon-20x20@1x.png │ │ ├── App-Icon-20x20@2x.png │ │ ├── App-Icon-20x20@3x.png │ │ ├── App-Icon-29x29@1x.png │ │ ├── App-Icon-29x29@2x.png │ │ ├── App-Icon-29x29@3x.png │ │ ├── App-Icon-40x40@1x.png │ │ ├── App-Icon-40x40@2x.png │ │ ├── App-Icon-40x40@3x.png │ │ ├── App-Icon-60x60@2x.png │ │ ├── App-Icon-60x60@3x.png │ │ ├── App-Icon-76x76@1x.png │ │ ├── App-Icon-76x76@2x.png │ │ ├── App-Icon-83.5x83.5@2x.png │ │ ├── Contents.json │ │ └── ItunesArtwork@2x.png │ ├── Contents.json │ ├── SplashScreen.imageset │ │ ├── Contents.json │ │ └── image.png │ └── SplashScreenBackground.imageset │ │ ├── Contents.json │ │ └── image.png │ ├── Info.plist │ ├── RobofloExpoExample.entitlements │ ├── RoboflowExpoExample-Bridging-Header.h │ ├── RoboflowFrameProcessorPlugin.m │ ├── RoboflowFrameProcessorPlugin.swift │ ├── SplashScreen.storyboard │ ├── Supporting │ └── Expo.plist │ ├── main.m │ └── noop-file.swift ├── metro.config.js ├── package.json ├── roboflowDetect.js └── yarn.lock /.expo-shared/assets.json: -------------------------------------------------------------------------------- 1 | { 2 | "12bb71342c6255bbf50437ec8f4441c083f47cdb74bd89160c15e4f43e52a1cb": true, 3 | "40b842e832070c58deac6aa9e08fa459302ee3f9da492c7e77d93d2fbf4a56fd": true 4 | } 5 | -------------------------------------------------------------------------------- /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ "main" ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ "main" ] 20 | schedule: 21 | - cron: '23 3 * * 1' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'javascript' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] 37 | # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support 38 | 39 | steps: 40 | - name: Checkout repository 41 | uses: actions/checkout@v3 42 | 43 | # Initializes the CodeQL tools for scanning. 44 | - name: Initialize CodeQL 45 | uses: github/codeql-action/init@v2 46 | with: 47 | languages: ${{ matrix.language }} 48 | # If you wish to specify custom queries, you can do so here or in a config file. 49 | # By default, queries listed here will override any specified in a config file. 50 | # Prefix the list here with "+" to use these queries and those in the config file. 51 | 52 | # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs 53 | # queries: security-extended,security-and-quality 54 | 55 | 56 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 57 | # If this step fails, then you should remove it and run the build manually (see below) 58 | - name: Autobuild 59 | uses: github/codeql-action/autobuild@v2 60 | 61 | # ℹ️ Command-line programs to run using the OS shell. 62 | # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun 63 | 64 | # If the Autobuild fails above, remove it and uncomment the following three lines. 65 | # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. 66 | 67 | # - run: | 68 | # echo "Run, Build Application using script" 69 | # ./location_of_script_within_repo/buildscript.sh 70 | 71 | - name: Perform CodeQL Analysis 72 | uses: github/codeql-action/analyze@v2 73 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .expo/ 3 | dist/ 4 | npm-debug.* 5 | *.jks 6 | *.p8 7 | *.p12 8 | *.key 9 | *.mobileprovision 10 | *.orig.* 11 | web-build/ 12 | 13 | # macOS 14 | .DS_Store 15 | 16 | # @generated expo-cli sync-e7dcf75f4e856f7b6f3239b3f3a7dd614ee755a8 17 | # The following patterns were generated by expo-cli 18 | 19 | # OSX 20 | # 21 | .DS_Store 22 | 23 | # Xcode 24 | # 25 | build/ 26 | *.pbxuser 27 | !default.pbxuser 28 | *.mode1v3 29 | !default.mode1v3 30 | *.mode2v3 31 | !default.mode2v3 32 | *.perspectivev3 33 | !default.perspectivev3 34 | xcuserdata 35 | *.xccheckout 36 | *.moved-aside 37 | DerivedData 38 | *.hmap 39 | *.ipa 40 | *.xcuserstate 41 | project.xcworkspace 42 | 43 | # Android/IntelliJ 44 | # 45 | build/ 46 | .idea 47 | .gradle 48 | local.properties 49 | *.iml 50 | *.hprof 51 | 52 | # node.js 53 | # 54 | node_modules/ 55 | npm-debug.log 56 | yarn-error.log 57 | 58 | # BUCK 59 | buck-out/ 60 | \.buckd/ 61 | *.keystore 62 | !debug.keystore 63 | 64 | # Bundle artifacts 65 | *.jsbundle 66 | 67 | # CocoaPods 68 | /ios/Pods/ 69 | 70 | # Expo 71 | .expo/ 72 | web-build/ 73 | dist/ 74 | 75 | # @end expo-cli -------------------------------------------------------------------------------- /App.js: -------------------------------------------------------------------------------- 1 | import "react-native-reanimated"; 2 | import { StyleSheet, Text, View, Dimensions } from "react-native"; 3 | import { 4 | useCameraDevices, 5 | Camera, 6 | useFrameProcessor, 7 | } from "react-native-vision-camera"; 8 | import { roboflowDetect } from "./roboflowDetect"; 9 | import { useState } from "react"; 10 | import { runOnJS } from "react-native-reanimated"; 11 | 12 | export default function App() { 13 | const devices = useCameraDevices("wide-angle-camera"); 14 | const device = devices.back; 15 | const [boxes, setBoxes] = useState([]); 16 | const [fps, setFps] = useState(0); 17 | const windowWidth = Dimensions.get("screen").width; 18 | const windowHeight = Dimensions.get("screen").height; 19 | var lastRunTime = Date.now(); 20 | 21 | const updateBboxes = (bs) => { 22 | setFps(1 / ((Date.now() - lastRunTime) / 1000)); 23 | 24 | setBoxes(bs); 25 | lastRunTime = Date.now(); 26 | }; 27 | 28 | const frameProcessor = useFrameProcessor((frame) => { 29 | "worklet"; 30 | var [detections, width, height] = roboflowDetect(frame); 31 | for (let i = 0; i < detections.length && i < 1; i++) { 32 | var xCrop = width * (windowHeight / height); 33 | xCrop = (xCrop - windowWidth) / 2; 34 | var b = detections[i]; 35 | b.x = b.x * (windowHeight / height) - xCrop; //b.x * (windowWidth / width); //windowWidth / 2; //b.x * (windowWidth / 640); 36 | b.y = b.y * (windowHeight / height); //b.y; // * (windowHeight / 640); 37 | b.width = b.width * (windowHeight / height); ///windowWidth * 0.2; //b.width * (windowWidth / 640); 38 | b.height = b.height * (windowHeight / height); //50b.height; // * (windowHeight / 640); 39 | detections[i] = b; 40 | } 41 | runOnJS(updateBboxes)(detections); 42 | console.log(`Detections in Frame: ${JSON.stringify(detections)}`); 43 | }, []); 44 | 45 | if (device == null) return Hello World; 46 | return ( 47 | 48 | 55 | 60 | {boxes != undefined && 61 | boxes.length > 0 && 62 | boxes.map((box) => ( 63 | 77 | 82 | {box.class} {Math.round(box.confidence * 100) / 100} 83 | 84 | 85 | ))} 86 | 87 | FPS: {Math.round(fps)} 88 | 89 | 90 | 91 | 92 | ); 93 | } 94 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Roboflow in Expo 2 | 3 | ## Running the Example 4 | 5 | Make sure Expo[https://expo.dev] and CocoaPods[https://cocoapods.org] are installed. 6 | 7 | 1. Clone the project. 8 | 2. Open the project and run `expo install` 9 | 3. Open the iOS directory in the project and run `pod install` 10 | 4. Open `RoboflowExpoExample.xcworkspace` in Xcode 11 | 5. Click on the project name on the left, then Signing and Capabilites, then select your team. 12 | 6. Open `RoboflowFrameProcessorPlugin.swift` in XCode and add your apiKey, model name, and model version from Roboflow[https://roboflow.com] 13 | 7. Run the app on a device using XCode 14 | 15 | ## Expo Project Setup 16 | 17 | ### Init Expo Project 18 | 19 | Start by setting up an expo project if you haven't already using the `expo init ` command. 20 | 21 | ### Eject Project 22 | 23 | Roboflow relies on native code which means you have to eject your expo project out of the managed workflow into the bare workflow. Note, this means you either have to use the EAS build system or compile the iOS app yourself in xcode. Eject using this command `expo prebuild`. 24 | 25 | This will build the naive iOS and Android projects in the `ios` and `android` folders now present in your project. Roboflow only supports iOS for the time being so we will focus there first. 26 | 27 | ## Native iOS Project Setup 28 | 29 | ### Adding CocoaPod to Podfile 30 | 31 | Roboflow is distributed using cocoapods, a package manager for native iOS apps. In order to install the app first open the `Podfile` in the iOS directory. 32 | 33 | Under the line that says `config = use_native_modules!` add the Roboflow pod using the line `pod 'Roboflow'`. 34 | 35 | ### Change iOS target 36 | 37 | Roboflow requires a minimum iOS version of 15.4. Edit the line at the top of the `Podfile` that says `platform :ios, '12.0'` and change it to `platform :ios, '15.4'` 38 | 39 | ### Installing New Cocoa Pod 40 | 41 | Next, in a terminal window, run `pod install` to install the Roboflow package into your iOS project. 42 | 43 | ### Using Roboflow 44 | 45 | Now that you have Roboflow installed you can use it in any native file, the remainder of the example will focus on using Roboflow to process a camera stream using the `react-native-vision-camera` package. 46 | 47 | ## react-native-vision-camera Installation 48 | 49 | ### Installing Package using NPM 50 | 51 | Make sure you are in the root of your expo project (not the ios folder) and run `expo install react-native-vision-camera react-native-reanimated` to install react-native-vision-camera and its dependency react-native-reanimated. 52 | 53 | ### Install Pods 54 | 55 | These npm dependencies also come bunled with native dependencies which we must also install. Run `pod install` in the ios directory. 56 | 57 | ## Using react-native-vision-camera 58 | 59 | ### Setting up a Native Frame Processor 60 | 61 | react-native-vision-camera lets you use custom frame processors to process frames in the videos tream with high performance. Roboflow should be used in a swift frame processor like the one in this example called `RoboflowFrameProcessorPlugin.swift`. 62 | 63 | You should first open the .xcworkspace file in the ios folder in XCode for easier development on this part. 64 | 65 | ### Configuring Camera Permissions 66 | 67 | In XCode, open `Info.plist`. At the bottom click the little plus symbol while hovering over `View controller-based status bar appearance`. In the new row that appears, type `Privacy - Camera Usage Description` into the key column. Then type a custom message in the value column that will show when someone opens your app for the first time. 68 | 69 | #### Adding Frame Processor 70 | 71 | Either create a swift file called `RoboflowFrameProcessorPlugin.swift` or copy the one provided in this example. If XCode prompts you to create a bridging header file click create. Inside this frame processor we will implement roboflow for processing images in the incoming frames. First, we need to connect our swift file to the objective-c vision-camera library. 72 | 73 | #### Setup Headers 74 | 75 | In the `Bridging-Header.h` file add these two lines to the top. 76 | 77 | ``` 78 | #import 79 | #import 80 | ``` 81 | 82 | Next create a file called `RoboflowFrameProcessorPlugin.m` with the following lines to tell expo where our function is. 83 | 84 | ``` 85 | #import 86 | #import 87 | 88 | @interface VISION_EXPORT_SWIFT_FRAME_PROCESSOR(roboflowDetect, RoboflowFrameProcessorPlugin) 89 | @end 90 | ``` 91 | 92 | #### Using Your Model 93 | 94 | In RoboflowFrameProessorPlugin, we first define an instance of RoboflowWrapper with our apiKey. Insert your apiKey, found at roboflow.com. The loadRoboflowModelWith function loads your model from roboflow using the model name and version, set those values to your custom ones from roboflow.com. 95 | 96 | Finally, custmize the confidence threshold, and overlap threshold to your desired values. 97 | 98 | ### Connecting Native Framework to Expo 99 | 100 | #### Adding the Detect Function in Expo 101 | 102 | In a new JS file, create a function called roboflowDetect which connects to your native function like so. 103 | 104 | ``` 105 | import "react-native-reanimated"; 106 | 107 | export const roboflowDetect = (frame) => { 108 | "worklet"; 109 | return [__roboflowDetect(frame), frame.width, frame.height]; 110 | }; 111 | ``` 112 | 113 | #### Add Worklet to babel config 114 | 115 | Open the `babel.config.js` file to expose the native function to your react native app using react-native-reanimated. Make sure your file includes the plugins section from below. 116 | 117 | ``` 118 | module.exports = function (api) { 119 | api.cache(true); 120 | return { 121 | presets: ["babel-preset-expo"], 122 | plugins: [ 123 | [ 124 | "react-native-reanimated/plugin", 125 | { 126 | globals: ["__roboflowDetect"], 127 | }, 128 | ], 129 | ], 130 | }; 131 | }; 132 | ``` 133 | 134 | #### Add react-native-vision-camera to App 135 | 136 | In App.js add these imports. 137 | 138 | ``` 139 | import { 140 | useCameraDevices, 141 | Camera, 142 | useFrameProcessor, 143 | } from "react-native-vision-camera"; 144 | import { roboflowDetect } from "./roboflowDetect"; 145 | import { 146 | runOnJS, 147 | useSharedValue, 148 | } from "react-native-reanimated"; 149 | ``` 150 | 151 | Then add these lines to get the camera device. 152 | 153 | ``` 154 | const devices = useCameraDevices("wide-angle-camera"); 155 | const device = devices.back; 156 | if (device == null) return Loading...; 157 | ``` 158 | 159 | Next Add the the following lines to your return to add the camera. 160 | 161 | ``` 162 | 167 | ``` 168 | 169 | #### Process Frames using roboflowDetect 170 | 171 | To connect the camera to our frameprocessor lets first build a worklet function to access the native frame processor. 172 | 173 | ``` 174 | const frameProcessor = useFrameProcessor((frame) => { 175 | "worklet"; 176 | const [detections, width, height] = roboflowDetect(frame); 177 | console.log(`Detections in Frame: ${detections.length}`); 178 | }, []); 179 | ``` 180 | 181 | Then set the camera to use this worklet by adding `frameProcessor={frameProcessor}` to the `` tag. 182 | -------------------------------------------------------------------------------- /android/app/BUCK: -------------------------------------------------------------------------------- 1 | # To learn about Buck see [Docs](https://buckbuild.com/). 2 | # To run your application with Buck: 3 | # - install Buck 4 | # - `npm start` - to start the packager 5 | # - `cd android` 6 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` 7 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck 8 | # - `buck install -r android/app` - compile, install and run application 9 | # 10 | 11 | load(":build_defs.bzl", "create_aar_targets", "create_jar_targets") 12 | 13 | lib_deps = [] 14 | 15 | create_aar_targets(glob(["libs/*.aar"])) 16 | 17 | create_jar_targets(glob(["libs/*.jar"])) 18 | 19 | android_library( 20 | name = "all-libs", 21 | exported_deps = lib_deps, 22 | ) 23 | 24 | android_library( 25 | name = "app-code", 26 | srcs = glob([ 27 | "src/main/java/**/*.java", 28 | ]), 29 | deps = [ 30 | ":all-libs", 31 | ":build_config", 32 | ":res", 33 | ], 34 | ) 35 | 36 | android_build_config( 37 | name = "build_config", 38 | package = "com.roboflow.RobofloExpoExample", 39 | ) 40 | 41 | android_resource( 42 | name = "res", 43 | package = "com.roboflow.RobofloExpoExample", 44 | res = "src/main/res", 45 | ) 46 | 47 | android_binary( 48 | name = "app", 49 | keystore = "//android/keystores:debug", 50 | manifest = "src/main/AndroidManifest.xml", 51 | package_type = "debug", 52 | deps = [ 53 | ":app-code", 54 | ], 55 | ) 56 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.android.application" 2 | 3 | import com.android.build.OutputFile 4 | 5 | /** 6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets 7 | * and bundleReleaseJsAndAssets). 8 | * These basically call `react-native bundle` with the correct arguments during the Android build 9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the 10 | * bundle directly from the development server. Below you can see all the possible configurations 11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the 12 | * `apply from: "../../node_modules/react-native/react.gradle"` line. 13 | * 14 | * project.ext.react = [ 15 | * // the name of the generated asset file containing your JS bundle 16 | * bundleAssetName: "index.android.bundle", 17 | * 18 | * // the entry file for bundle generation. If none specified and 19 | * // "index.android.js" exists, it will be used. Otherwise "index.js" is 20 | * // default. Can be overridden with ENTRY_FILE environment variable. 21 | * entryFile: "index.android.js", 22 | * 23 | * // https://reactnative.dev/docs/performance#enable-the-ram-format 24 | * bundleCommand: "ram-bundle", 25 | * 26 | * // whether to bundle JS and assets in debug mode 27 | * bundleInDebug: false, 28 | * 29 | * // whether to bundle JS and assets in release mode 30 | * bundleInRelease: true, 31 | * 32 | * // whether to bundle JS and assets in another build variant (if configured). 33 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 34 | * // The configuration property can be in the following formats 35 | * // 'bundleIn${productFlavor}${buildType}' 36 | * // 'bundleIn${buildType}' 37 | * // bundleInFreeDebug: true, 38 | * // bundleInPaidRelease: true, 39 | * // bundleInBeta: true, 40 | * 41 | * // whether to disable dev mode in custom build variants (by default only disabled in release) 42 | * // for example: to disable dev mode in the staging build type (if configured) 43 | * devDisabledInStaging: true, 44 | * // The configuration property can be in the following formats 45 | * // 'devDisabledIn${productFlavor}${buildType}' 46 | * // 'devDisabledIn${buildType}' 47 | * 48 | * // the root of your project, i.e. where "package.json" lives 49 | * root: "../../", 50 | * 51 | * // where to put the JS bundle asset in debug mode 52 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", 53 | * 54 | * // where to put the JS bundle asset in release mode 55 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release", 56 | * 57 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 58 | * // require('./image.png')), in debug mode 59 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", 60 | * 61 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 62 | * // require('./image.png')), in release mode 63 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", 64 | * 65 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means 66 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to 67 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle 68 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ 69 | * // for example, you might want to remove it from here. 70 | * inputExcludes: ["android/**", "ios/**"], 71 | * 72 | * // override which node gets called and with what additional arguments 73 | * nodeExecutableAndArgs: ["node"], 74 | * 75 | * // supply additional arguments to the packager 76 | * extraPackagerArgs: [] 77 | * ] 78 | */ 79 | 80 | project.ext.react = [ 81 | enableHermes: (findProperty('expo.jsEngine') ?: "jsc") == "hermes", 82 | cliPath: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/cli.js", 83 | hermesCommand: new File(["node", "--print", "require.resolve('hermes-engine/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/%OS-BIN%/hermesc", 84 | composeSourceMapsPath: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/scripts/compose-source-maps.js", 85 | ] 86 | 87 | apply from: new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../react.gradle") 88 | 89 | /** 90 | * Set this to true to create two separate APKs instead of one: 91 | * - An APK that only works on ARM devices 92 | * - An APK that only works on x86 devices 93 | * The advantage is the size of the APK is reduced by about 4MB. 94 | * Upload all the APKs to the Play Store and people will download 95 | * the correct one based on the CPU architecture of their device. 96 | */ 97 | def enableSeparateBuildPerCPUArchitecture = false 98 | 99 | /** 100 | * Run Proguard to shrink the Java bytecode in release builds. 101 | */ 102 | def enableProguardInReleaseBuilds = false 103 | 104 | /** 105 | * The preferred build flavor of JavaScriptCore. 106 | * 107 | * For example, to use the international variant, you can use: 108 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` 109 | * 110 | * The international variant includes ICU i18n library and necessary data 111 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that 112 | * give correct results when using with locales other than en-US. Note that 113 | * this variant is about 6MiB larger per architecture than default. 114 | */ 115 | def jscFlavor = 'org.webkit:android-jsc:+' 116 | 117 | /** 118 | * Whether to enable the Hermes VM. 119 | * 120 | * This should be set on project.ext.react and mirrored here. If it is not set 121 | * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode 122 | * and the benefits of using Hermes will therefore be sharply reduced. 123 | */ 124 | def enableHermes = project.ext.react.get("enableHermes", false); 125 | 126 | android { 127 | compileSdkVersion rootProject.ext.compileSdkVersion 128 | 129 | compileOptions { 130 | sourceCompatibility JavaVersion.VERSION_1_8 131 | targetCompatibility JavaVersion.VERSION_1_8 132 | } 133 | 134 | defaultConfig { 135 | applicationId 'com.roboflow.RobofloExpoExample' 136 | minSdkVersion rootProject.ext.minSdkVersion 137 | targetSdkVersion rootProject.ext.targetSdkVersion 138 | versionCode 1 139 | versionName "1.0.0" 140 | } 141 | splits { 142 | abi { 143 | reset() 144 | enable enableSeparateBuildPerCPUArchitecture 145 | universalApk false // If true, also generate a universal APK 146 | include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" 147 | } 148 | } 149 | signingConfigs { 150 | debug { 151 | storeFile file('debug.keystore') 152 | storePassword 'android' 153 | keyAlias 'androiddebugkey' 154 | keyPassword 'android' 155 | } 156 | } 157 | buildTypes { 158 | debug { 159 | signingConfig signingConfigs.debug 160 | } 161 | release { 162 | // Caution! In production, you need to generate your own keystore file. 163 | // see https://reactnative.dev/docs/signed-apk-android. 164 | signingConfig signingConfigs.debug 165 | minifyEnabled enableProguardInReleaseBuilds 166 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 167 | } 168 | } 169 | 170 | // applicationVariants are e.g. debug, release 171 | applicationVariants.all { variant -> 172 | variant.outputs.each { output -> 173 | // For each separate APK per architecture, set a unique version code as described here: 174 | // https://developer.android.com/studio/build/configure-apk-splits.html 175 | def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] 176 | def abi = output.getFilter(OutputFile.ABI) 177 | if (abi != null) { // null for the universal-debug, universal-release variants 178 | output.versionCodeOverride = 179 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode 180 | } 181 | 182 | } 183 | } 184 | } 185 | 186 | dependencies { 187 | implementation fileTree(dir: "libs", include: ["*.jar"]) 188 | //noinspection GradleDynamicVersion 189 | implementation "com.facebook.react:react-native:+" // From node_modules 190 | 191 | def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; 192 | def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; 193 | def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; 194 | 195 | // If your app supports Android versions before Ice Cream Sandwich (API level 14) 196 | // All fresco packages should use the same version 197 | if (isGifEnabled || isWebpEnabled) { 198 | implementation 'com.facebook.fresco:fresco:2.0.0' 199 | implementation 'com.facebook.fresco:imagepipeline-okhttp3:2.0.0' 200 | } 201 | 202 | if (isGifEnabled) { 203 | // For animated gif support 204 | implementation 'com.facebook.fresco:animated-gif:2.0.0' 205 | } 206 | 207 | if (isWebpEnabled) { 208 | // For webp support 209 | implementation 'com.facebook.fresco:webpsupport:2.0.0' 210 | if (isWebpAnimatedEnabled) { 211 | // Animated webp support 212 | implementation 'com.facebook.fresco:animated-webp:2.0.0' 213 | } 214 | } 215 | 216 | implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" 217 | debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { 218 | exclude group:'com.facebook.fbjni' 219 | } 220 | debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { 221 | exclude group:'com.facebook.flipper' 222 | exclude group:'com.squareup.okhttp3', module:'okhttp' 223 | } 224 | debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { 225 | exclude group:'com.facebook.flipper' 226 | } 227 | 228 | if (enableHermes) { 229 | debugImplementation files(new File(["node", "--print", "require.resolve('hermes-engine/package.json')"].execute(null, rootDir).text.trim(), "../android/hermes-debug.aar")) 230 | releaseImplementation files(new File(["node", "--print", "require.resolve('hermes-engine/package.json')"].execute(null, rootDir).text.trim(), "../android/hermes-release.aar")) 231 | } else { 232 | implementation jscFlavor 233 | } 234 | } 235 | 236 | // Run this once to be able to run the application with BUCK 237 | // puts all compile dependencies into folder libs for BUCK to use 238 | task copyDownloadableDepsToLibs(type: Copy) { 239 | from configurations.compile 240 | into 'libs' 241 | } 242 | 243 | apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); 244 | applyNativeModulesAppBuildGradle(project) 245 | -------------------------------------------------------------------------------- /android/app/build_defs.bzl: -------------------------------------------------------------------------------- 1 | """Helper definitions to glob .aar and .jar targets""" 2 | 3 | def create_aar_targets(aarfiles): 4 | for aarfile in aarfiles: 5 | name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")] 6 | lib_deps.append(":" + name) 7 | android_prebuilt_aar( 8 | name = name, 9 | aar = aarfile, 10 | ) 11 | 12 | def create_jar_targets(jarfiles): 13 | for jarfile in jarfiles: 14 | name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")] 15 | lib_deps.append(":" + name) 16 | prebuilt_jar( 17 | name = name, 18 | binary_jar = jarfile, 19 | ) 20 | -------------------------------------------------------------------------------- /android/app/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/debug.keystore -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/debug/java/com/roboflow/RobofloExpoExample/ReactNativeFlipper.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | *

This source code is licensed under the MIT license found in the LICENSE file in the root 5 | * directory of this source tree. 6 | */ 7 | package com.roboflow.RobofloExpoExample; 8 | 9 | import android.content.Context; 10 | import com.facebook.flipper.android.AndroidFlipperClient; 11 | import com.facebook.flipper.android.utils.FlipperUtils; 12 | import com.facebook.flipper.core.FlipperClient; 13 | import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; 14 | import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; 15 | import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; 16 | import com.facebook.flipper.plugins.inspector.DescriptorMapping; 17 | import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; 18 | import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; 19 | import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; 20 | import com.facebook.flipper.plugins.react.ReactFlipperPlugin; 21 | import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; 22 | import com.facebook.react.ReactInstanceManager; 23 | import com.facebook.react.bridge.ReactContext; 24 | import com.facebook.react.modules.network.NetworkingModule; 25 | import okhttp3.OkHttpClient; 26 | 27 | public class ReactNativeFlipper { 28 | public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { 29 | if (FlipperUtils.shouldEnableFlipper(context)) { 30 | final FlipperClient client = AndroidFlipperClient.getInstance(context); 31 | client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); 32 | client.addPlugin(new ReactFlipperPlugin()); 33 | client.addPlugin(new DatabasesFlipperPlugin(context)); 34 | client.addPlugin(new SharedPreferencesFlipperPlugin(context)); 35 | client.addPlugin(CrashReporterPlugin.getInstance()); 36 | NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); 37 | NetworkingModule.setCustomClientBuilder( 38 | new NetworkingModule.CustomClientBuilder() { 39 | @Override 40 | public void apply(OkHttpClient.Builder builder) { 41 | builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); 42 | } 43 | }); 44 | client.addPlugin(networkFlipperPlugin); 45 | client.start(); 46 | // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized 47 | // Hence we run if after all native modules have been initialized 48 | ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); 49 | if (reactContext == null) { 50 | reactInstanceManager.addReactInstanceEventListener( 51 | new ReactInstanceManager.ReactInstanceEventListener() { 52 | @Override 53 | public void onReactContextInitialized(ReactContext reactContext) { 54 | reactInstanceManager.removeReactInstanceEventListener(this); 55 | reactContext.runOnNativeModulesQueueThread( 56 | new Runnable() { 57 | @Override 58 | public void run() { 59 | client.addPlugin(new FrescoFlipperPlugin()); 60 | } 61 | }); 62 | } 63 | }); 64 | } else { 65 | client.addPlugin(new FrescoFlipperPlugin()); 66 | } 67 | } 68 | } 69 | } -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/roboflow/RobofloExpoExample/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.roboflow.RobofloExpoExample; 2 | 3 | import android.os.Build; 4 | import android.os.Bundle; 5 | 6 | import com.facebook.react.ReactActivity; 7 | import com.facebook.react.ReactActivityDelegate; 8 | import com.facebook.react.ReactRootView; 9 | 10 | import expo.modules.ReactActivityDelegateWrapper; 11 | 12 | public class MainActivity extends ReactActivity { 13 | @Override 14 | protected void onCreate(Bundle savedInstanceState) { 15 | // Set the theme to AppTheme BEFORE onCreate to support 16 | // coloring the background, status bar, and navigation bar. 17 | // This is required for expo-splash-screen. 18 | setTheme(R.style.AppTheme); 19 | super.onCreate(null); 20 | } 21 | 22 | /** 23 | * Returns the name of the main component registered from JavaScript. 24 | * This is used to schedule rendering of the component. 25 | */ 26 | @Override 27 | protected String getMainComponentName() { 28 | return "main"; 29 | } 30 | 31 | @Override 32 | protected ReactActivityDelegate createReactActivityDelegate() { 33 | return new ReactActivityDelegateWrapper(this, 34 | new ReactActivityDelegate(this, getMainComponentName()) 35 | ); 36 | } 37 | 38 | /** 39 | * Align the back button behavior with Android S 40 | * where moving root activities to background instead of finishing activities. 41 | * @see onBackPressed 42 | */ 43 | @Override 44 | public void invokeDefaultOnBackPressed() { 45 | if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { 46 | if (!moveTaskToBack(false)) { 47 | // For non-root activities, use the default implementation to finish them. 48 | super.invokeDefaultOnBackPressed(); 49 | } 50 | return; 51 | } 52 | 53 | // Use the default back button implementation on Android S 54 | // because it's doing more than {@link Activity#moveTaskToBack} in fact. 55 | super.invokeDefaultOnBackPressed(); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/roboflow/RobofloExpoExample/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.roboflow.RobofloExpoExample; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | import android.content.res.Configuration; 6 | import androidx.annotation.NonNull; 7 | 8 | import com.facebook.react.PackageList; 9 | import com.facebook.react.ReactApplication; 10 | import com.facebook.react.ReactInstanceManager; 11 | import com.facebook.react.ReactNativeHost; 12 | import com.facebook.react.ReactPackage; 13 | import com.facebook.soloader.SoLoader; 14 | 15 | import expo.modules.ApplicationLifecycleDispatcher; 16 | import expo.modules.ReactNativeHostWrapper; 17 | 18 | import com.facebook.react.bridge.JSIModulePackage; 19 | 20 | import java.lang.reflect.InvocationTargetException; 21 | import java.util.List; 22 | 23 | public class MainApplication extends Application implements ReactApplication { 24 | private final ReactNativeHost mReactNativeHost = new ReactNativeHostWrapper( 25 | this, 26 | new ReactNativeHost(this) { 27 | @Override 28 | public boolean getUseDeveloperSupport() { 29 | return BuildConfig.DEBUG; 30 | } 31 | 32 | @Override 33 | protected List getPackages() { 34 | @SuppressWarnings("UnnecessaryLocalVariable") 35 | List packages = new PackageList(this).getPackages(); 36 | // Packages that cannot be autolinked yet can be added manually here, for example: 37 | // packages.add(new MyReactNativePackage()); 38 | return packages; 39 | } 40 | 41 | @Override 42 | protected String getJSMainModuleName() { 43 | return "index"; 44 | } 45 | }); 46 | 47 | @Override 48 | public ReactNativeHost getReactNativeHost() { 49 | return mReactNativeHost; 50 | } 51 | 52 | @Override 53 | public void onCreate() { 54 | super.onCreate(); 55 | SoLoader.init(this, /* native exopackage */ false); 56 | 57 | initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); 58 | ApplicationLifecycleDispatcher.onApplicationCreate(this); 59 | } 60 | 61 | @Override 62 | public void onConfigurationChanged(@NonNull Configuration newConfig) { 63 | super.onConfigurationChanged(newConfig); 64 | ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig); 65 | } 66 | 67 | /** 68 | * Loads Flipper in React Native templates. Call this in the onCreate method with something like 69 | * initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); 70 | * 71 | * @param context 72 | * @param reactInstanceManager 73 | */ 74 | private static void initializeFlipper( 75 | Context context, ReactInstanceManager reactInstanceManager) { 76 | if (BuildConfig.DEBUG) { 77 | try { 78 | /* 79 | We use reflection here to pick up the class that initializes Flipper, 80 | since Flipper library is not available in release mode 81 | */ 82 | Class aClass = Class.forName("com.roboflow.RobofloExpoExample.ReactNativeFlipper"); 83 | aClass 84 | .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class) 85 | .invoke(null, context, reactInstanceManager); 86 | } catch (ClassNotFoundException e) { 87 | e.printStackTrace(); 88 | } catch (NoSuchMethodException e) { 89 | e.printStackTrace(); 90 | } catch (IllegalAccessException e) { 91 | e.printStackTrace(); 92 | } catch (InvocationTargetException e) { 93 | e.printStackTrace(); 94 | } 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/splashscreen_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/drawable-hdpi/splashscreen_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/splashscreen_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/drawable-mdpi/splashscreen_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/splashscreen_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/drawable-xhdpi/splashscreen_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/splashscreen.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #ffffff 4 | #FFFFFF 5 | #023c69 6 | #ffffff 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | RoboflowExpoExample 4 | contain 5 | false 6 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 14 | 17 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext { 5 | buildToolsVersion = "29.0.3" 6 | minSdkVersion = 21 7 | compileSdkVersion = 30 8 | targetSdkVersion = 30 9 | } 10 | repositories { 11 | google() 12 | mavenCentral() 13 | jcenter() 14 | } 15 | dependencies { 16 | classpath("com.android.tools.build:gradle:4.1.0") 17 | 18 | // NOTE: Do not place your application dependencies here; they belong 19 | // in the individual module build.gradle files 20 | } 21 | } 22 | 23 | allprojects { 24 | repositories { 25 | mavenLocal() 26 | maven { 27 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 28 | url(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../android")) 29 | } 30 | maven { 31 | // Android JSC is installed from npm 32 | url(new File(["node", "--print", "require.resolve('jsc-android/package.json')"].execute(null, rootDir).text.trim(), "../dist")) 33 | } 34 | 35 | google() 36 | mavenCentral() 37 | jcenter() 38 | maven { url 'https://www.jitpack.io' } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | # AndroidX package structure to make it clearer which packages are bundled with the 21 | # Android operating system, and which are packaged with your app's APK 22 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 23 | android.useAndroidX=true 24 | 25 | # Automatically convert third-party libraries to use AndroidX 26 | android.enableJetifier=true 27 | 28 | # Version of flipper SDK to use with React Native 29 | FLIPPER_VERSION=0.54.0 30 | 31 | # The hosted JavaScript engine 32 | # Supported values: expo.jsEngine = "hermes" | "jsc" 33 | expo.jsEngine=jsc 34 | 35 | # Enable GIF support in React Native images (~200 B increase) 36 | expo.gif.enabled=true 37 | # Enable webp support in React Native images (~85 KB increase) 38 | expo.webp.enabled=true 39 | # Enable animated webp support (~3.4 MB increase) 40 | # Disabled by default because iOS doesn't support animated webp 41 | expo.webp.animated=false -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | # Determine the Java command to use to start the JVM. 86 | if [ -n "$JAVA_HOME" ] ; then 87 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 88 | # IBM's JDK on AIX uses strange locations for the executables 89 | JAVACMD="$JAVA_HOME/jre/sh/java" 90 | else 91 | JAVACMD="$JAVA_HOME/bin/java" 92 | fi 93 | if [ ! -x "$JAVACMD" ] ; then 94 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 95 | 96 | Please set the JAVA_HOME variable in your environment to match the 97 | location of your Java installation." 98 | fi 99 | else 100 | JAVACMD="java" 101 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 102 | 103 | Please set the JAVA_HOME variable in your environment to match the 104 | location of your Java installation." 105 | fi 106 | 107 | # Increase the maximum file descriptors if we can. 108 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 109 | MAX_FD_LIMIT=`ulimit -H -n` 110 | if [ $? -eq 0 ] ; then 111 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 112 | MAX_FD="$MAX_FD_LIMIT" 113 | fi 114 | ulimit -n $MAX_FD 115 | if [ $? -ne 0 ] ; then 116 | warn "Could not set maximum file descriptor limit: $MAX_FD" 117 | fi 118 | else 119 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 120 | fi 121 | fi 122 | 123 | # For Darwin, add options to specify how the application appears in the dock 124 | if $darwin; then 125 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 126 | fi 127 | 128 | # For Cygwin or MSYS, switch paths to Windows format before running java 129 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 130 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 131 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 132 | JAVACMD=`cygpath --unix "$JAVACMD"` 133 | 134 | # We build the pattern for arguments to be converted via cygpath 135 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 136 | SEP="" 137 | for dir in $ROOTDIRSRAW ; do 138 | ROOTDIRS="$ROOTDIRS$SEP$dir" 139 | SEP="|" 140 | done 141 | OURCYGPATTERN="(^($ROOTDIRS))" 142 | # Add a user-defined pattern to the cygpath arguments 143 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 144 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 145 | fi 146 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 147 | i=0 148 | for arg in "$@" ; do 149 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 150 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 151 | 152 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 153 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 154 | else 155 | eval `echo args$i`="\"$arg\"" 156 | fi 157 | i=`expr $i + 1` 158 | done 159 | case $i in 160 | 0) set -- ;; 161 | 1) set -- "$args0" ;; 162 | 2) set -- "$args0" "$args1" ;; 163 | 3) set -- "$args0" "$args1" "$args2" ;; 164 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 165 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 166 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 167 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 168 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 169 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 170 | esac 171 | fi 172 | 173 | # Escape application args 174 | save () { 175 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 176 | echo " " 177 | } 178 | APP_ARGS=`save "$@"` 179 | 180 | # Collect all arguments for the java command, following the shell quoting and substitution rules 181 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 182 | 183 | exec "$JAVACMD" "$@" 184 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto init 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto init 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :init 68 | @rem Get command-line arguments, handling Windows variants 69 | 70 | if not "%OS%" == "Windows_NT" goto win9xME_args 71 | 72 | :win9xME_args 73 | @rem Slurp the command line arguments. 74 | set CMD_LINE_ARGS= 75 | set _SKIP=2 76 | 77 | :win9xME_args_slurp 78 | if "x%~1" == "x" goto execute 79 | 80 | set CMD_LINE_ARGS=%* 81 | 82 | :execute 83 | @rem Setup the command line 84 | 85 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 86 | 87 | @rem Execute Gradle 88 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 89 | 90 | :end 91 | @rem End local scope for the variables with windows NT shell 92 | if "%ERRORLEVEL%"=="0" goto mainEnd 93 | 94 | :fail 95 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 96 | rem the _cmd.exe /c_ return code! 97 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 98 | exit /b 1 99 | 100 | :mainEnd 101 | if "%OS%"=="Windows_NT" endlocal 102 | 103 | :omega 104 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'RoboflowExpoExample' 2 | 3 | apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle"); 4 | useExpoModules() 5 | 6 | apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json')"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); 7 | applyNativeModulesSettingsGradle(settings) 8 | 9 | include ':app' 10 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo": { 3 | "name": "RoboflowExpoExample", 4 | "slug": "RoboflowExpoExample", 5 | "version": "1.0.0", 6 | "orientation": "portrait", 7 | "icon": "./assets/icon.png", 8 | "splash": { 9 | "image": "./assets/splash.png", 10 | "resizeMode": "contain", 11 | "backgroundColor": "#ffffff" 12 | }, 13 | "updates": { 14 | "fallbackToCacheTimeout": 0 15 | }, 16 | "assetBundlePatterns": [ 17 | "**/*" 18 | ], 19 | "ios": { 20 | "supportsTablet": true, 21 | "bundleIdentifier": "com.roboflow.RobofloExpoExample" 22 | }, 23 | "android": { 24 | "adaptiveIcon": { 25 | "foregroundImage": "./assets/adaptive-icon.png", 26 | "backgroundColor": "#FFFFFF" 27 | }, 28 | "package": "com.roboflow.RobofloExpoExample" 29 | }, 30 | "web": { 31 | "favicon": "./assets/favicon.png" 32 | }, 33 | "plugins": [ 34 | "react-native-vision-camera" 35 | ] 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /assets/adaptive-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/assets/adaptive-icon.png -------------------------------------------------------------------------------- /assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/assets/favicon.png -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/assets/icon.png -------------------------------------------------------------------------------- /assets/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/assets/splash.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function (api) { 2 | api.cache(true); 3 | return { 4 | presets: ["babel-preset-expo"], 5 | plugins: [ 6 | [ 7 | "react-native-reanimated/plugin", 8 | { 9 | globals: ["__roboflowDetect"], 10 | }, 11 | ], 12 | ], 13 | }; 14 | }; 15 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import { registerRootComponent } from 'expo'; 2 | 3 | import App from './App'; 4 | 5 | // registerRootComponent calls AppRegistry.registerComponent('main', () => App); 6 | // It also ensures that whether you load the app in Expo Go or in a native build, 7 | // the environment is set up appropriately 8 | registerRootComponent(App); 9 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") 2 | require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") 3 | require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules") 4 | 5 | platform :ios, '15.4' 6 | 7 | require 'json' 8 | podfile_properties = JSON.parse(File.read('./Podfile.properties.json')) rescue {} 9 | 10 | target 'RoboflowExpoExample' do 11 | use_expo_modules! 12 | config = use_native_modules! 13 | 14 | pod 'Roboflow', :git => 'https://github.com/roboflow-ai/roboflow-ios-podspecs' 15 | 16 | use_react_native!( 17 | :path => config[:reactNativePath], 18 | :hermes_enabled => podfile_properties['expo.jsEngine'] == 'hermes' 19 | ) 20 | 21 | # Uncomment to opt-in to using Flipper 22 | # 23 | # if !ENV['CI'] 24 | # use_flipper!('Flipper' => '0.75.1', 'Flipper-Folly' => '2.5.3', 'Flipper-RSocket' => '1.3.1') 25 | # end 26 | 27 | post_install do |installer| 28 | react_native_post_install(installer) 29 | 30 | # Workaround `Cycle inside FBReactNativeSpec` error for react-native 0.64 31 | # Reference: https://github.com/software-mansion/react-native-screens/issues/842#issuecomment-812543933 32 | installer.pods_project.targets.each do |target| 33 | if (target.name&.eql?('FBReactNativeSpec')) 34 | target.build_phases.each do |build_phase| 35 | if (build_phase.respond_to?(:name) && build_phase.name.eql?('[CP-User] Generate Specs')) 36 | target.build_phases.move(build_phase, 0) 37 | end 38 | end 39 | end 40 | end 41 | end 42 | 43 | post_integrate do |installer| 44 | begin 45 | expo_patch_react_imports!(installer) 46 | rescue => e 47 | Pod::UI.warn e 48 | end 49 | end 50 | 51 | end 52 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - boost-for-react-native (1.63.0) 3 | - DoubleConversion (1.1.6) 4 | - EXApplication (4.0.2): 5 | - ExpoModulesCore 6 | - EXConstants (13.0.2): 7 | - ExpoModulesCore 8 | - EXErrorRecovery (3.0.5): 9 | - ExpoModulesCore 10 | - EXFileSystem (13.1.4): 11 | - ExpoModulesCore 12 | - EXFont (10.0.5): 13 | - ExpoModulesCore 14 | - EXKeepAwake (10.0.2): 15 | - ExpoModulesCore 16 | - Expo (44.0.6): 17 | - ExpoModulesCore 18 | - ExpoModulesCore (0.6.5): 19 | - React-Core 20 | - ReactCommon/turbomodule/core 21 | - EXSplashScreen (0.14.2): 22 | - ExpoModulesCore 23 | - React-Core 24 | - FBLazyVector (0.64.3) 25 | - FBReactNativeSpec (0.64.3): 26 | - RCT-Folly (= 2020.01.13.00) 27 | - RCTRequired (= 0.64.3) 28 | - RCTTypeSafety (= 0.64.3) 29 | - React-Core (= 0.64.3) 30 | - React-jsi (= 0.64.3) 31 | - ReactCommon/turbomodule/core (= 0.64.3) 32 | - glog (0.3.5) 33 | - RCT-Folly (2020.01.13.00): 34 | - boost-for-react-native 35 | - DoubleConversion 36 | - glog 37 | - RCT-Folly/Default (= 2020.01.13.00) 38 | - RCT-Folly/Default (2020.01.13.00): 39 | - boost-for-react-native 40 | - DoubleConversion 41 | - glog 42 | - RCTRequired (0.64.3) 43 | - RCTTypeSafety (0.64.3): 44 | - FBLazyVector (= 0.64.3) 45 | - RCT-Folly (= 2020.01.13.00) 46 | - RCTRequired (= 0.64.3) 47 | - React-Core (= 0.64.3) 48 | - React (0.64.3): 49 | - React-Core (= 0.64.3) 50 | - React-Core/DevSupport (= 0.64.3) 51 | - React-Core/RCTWebSocket (= 0.64.3) 52 | - React-RCTActionSheet (= 0.64.3) 53 | - React-RCTAnimation (= 0.64.3) 54 | - React-RCTBlob (= 0.64.3) 55 | - React-RCTImage (= 0.64.3) 56 | - React-RCTLinking (= 0.64.3) 57 | - React-RCTNetwork (= 0.64.3) 58 | - React-RCTSettings (= 0.64.3) 59 | - React-RCTText (= 0.64.3) 60 | - React-RCTVibration (= 0.64.3) 61 | - React-callinvoker (0.64.3) 62 | - React-Core (0.64.3): 63 | - glog 64 | - RCT-Folly (= 2020.01.13.00) 65 | - React-Core/Default (= 0.64.3) 66 | - React-cxxreact (= 0.64.3) 67 | - React-jsi (= 0.64.3) 68 | - React-jsiexecutor (= 0.64.3) 69 | - React-perflogger (= 0.64.3) 70 | - Yoga 71 | - React-Core/CoreModulesHeaders (0.64.3): 72 | - glog 73 | - RCT-Folly (= 2020.01.13.00) 74 | - React-Core/Default 75 | - React-cxxreact (= 0.64.3) 76 | - React-jsi (= 0.64.3) 77 | - React-jsiexecutor (= 0.64.3) 78 | - React-perflogger (= 0.64.3) 79 | - Yoga 80 | - React-Core/Default (0.64.3): 81 | - glog 82 | - RCT-Folly (= 2020.01.13.00) 83 | - React-cxxreact (= 0.64.3) 84 | - React-jsi (= 0.64.3) 85 | - React-jsiexecutor (= 0.64.3) 86 | - React-perflogger (= 0.64.3) 87 | - Yoga 88 | - React-Core/DevSupport (0.64.3): 89 | - glog 90 | - RCT-Folly (= 2020.01.13.00) 91 | - React-Core/Default (= 0.64.3) 92 | - React-Core/RCTWebSocket (= 0.64.3) 93 | - React-cxxreact (= 0.64.3) 94 | - React-jsi (= 0.64.3) 95 | - React-jsiexecutor (= 0.64.3) 96 | - React-jsinspector (= 0.64.3) 97 | - React-perflogger (= 0.64.3) 98 | - Yoga 99 | - React-Core/RCTActionSheetHeaders (0.64.3): 100 | - glog 101 | - RCT-Folly (= 2020.01.13.00) 102 | - React-Core/Default 103 | - React-cxxreact (= 0.64.3) 104 | - React-jsi (= 0.64.3) 105 | - React-jsiexecutor (= 0.64.3) 106 | - React-perflogger (= 0.64.3) 107 | - Yoga 108 | - React-Core/RCTAnimationHeaders (0.64.3): 109 | - glog 110 | - RCT-Folly (= 2020.01.13.00) 111 | - React-Core/Default 112 | - React-cxxreact (= 0.64.3) 113 | - React-jsi (= 0.64.3) 114 | - React-jsiexecutor (= 0.64.3) 115 | - React-perflogger (= 0.64.3) 116 | - Yoga 117 | - React-Core/RCTBlobHeaders (0.64.3): 118 | - glog 119 | - RCT-Folly (= 2020.01.13.00) 120 | - React-Core/Default 121 | - React-cxxreact (= 0.64.3) 122 | - React-jsi (= 0.64.3) 123 | - React-jsiexecutor (= 0.64.3) 124 | - React-perflogger (= 0.64.3) 125 | - Yoga 126 | - React-Core/RCTImageHeaders (0.64.3): 127 | - glog 128 | - RCT-Folly (= 2020.01.13.00) 129 | - React-Core/Default 130 | - React-cxxreact (= 0.64.3) 131 | - React-jsi (= 0.64.3) 132 | - React-jsiexecutor (= 0.64.3) 133 | - React-perflogger (= 0.64.3) 134 | - Yoga 135 | - React-Core/RCTLinkingHeaders (0.64.3): 136 | - glog 137 | - RCT-Folly (= 2020.01.13.00) 138 | - React-Core/Default 139 | - React-cxxreact (= 0.64.3) 140 | - React-jsi (= 0.64.3) 141 | - React-jsiexecutor (= 0.64.3) 142 | - React-perflogger (= 0.64.3) 143 | - Yoga 144 | - React-Core/RCTNetworkHeaders (0.64.3): 145 | - glog 146 | - RCT-Folly (= 2020.01.13.00) 147 | - React-Core/Default 148 | - React-cxxreact (= 0.64.3) 149 | - React-jsi (= 0.64.3) 150 | - React-jsiexecutor (= 0.64.3) 151 | - React-perflogger (= 0.64.3) 152 | - Yoga 153 | - React-Core/RCTSettingsHeaders (0.64.3): 154 | - glog 155 | - RCT-Folly (= 2020.01.13.00) 156 | - React-Core/Default 157 | - React-cxxreact (= 0.64.3) 158 | - React-jsi (= 0.64.3) 159 | - React-jsiexecutor (= 0.64.3) 160 | - React-perflogger (= 0.64.3) 161 | - Yoga 162 | - React-Core/RCTTextHeaders (0.64.3): 163 | - glog 164 | - RCT-Folly (= 2020.01.13.00) 165 | - React-Core/Default 166 | - React-cxxreact (= 0.64.3) 167 | - React-jsi (= 0.64.3) 168 | - React-jsiexecutor (= 0.64.3) 169 | - React-perflogger (= 0.64.3) 170 | - Yoga 171 | - React-Core/RCTVibrationHeaders (0.64.3): 172 | - glog 173 | - RCT-Folly (= 2020.01.13.00) 174 | - React-Core/Default 175 | - React-cxxreact (= 0.64.3) 176 | - React-jsi (= 0.64.3) 177 | - React-jsiexecutor (= 0.64.3) 178 | - React-perflogger (= 0.64.3) 179 | - Yoga 180 | - React-Core/RCTWebSocket (0.64.3): 181 | - glog 182 | - RCT-Folly (= 2020.01.13.00) 183 | - React-Core/Default (= 0.64.3) 184 | - React-cxxreact (= 0.64.3) 185 | - React-jsi (= 0.64.3) 186 | - React-jsiexecutor (= 0.64.3) 187 | - React-perflogger (= 0.64.3) 188 | - Yoga 189 | - React-CoreModules (0.64.3): 190 | - FBReactNativeSpec (= 0.64.3) 191 | - RCT-Folly (= 2020.01.13.00) 192 | - RCTTypeSafety (= 0.64.3) 193 | - React-Core/CoreModulesHeaders (= 0.64.3) 194 | - React-jsi (= 0.64.3) 195 | - React-RCTImage (= 0.64.3) 196 | - ReactCommon/turbomodule/core (= 0.64.3) 197 | - React-cxxreact (0.64.3): 198 | - boost-for-react-native (= 1.63.0) 199 | - DoubleConversion 200 | - glog 201 | - RCT-Folly (= 2020.01.13.00) 202 | - React-callinvoker (= 0.64.3) 203 | - React-jsi (= 0.64.3) 204 | - React-jsinspector (= 0.64.3) 205 | - React-perflogger (= 0.64.3) 206 | - React-runtimeexecutor (= 0.64.3) 207 | - React-jsi (0.64.3): 208 | - boost-for-react-native (= 1.63.0) 209 | - DoubleConversion 210 | - glog 211 | - RCT-Folly (= 2020.01.13.00) 212 | - React-jsi/Default (= 0.64.3) 213 | - React-jsi/Default (0.64.3): 214 | - boost-for-react-native (= 1.63.0) 215 | - DoubleConversion 216 | - glog 217 | - RCT-Folly (= 2020.01.13.00) 218 | - React-jsiexecutor (0.64.3): 219 | - DoubleConversion 220 | - glog 221 | - RCT-Folly (= 2020.01.13.00) 222 | - React-cxxreact (= 0.64.3) 223 | - React-jsi (= 0.64.3) 224 | - React-perflogger (= 0.64.3) 225 | - React-jsinspector (0.64.3) 226 | - React-perflogger (0.64.3) 227 | - React-RCTActionSheet (0.64.3): 228 | - React-Core/RCTActionSheetHeaders (= 0.64.3) 229 | - React-RCTAnimation (0.64.3): 230 | - FBReactNativeSpec (= 0.64.3) 231 | - RCT-Folly (= 2020.01.13.00) 232 | - RCTTypeSafety (= 0.64.3) 233 | - React-Core/RCTAnimationHeaders (= 0.64.3) 234 | - React-jsi (= 0.64.3) 235 | - ReactCommon/turbomodule/core (= 0.64.3) 236 | - React-RCTBlob (0.64.3): 237 | - FBReactNativeSpec (= 0.64.3) 238 | - RCT-Folly (= 2020.01.13.00) 239 | - React-Core/RCTBlobHeaders (= 0.64.3) 240 | - React-Core/RCTWebSocket (= 0.64.3) 241 | - React-jsi (= 0.64.3) 242 | - React-RCTNetwork (= 0.64.3) 243 | - ReactCommon/turbomodule/core (= 0.64.3) 244 | - React-RCTImage (0.64.3): 245 | - FBReactNativeSpec (= 0.64.3) 246 | - RCT-Folly (= 2020.01.13.00) 247 | - RCTTypeSafety (= 0.64.3) 248 | - React-Core/RCTImageHeaders (= 0.64.3) 249 | - React-jsi (= 0.64.3) 250 | - React-RCTNetwork (= 0.64.3) 251 | - ReactCommon/turbomodule/core (= 0.64.3) 252 | - React-RCTLinking (0.64.3): 253 | - FBReactNativeSpec (= 0.64.3) 254 | - React-Core/RCTLinkingHeaders (= 0.64.3) 255 | - React-jsi (= 0.64.3) 256 | - ReactCommon/turbomodule/core (= 0.64.3) 257 | - React-RCTNetwork (0.64.3): 258 | - FBReactNativeSpec (= 0.64.3) 259 | - RCT-Folly (= 2020.01.13.00) 260 | - RCTTypeSafety (= 0.64.3) 261 | - React-Core/RCTNetworkHeaders (= 0.64.3) 262 | - React-jsi (= 0.64.3) 263 | - ReactCommon/turbomodule/core (= 0.64.3) 264 | - React-RCTSettings (0.64.3): 265 | - FBReactNativeSpec (= 0.64.3) 266 | - RCT-Folly (= 2020.01.13.00) 267 | - RCTTypeSafety (= 0.64.3) 268 | - React-Core/RCTSettingsHeaders (= 0.64.3) 269 | - React-jsi (= 0.64.3) 270 | - ReactCommon/turbomodule/core (= 0.64.3) 271 | - React-RCTText (0.64.3): 272 | - React-Core/RCTTextHeaders (= 0.64.3) 273 | - React-RCTVibration (0.64.3): 274 | - FBReactNativeSpec (= 0.64.3) 275 | - RCT-Folly (= 2020.01.13.00) 276 | - React-Core/RCTVibrationHeaders (= 0.64.3) 277 | - React-jsi (= 0.64.3) 278 | - ReactCommon/turbomodule/core (= 0.64.3) 279 | - React-runtimeexecutor (0.64.3): 280 | - React-jsi (= 0.64.3) 281 | - ReactCommon/turbomodule/core (0.64.3): 282 | - DoubleConversion 283 | - glog 284 | - RCT-Folly (= 2020.01.13.00) 285 | - React-callinvoker (= 0.64.3) 286 | - React-Core (= 0.64.3) 287 | - React-cxxreact (= 0.64.3) 288 | - React-jsi (= 0.64.3) 289 | - React-perflogger (= 0.64.3) 290 | - RNReanimated (2.3.3): 291 | - DoubleConversion 292 | - FBLazyVector 293 | - FBReactNativeSpec 294 | - glog 295 | - RCT-Folly 296 | - RCTRequired 297 | - RCTTypeSafety 298 | - React 299 | - React-callinvoker 300 | - React-Core 301 | - React-Core/DevSupport 302 | - React-Core/RCTWebSocket 303 | - React-CoreModules 304 | - React-cxxreact 305 | - React-jsi 306 | - React-jsiexecutor 307 | - React-jsinspector 308 | - React-RCTActionSheet 309 | - React-RCTAnimation 310 | - React-RCTBlob 311 | - React-RCTImage 312 | - React-RCTLinking 313 | - React-RCTNetwork 314 | - React-RCTSettings 315 | - React-RCTText 316 | - ReactCommon/turbomodule/core 317 | - Yoga 318 | - Roboflow (0.0.10) 319 | - VisionCamera (2.13.2): 320 | - React 321 | - React-callinvoker 322 | - React-Core 323 | - Yoga (1.14.0) 324 | 325 | DEPENDENCIES: 326 | - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) 327 | - EXApplication (from `../node_modules/expo-application/ios`) 328 | - EXConstants (from `../node_modules/expo-constants/ios`) 329 | - EXErrorRecovery (from `../node_modules/expo-error-recovery/ios`) 330 | - EXFileSystem (from `../node_modules/expo-file-system/ios`) 331 | - EXFont (from `../node_modules/expo-font/ios`) 332 | - EXKeepAwake (from `../node_modules/expo-keep-awake/ios`) 333 | - Expo (from `../node_modules/expo/ios`) 334 | - ExpoModulesCore (from `../node_modules/expo-modules-core/ios`) 335 | - EXSplashScreen (from `../node_modules/expo-splash-screen/ios`) 336 | - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) 337 | - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) 338 | - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) 339 | - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) 340 | - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) 341 | - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) 342 | - React (from `../node_modules/react-native/`) 343 | - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) 344 | - React-Core (from `../node_modules/react-native/`) 345 | - React-Core/DevSupport (from `../node_modules/react-native/`) 346 | - React-Core/RCTWebSocket (from `../node_modules/react-native/`) 347 | - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) 348 | - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) 349 | - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) 350 | - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) 351 | - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) 352 | - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) 353 | - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) 354 | - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) 355 | - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) 356 | - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) 357 | - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) 358 | - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) 359 | - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) 360 | - React-RCTText (from `../node_modules/react-native/Libraries/Text`) 361 | - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) 362 | - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) 363 | - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) 364 | - RNReanimated (from `../node_modules/react-native-reanimated`) 365 | - Roboflow (from `https://github.com/roboflow-ai/roboflow-ios-podspecs`) 366 | - VisionCamera (from `../node_modules/react-native-vision-camera`) 367 | - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) 368 | 369 | SPEC REPOS: 370 | trunk: 371 | - boost-for-react-native 372 | 373 | EXTERNAL SOURCES: 374 | DoubleConversion: 375 | :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" 376 | EXApplication: 377 | :path: "../node_modules/expo-application/ios" 378 | EXConstants: 379 | :path: "../node_modules/expo-constants/ios" 380 | EXErrorRecovery: 381 | :path: "../node_modules/expo-error-recovery/ios" 382 | EXFileSystem: 383 | :path: "../node_modules/expo-file-system/ios" 384 | EXFont: 385 | :path: "../node_modules/expo-font/ios" 386 | EXKeepAwake: 387 | :path: "../node_modules/expo-keep-awake/ios" 388 | Expo: 389 | :path: "../node_modules/expo/ios" 390 | ExpoModulesCore: 391 | :path: "../node_modules/expo-modules-core/ios" 392 | EXSplashScreen: 393 | :path: "../node_modules/expo-splash-screen/ios" 394 | FBLazyVector: 395 | :path: "../node_modules/react-native/Libraries/FBLazyVector" 396 | FBReactNativeSpec: 397 | :path: "../node_modules/react-native/React/FBReactNativeSpec" 398 | glog: 399 | :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" 400 | RCT-Folly: 401 | :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" 402 | RCTRequired: 403 | :path: "../node_modules/react-native/Libraries/RCTRequired" 404 | RCTTypeSafety: 405 | :path: "../node_modules/react-native/Libraries/TypeSafety" 406 | React: 407 | :path: "../node_modules/react-native/" 408 | React-callinvoker: 409 | :path: "../node_modules/react-native/ReactCommon/callinvoker" 410 | React-Core: 411 | :path: "../node_modules/react-native/" 412 | React-CoreModules: 413 | :path: "../node_modules/react-native/React/CoreModules" 414 | React-cxxreact: 415 | :path: "../node_modules/react-native/ReactCommon/cxxreact" 416 | React-jsi: 417 | :path: "../node_modules/react-native/ReactCommon/jsi" 418 | React-jsiexecutor: 419 | :path: "../node_modules/react-native/ReactCommon/jsiexecutor" 420 | React-jsinspector: 421 | :path: "../node_modules/react-native/ReactCommon/jsinspector" 422 | React-perflogger: 423 | :path: "../node_modules/react-native/ReactCommon/reactperflogger" 424 | React-RCTActionSheet: 425 | :path: "../node_modules/react-native/Libraries/ActionSheetIOS" 426 | React-RCTAnimation: 427 | :path: "../node_modules/react-native/Libraries/NativeAnimation" 428 | React-RCTBlob: 429 | :path: "../node_modules/react-native/Libraries/Blob" 430 | React-RCTImage: 431 | :path: "../node_modules/react-native/Libraries/Image" 432 | React-RCTLinking: 433 | :path: "../node_modules/react-native/Libraries/LinkingIOS" 434 | React-RCTNetwork: 435 | :path: "../node_modules/react-native/Libraries/Network" 436 | React-RCTSettings: 437 | :path: "../node_modules/react-native/Libraries/Settings" 438 | React-RCTText: 439 | :path: "../node_modules/react-native/Libraries/Text" 440 | React-RCTVibration: 441 | :path: "../node_modules/react-native/Libraries/Vibration" 442 | React-runtimeexecutor: 443 | :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" 444 | ReactCommon: 445 | :path: "../node_modules/react-native/ReactCommon" 446 | RNReanimated: 447 | :path: "../node_modules/react-native-reanimated" 448 | Roboflow: 449 | :git: https://github.com/roboflow-ai/roboflow-ios-podspecs 450 | VisionCamera: 451 | :path: "../node_modules/react-native-vision-camera" 452 | Yoga: 453 | :path: "../node_modules/react-native/ReactCommon/yoga" 454 | 455 | CHECKOUT OPTIONS: 456 | Roboflow: 457 | :commit: 0b74324d4f897235dbcc3711bf93dba50f781ab5 458 | :git: https://github.com/roboflow-ai/roboflow-ios-podspecs 459 | 460 | SPEC CHECKSUMS: 461 | boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c 462 | DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de 463 | EXApplication: 54fe5bd6268d697771645e8f1aef8b806a65247a 464 | EXConstants: 88bf79622fbd9b476c96d8ec57fe97ca44fe8e3c 465 | EXErrorRecovery: b0d7582714a2cc896e94a2308a356f94dbf14ef7 466 | EXFileSystem: 08a3033ac372b6346becf07839e1ccef26fb1058 467 | EXFont: 2597c10ac85a69d348d44d7873eccf5a7576ef5e 468 | EXKeepAwake: bf48d7f740a5cd2befed6cf9a49911d385c6c47d 469 | Expo: 534e51e607aba8229293297da5585f4b26f50fa1 470 | ExpoModulesCore: 32c0ccb47f477d330ee93db72505380adf0de09a 471 | EXSplashScreen: 21669e598804ee810547dbb6692c8deb5dd8dbf3 472 | FBLazyVector: c71c5917ec0ad2de41d5d06a5855f6d5eda06971 473 | FBReactNativeSpec: b5841bdbe637d787861162addd39fde20c2d8ba8 474 | glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62 475 | RCT-Folly: ec7a233ccc97cc556cf7237f0db1ff65b986f27c 476 | RCTRequired: d34bf57e17cb6e3b2681f4809b13843c021feb6c 477 | RCTTypeSafety: 8dab4933124ed39bb0c1d88d74d61b1eb950f28f 478 | React: ef700aeb19afabff83a9cc5799ac955a9c6b5e0f 479 | React-callinvoker: 5547633d44f3e114b17c03c660ccb5faefd9ed2d 480 | React-Core: 3858d60185d71567962468bf176d582e36e4e25b 481 | React-CoreModules: 29b3397adac0c04915cf93089328664868510717 482 | React-cxxreact: 7e6cc1f4cdfcd40e483dd228fa8a3d3e0ed16f4a 483 | React-jsi: a8b09c29521c798f1783348b37b511ba7b3dbeb3 484 | React-jsiexecutor: df6abc9fafbecb8e5b7a5fbc5e6d4bd017d594d5 485 | React-jsinspector: 34e23860273a23695342f58eed3ffd3ba10c31e0 486 | React-perflogger: cc76a4254d19640f1d8ad1c66fdee800414b805c 487 | React-RCTActionSheet: 7448f049318d8d7e8a9a1ebb742ada721757eea8 488 | React-RCTAnimation: fb9b3fa1a4a9f5e6ab01b3368693ce69860ba76a 489 | React-RCTBlob: a2e7056601c599c19884992f08ebacae810426f9 490 | React-RCTImage: 5a46c12327d0d6f6844a1fe38baa92a1e02847e8 491 | React-RCTLinking: 63dd8305591e1def35267557ed42918aec9eb30b 492 | React-RCTNetwork: d0516e39a5f736b2bff671c3e03804200161dcd3 493 | React-RCTSettings: a09566b14f1649f6c8a39ad1a174bb5c0631bb09 494 | React-RCTText: 04a2f0a281f715f0aed4f515717fafd64510e2c8 495 | React-RCTVibration: c7f845861e79eae13dc1e8217a3cf47a3945b504 496 | React-runtimeexecutor: 493d9abb8b23c3f84e19ae221eeba92cadcb70dc 497 | ReactCommon: 8fea6422328e2fc093e25c9fac67adbcf0f04fb4 498 | RNReanimated: 0e5ef4a7e4e79f84efbe5b40771c31044c51e7d0 499 | Roboflow: 7c77197347307deb252f9986574833c4dec912b6 500 | VisionCamera: 58b4b21d128b474f14b11e4fe11691696e6059bf 501 | Yoga: e6ecf3fa25af9d4c87e94ad7d5d292eedef49749 502 | 503 | PODFILE CHECKSUM: 413bd3b2f386f738a94d76d548b6d040c6d4f37f 504 | 505 | COCOAPODS: 1.11.3 506 | -------------------------------------------------------------------------------- /ios/Podfile.properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo.jsEngine": "jsc" 3 | } 4 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 11 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 12 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 13 | 3D55BD5482BC428385D15A92 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB00E84B197A450D939B6B6E /* noop-file.swift */; }; 14 | 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; 15 | 96905EF65AED1B983A6B3ABC /* libPods-RoboflowExpoExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-RoboflowExpoExample.a */; }; 16 | B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; }; 17 | BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; 18 | BBB06A082812F781008AAC1C /* RoboflowFrameProcessorPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = BBB06A062812F781008AAC1C /* RoboflowFrameProcessorPlugin.m */; }; 19 | BBB06A092812F781008AAC1C /* RoboflowFrameProcessorPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB06A072812F781008AAC1C /* RoboflowFrameProcessorPlugin.swift */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXFileReference section */ 23 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 24 | 13B07F961A680F5B00A75B9A /* RobofloExpoExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RobofloExpoExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 25 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = RoboflowExpoExample/AppDelegate.h; sourceTree = ""; }; 26 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = RoboflowExpoExample/AppDelegate.m; sourceTree = ""; }; 27 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = RoboflowExpoExample/Images.xcassets; sourceTree = ""; }; 28 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = RoboflowExpoExample/Info.plist; sourceTree = ""; }; 29 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RoboflowExpoExample/main.m; sourceTree = ""; }; 30 | 547AC77FE034493C993DA34D /* RoboflowExpoExample-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "RoboflowExpoExample-Bridging-Header.h"; path = "RoboflowExpoExample/RoboflowExpoExample-Bridging-Header.h"; sourceTree = ""; }; 31 | 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-RoboflowExpoExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RoboflowExpoExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 32 | 6C2E3173556A471DD304B334 /* Pods-RoboflowExpoExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RoboflowExpoExample.debug.xcconfig"; path = "Target Support Files/Pods-RoboflowExpoExample/Pods-RoboflowExpoExample.debug.xcconfig"; sourceTree = ""; }; 33 | 7A4D352CD337FB3A3BF06240 /* Pods-RoboflowExpoExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RoboflowExpoExample.release.xcconfig"; path = "Target Support Files/Pods-RoboflowExpoExample/Pods-RoboflowExpoExample.release.xcconfig"; sourceTree = ""; }; 34 | AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = RoboflowExpoExample/SplashScreen.storyboard; sourceTree = ""; }; 35 | BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; 36 | BBB06A062812F781008AAC1C /* RoboflowFrameProcessorPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RoboflowFrameProcessorPlugin.m; path = RoboflowExpoExample/RoboflowFrameProcessorPlugin.m; sourceTree = ""; }; 37 | BBB06A072812F781008AAC1C /* RoboflowFrameProcessorPlugin.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RoboflowFrameProcessorPlugin.swift; path = RoboflowExpoExample/RoboflowFrameProcessorPlugin.swift; sourceTree = ""; }; 38 | DB00E84B197A450D939B6B6E /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "RoboflowExpoExample/noop-file.swift"; sourceTree = ""; }; 39 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 40 | FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-RoboflowExpoExample/ExpoModulesProvider.swift"; sourceTree = ""; }; 41 | /* End PBXFileReference section */ 42 | 43 | /* Begin PBXFrameworksBuildPhase section */ 44 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 45 | isa = PBXFrameworksBuildPhase; 46 | buildActionMask = 2147483647; 47 | files = ( 48 | 96905EF65AED1B983A6B3ABC /* libPods-RoboflowExpoExample.a in Frameworks */, 49 | ); 50 | runOnlyForDeploymentPostprocessing = 0; 51 | }; 52 | /* End PBXFrameworksBuildPhase section */ 53 | 54 | /* Begin PBXGroup section */ 55 | 13B07FAE1A68108700A75B9A /* RoboflowExpoExample */ = { 56 | isa = PBXGroup; 57 | children = ( 58 | BB2F792B24A3F905000567C9 /* Supporting */, 59 | BBB06A062812F781008AAC1C /* RoboflowFrameProcessorPlugin.m */, 60 | BBB06A072812F781008AAC1C /* RoboflowFrameProcessorPlugin.swift */, 61 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 62 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 63 | 13B07FB01A68108700A75B9A /* AppDelegate.m */, 64 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 65 | 13B07FB61A68108700A75B9A /* Info.plist */, 66 | 13B07FB71A68108700A75B9A /* main.m */, 67 | AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, 68 | DB00E84B197A450D939B6B6E /* noop-file.swift */, 69 | 547AC77FE034493C993DA34D /* RoboflowExpoExample-Bridging-Header.h */, 70 | ); 71 | name = RoboflowExpoExample; 72 | sourceTree = ""; 73 | }; 74 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */, 78 | 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-RoboflowExpoExample.a */, 79 | ); 80 | name = Frameworks; 81 | sourceTree = ""; 82 | }; 83 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | ); 87 | name = Libraries; 88 | sourceTree = ""; 89 | }; 90 | 83CBB9F61A601CBA00E9B192 = { 91 | isa = PBXGroup; 92 | children = ( 93 | 13B07FAE1A68108700A75B9A /* RoboflowExpoExample */, 94 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 95 | 83CBBA001A601CBA00E9B192 /* Products */, 96 | 2D16E6871FA4F8E400B85C8A /* Frameworks */, 97 | D65327D7A22EEC0BE12398D9 /* Pods */, 98 | D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */, 99 | ); 100 | indentWidth = 2; 101 | sourceTree = ""; 102 | tabWidth = 2; 103 | usesTabs = 0; 104 | }; 105 | 83CBBA001A601CBA00E9B192 /* Products */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | 13B07F961A680F5B00A75B9A /* RobofloExpoExample.app */, 109 | ); 110 | name = Products; 111 | sourceTree = ""; 112 | }; 113 | 92DBD88DE9BF7D494EA9DA96 /* RoboflowExpoExample */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */, 117 | ); 118 | name = RoboflowExpoExample; 119 | sourceTree = ""; 120 | }; 121 | BB2F792B24A3F905000567C9 /* Supporting */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | BB2F792C24A3F905000567C9 /* Expo.plist */, 125 | ); 126 | name = Supporting; 127 | path = RoboflowExpoExample/Supporting; 128 | sourceTree = ""; 129 | }; 130 | D65327D7A22EEC0BE12398D9 /* Pods */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | 6C2E3173556A471DD304B334 /* Pods-RoboflowExpoExample.debug.xcconfig */, 134 | 7A4D352CD337FB3A3BF06240 /* Pods-RoboflowExpoExample.release.xcconfig */, 135 | ); 136 | path = Pods; 137 | sourceTree = ""; 138 | }; 139 | D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | 92DBD88DE9BF7D494EA9DA96 /* RoboflowExpoExample */, 143 | ); 144 | name = ExpoModulesProviders; 145 | sourceTree = ""; 146 | }; 147 | /* End PBXGroup section */ 148 | 149 | /* Begin PBXNativeTarget section */ 150 | 13B07F861A680F5B00A75B9A /* RoboflowExpoExample */ = { 151 | isa = PBXNativeTarget; 152 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "RoboflowExpoExample" */; 153 | buildPhases = ( 154 | 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, 155 | FD10A7F022414F080027D42C /* Start Packager */, 156 | 13B07F871A680F5B00A75B9A /* Sources */, 157 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 158 | 13B07F8E1A680F5B00A75B9A /* Resources */, 159 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 160 | 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, 161 | 4FF6003665A7A2AEA24E0C06 /* [CP] Embed Pods Frameworks */, 162 | ); 163 | buildRules = ( 164 | ); 165 | dependencies = ( 166 | ); 167 | name = RoboflowExpoExample; 168 | productName = RoboflowExpoExample; 169 | productReference = 13B07F961A680F5B00A75B9A /* RobofloExpoExample.app */; 170 | productType = "com.apple.product-type.application"; 171 | }; 172 | /* End PBXNativeTarget section */ 173 | 174 | /* Begin PBXProject section */ 175 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 176 | isa = PBXProject; 177 | attributes = { 178 | LastUpgradeCheck = 1130; 179 | TargetAttributes = { 180 | 13B07F861A680F5B00A75B9A = { 181 | DevelopmentTeam = 7SBQ39NG7G; 182 | LastSwiftMigration = 1250; 183 | }; 184 | }; 185 | }; 186 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "RoboflowExpoExample" */; 187 | compatibilityVersion = "Xcode 3.2"; 188 | developmentRegion = en; 189 | hasScannedForEncodings = 0; 190 | knownRegions = ( 191 | en, 192 | Base, 193 | ); 194 | mainGroup = 83CBB9F61A601CBA00E9B192; 195 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 196 | projectDirPath = ""; 197 | projectRoot = ""; 198 | targets = ( 199 | 13B07F861A680F5B00A75B9A /* RoboflowExpoExample */, 200 | ); 201 | }; 202 | /* End PBXProject section */ 203 | 204 | /* Begin PBXResourcesBuildPhase section */ 205 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 206 | isa = PBXResourcesBuildPhase; 207 | buildActionMask = 2147483647; 208 | files = ( 209 | BB2F792D24A3F905000567C9 /* Expo.plist in Resources */, 210 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 211 | 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, 212 | ); 213 | runOnlyForDeploymentPostprocessing = 0; 214 | }; 215 | /* End PBXResourcesBuildPhase section */ 216 | 217 | /* Begin PBXShellScriptBuildPhase section */ 218 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 219 | isa = PBXShellScriptBuildPhase; 220 | buildActionMask = 2147483647; 221 | files = ( 222 | ); 223 | inputPaths = ( 224 | ); 225 | name = "Bundle React Native code and images"; 226 | outputPaths = ( 227 | ); 228 | runOnlyForDeploymentPostprocessing = 0; 229 | shellPath = /bin/sh; 230 | shellScript = "export NODE_BINARY=node\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\n`node --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n"; 231 | }; 232 | 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { 233 | isa = PBXShellScriptBuildPhase; 234 | buildActionMask = 2147483647; 235 | files = ( 236 | ); 237 | inputFileListPaths = ( 238 | ); 239 | inputPaths = ( 240 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 241 | "${PODS_ROOT}/Manifest.lock", 242 | ); 243 | name = "[CP] Check Pods Manifest.lock"; 244 | outputFileListPaths = ( 245 | ); 246 | outputPaths = ( 247 | "$(DERIVED_FILE_DIR)/Pods-RoboflowExpoExample-checkManifestLockResult.txt", 248 | ); 249 | runOnlyForDeploymentPostprocessing = 0; 250 | shellPath = /bin/sh; 251 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 252 | showEnvVarsInLog = 0; 253 | }; 254 | 4FF6003665A7A2AEA24E0C06 /* [CP] Embed Pods Frameworks */ = { 255 | isa = PBXShellScriptBuildPhase; 256 | buildActionMask = 2147483647; 257 | files = ( 258 | ); 259 | inputPaths = ( 260 | "${PODS_ROOT}/Target Support Files/Pods-RoboflowExpoExample/Pods-RoboflowExpoExample-frameworks.sh", 261 | "${PODS_XCFRAMEWORKS_BUILD_DIR}/Roboflow/Roboflow.framework/Roboflow", 262 | ); 263 | name = "[CP] Embed Pods Frameworks"; 264 | outputPaths = ( 265 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Roboflow.framework", 266 | ); 267 | runOnlyForDeploymentPostprocessing = 0; 268 | shellPath = /bin/sh; 269 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RoboflowExpoExample/Pods-RoboflowExpoExample-frameworks.sh\"\n"; 270 | showEnvVarsInLog = 0; 271 | }; 272 | 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { 273 | isa = PBXShellScriptBuildPhase; 274 | buildActionMask = 2147483647; 275 | files = ( 276 | ); 277 | inputPaths = ( 278 | "${PODS_ROOT}/Target Support Files/Pods-RoboflowExpoExample/Pods-RoboflowExpoExample-resources.sh", 279 | "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", 280 | "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle", 281 | ); 282 | name = "[CP] Copy Pods Resources"; 283 | outputPaths = ( 284 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", 285 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", 286 | ); 287 | runOnlyForDeploymentPostprocessing = 0; 288 | shellPath = /bin/sh; 289 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RoboflowExpoExample/Pods-RoboflowExpoExample-resources.sh\"\n"; 290 | showEnvVarsInLog = 0; 291 | }; 292 | FD10A7F022414F080027D42C /* Start Packager */ = { 293 | isa = PBXShellScriptBuildPhase; 294 | buildActionMask = 2147483647; 295 | files = ( 296 | ); 297 | inputFileListPaths = ( 298 | ); 299 | inputPaths = ( 300 | ); 301 | name = "Start Packager"; 302 | outputFileListPaths = ( 303 | ); 304 | outputPaths = ( 305 | ); 306 | runOnlyForDeploymentPostprocessing = 0; 307 | shellPath = /bin/sh; 308 | shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > `node --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/.packager.env'\"`\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open `node --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/launchPackager.command'\"` || echo \"Can't start packager automatically\"\n fi\nfi\n"; 309 | showEnvVarsInLog = 0; 310 | }; 311 | /* End PBXShellScriptBuildPhase section */ 312 | 313 | /* Begin PBXSourcesBuildPhase section */ 314 | 13B07F871A680F5B00A75B9A /* Sources */ = { 315 | isa = PBXSourcesBuildPhase; 316 | buildActionMask = 2147483647; 317 | files = ( 318 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 319 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 320 | B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */, 321 | 3D55BD5482BC428385D15A92 /* noop-file.swift in Sources */, 322 | BBB06A082812F781008AAC1C /* RoboflowFrameProcessorPlugin.m in Sources */, 323 | BBB06A092812F781008AAC1C /* RoboflowFrameProcessorPlugin.swift in Sources */, 324 | ); 325 | runOnlyForDeploymentPostprocessing = 0; 326 | }; 327 | /* End PBXSourcesBuildPhase section */ 328 | 329 | /* Begin XCBuildConfiguration section */ 330 | 13B07F941A680F5B00A75B9A /* Debug */ = { 331 | isa = XCBuildConfiguration; 332 | baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-RoboflowExpoExample.debug.xcconfig */; 333 | buildSettings = { 334 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 335 | CLANG_ENABLE_MODULES = YES; 336 | CODE_SIGN_ENTITLEMENTS = RoboflowExpoExample/RobofloExpoExample.entitlements; 337 | CURRENT_PROJECT_VERSION = 1; 338 | DEVELOPMENT_TEAM = 7SBQ39NG7G; 339 | ENABLE_BITCODE = NO; 340 | GCC_PREPROCESSOR_DEFINITIONS = ( 341 | "$(inherited)", 342 | "FB_SONARKIT_ENABLED=1", 343 | ); 344 | INFOPLIST_FILE = RoboflowExpoExample/Info.plist; 345 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 346 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 347 | OTHER_LDFLAGS = ( 348 | "$(inherited)", 349 | "-ObjC", 350 | "-lc++", 351 | ); 352 | PRODUCT_BUNDLE_IDENTIFIER = com.roboflow.RobofloExpoExample; 353 | PRODUCT_NAME = RobofloExpoExample; 354 | SWIFT_OBJC_BRIDGING_HEADER = "RoboflowExpoExample/RoboflowExpoExample-Bridging-Header.h"; 355 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 356 | SWIFT_VERSION = 5.0; 357 | TARGETED_DEVICE_FAMILY = "1,2"; 358 | VERSIONING_SYSTEM = "apple-generic"; 359 | }; 360 | name = Debug; 361 | }; 362 | 13B07F951A680F5B00A75B9A /* Release */ = { 363 | isa = XCBuildConfiguration; 364 | baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-RoboflowExpoExample.release.xcconfig */; 365 | buildSettings = { 366 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 367 | CLANG_ENABLE_MODULES = YES; 368 | CODE_SIGN_ENTITLEMENTS = RoboflowExpoExample/RobofloExpoExample.entitlements; 369 | CURRENT_PROJECT_VERSION = 1; 370 | DEVELOPMENT_TEAM = 7SBQ39NG7G; 371 | INFOPLIST_FILE = RoboflowExpoExample/Info.plist; 372 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 373 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 374 | OTHER_LDFLAGS = ( 375 | "$(inherited)", 376 | "-ObjC", 377 | "-lc++", 378 | ); 379 | PRODUCT_BUNDLE_IDENTIFIER = com.roboflow.RobofloExpoExample; 380 | PRODUCT_NAME = RobofloExpoExample; 381 | SWIFT_OBJC_BRIDGING_HEADER = "RoboflowExpoExample/RoboflowExpoExample-Bridging-Header.h"; 382 | SWIFT_VERSION = 5.0; 383 | TARGETED_DEVICE_FAMILY = "1,2"; 384 | VERSIONING_SYSTEM = "apple-generic"; 385 | }; 386 | name = Release; 387 | }; 388 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 389 | isa = XCBuildConfiguration; 390 | buildSettings = { 391 | ALWAYS_SEARCH_USER_PATHS = NO; 392 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 393 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 394 | CLANG_CXX_LIBRARY = "libc++"; 395 | CLANG_ENABLE_MODULES = YES; 396 | CLANG_ENABLE_OBJC_ARC = YES; 397 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 398 | CLANG_WARN_BOOL_CONVERSION = YES; 399 | CLANG_WARN_COMMA = YES; 400 | CLANG_WARN_CONSTANT_CONVERSION = YES; 401 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 402 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 403 | CLANG_WARN_EMPTY_BODY = YES; 404 | CLANG_WARN_ENUM_CONVERSION = YES; 405 | CLANG_WARN_INFINITE_RECURSION = YES; 406 | CLANG_WARN_INT_CONVERSION = YES; 407 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 408 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 409 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 410 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 411 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 412 | CLANG_WARN_STRICT_PROTOTYPES = YES; 413 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 414 | CLANG_WARN_UNREACHABLE_CODE = YES; 415 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 416 | CODE_SIGN_ENTITLEMENTS = RoboflowExpoExample/RobofloExpoExample.entitlements; 417 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 418 | COPY_PHASE_STRIP = NO; 419 | ENABLE_STRICT_OBJC_MSGSEND = YES; 420 | ENABLE_TESTABILITY = YES; 421 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; 422 | GCC_C_LANGUAGE_STANDARD = gnu99; 423 | GCC_DYNAMIC_NO_PIC = NO; 424 | GCC_NO_COMMON_BLOCKS = YES; 425 | GCC_OPTIMIZATION_LEVEL = 0; 426 | GCC_PREPROCESSOR_DEFINITIONS = ( 427 | "DEBUG=1", 428 | "$(inherited)", 429 | ); 430 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 431 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 432 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 433 | GCC_WARN_UNDECLARED_SELECTOR = YES; 434 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 435 | GCC_WARN_UNUSED_FUNCTION = YES; 436 | GCC_WARN_UNUSED_VARIABLE = YES; 437 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 438 | LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; 439 | LIBRARY_SEARCH_PATHS = "\"$(inherited)\""; 440 | MTL_ENABLE_DEBUG_INFO = YES; 441 | ONLY_ACTIVE_ARCH = YES; 442 | SDKROOT = iphoneos; 443 | }; 444 | name = Debug; 445 | }; 446 | 83CBBA211A601CBA00E9B192 /* Release */ = { 447 | isa = XCBuildConfiguration; 448 | buildSettings = { 449 | ALWAYS_SEARCH_USER_PATHS = NO; 450 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 451 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 452 | CLANG_CXX_LIBRARY = "libc++"; 453 | CLANG_ENABLE_MODULES = YES; 454 | CLANG_ENABLE_OBJC_ARC = YES; 455 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 456 | CLANG_WARN_BOOL_CONVERSION = YES; 457 | CLANG_WARN_COMMA = YES; 458 | CLANG_WARN_CONSTANT_CONVERSION = YES; 459 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 460 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 461 | CLANG_WARN_EMPTY_BODY = YES; 462 | CLANG_WARN_ENUM_CONVERSION = YES; 463 | CLANG_WARN_INFINITE_RECURSION = YES; 464 | CLANG_WARN_INT_CONVERSION = YES; 465 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 466 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 467 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 468 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 469 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 470 | CLANG_WARN_STRICT_PROTOTYPES = YES; 471 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 472 | CLANG_WARN_UNREACHABLE_CODE = YES; 473 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 474 | CODE_SIGN_ENTITLEMENTS = RoboflowExpoExample/RobofloExpoExample.entitlements; 475 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 476 | COPY_PHASE_STRIP = YES; 477 | ENABLE_NS_ASSERTIONS = NO; 478 | ENABLE_STRICT_OBJC_MSGSEND = YES; 479 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; 480 | GCC_C_LANGUAGE_STANDARD = gnu99; 481 | GCC_NO_COMMON_BLOCKS = YES; 482 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 483 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 484 | GCC_WARN_UNDECLARED_SELECTOR = YES; 485 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 486 | GCC_WARN_UNUSED_FUNCTION = YES; 487 | GCC_WARN_UNUSED_VARIABLE = YES; 488 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 489 | LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; 490 | LIBRARY_SEARCH_PATHS = "\"$(inherited)\""; 491 | MTL_ENABLE_DEBUG_INFO = NO; 492 | SDKROOT = iphoneos; 493 | VALIDATE_PRODUCT = YES; 494 | }; 495 | name = Release; 496 | }; 497 | /* End XCBuildConfiguration section */ 498 | 499 | /* Begin XCConfigurationList section */ 500 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "RoboflowExpoExample" */ = { 501 | isa = XCConfigurationList; 502 | buildConfigurations = ( 503 | 13B07F941A680F5B00A75B9A /* Debug */, 504 | 13B07F951A680F5B00A75B9A /* Release */, 505 | ); 506 | defaultConfigurationIsVisible = 0; 507 | defaultConfigurationName = Release; 508 | }; 509 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "RoboflowExpoExample" */ = { 510 | isa = XCConfigurationList; 511 | buildConfigurations = ( 512 | 83CBBA201A601CBA00E9B192 /* Debug */, 513 | 83CBBA211A601CBA00E9B192 /* Release */, 514 | ); 515 | defaultConfigurationIsVisible = 0; 516 | defaultConfigurationName = Release; 517 | }; 518 | /* End XCConfigurationList section */ 519 | }; 520 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 521 | } 522 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample.xcodeproj/xcshareddata/xcschemes/RoboflowExpoExample.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 55 | 61 | 62 | 63 | 64 | 70 | 72 | 78 | 79 | 80 | 81 | 83 | 84 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import 4 | 5 | #import 6 | 7 | @interface AppDelegate : EXAppDelegateWrapper 8 | 9 | @end 10 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | 3 | #import 4 | #import 5 | #import 6 | #import 7 | #import 8 | 9 | #if defined(FB_SONARKIT_ENABLED) && __has_include() 10 | #import 11 | #import 12 | #import 13 | #import 14 | #import 15 | #import 16 | 17 | static void InitializeFlipper(UIApplication *application) { 18 | FlipperClient *client = [FlipperClient sharedClient]; 19 | SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults]; 20 | [client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]]; 21 | [client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]]; 22 | [client addPlugin:[FlipperKitReactPlugin new]]; 23 | [client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]]; 24 | [client start]; 25 | } 26 | #endif 27 | 28 | @implementation AppDelegate 29 | 30 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 31 | { 32 | #if defined(FB_SONARKIT_ENABLED) && __has_include() 33 | InitializeFlipper(application); 34 | #endif 35 | 36 | RCTBridge *bridge = [self.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions]; 37 | RCTRootView *rootView = [self.reactDelegate createRootViewWithBridge:bridge moduleName:@"main" initialProperties:nil]; 38 | rootView.backgroundColor = [UIColor whiteColor]; 39 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 40 | UIViewController *rootViewController = [self.reactDelegate createRootViewController]; 41 | rootViewController.view = rootView; 42 | self.window.rootViewController = rootViewController; 43 | [self.window makeKeyAndVisible]; 44 | 45 | [super application:application didFinishLaunchingWithOptions:launchOptions]; 46 | 47 | return YES; 48 | } 49 | 50 | - (NSArray> *)extraModulesForBridge:(RCTBridge *)bridge 51 | { 52 | // If you'd like to export some custom RCTBridgeModules, add them here! 53 | return @[]; 54 | } 55 | 56 | - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { 57 | #ifdef DEBUG 58 | return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; 59 | #else 60 | return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 61 | #endif 62 | } 63 | 64 | // Linking API 65 | - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { 66 | return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]; 67 | } 68 | 69 | // Universal Links 70 | - (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler { 71 | BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; 72 | return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result; 73 | } 74 | 75 | @end 76 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "iphone", 5 | "size": "20x20", 6 | "scale": "2x", 7 | "filename": "App-Icon-20x20@2x.png" 8 | }, 9 | { 10 | "idiom": "iphone", 11 | "size": "20x20", 12 | "scale": "3x", 13 | "filename": "App-Icon-20x20@3x.png" 14 | }, 15 | { 16 | "idiom": "iphone", 17 | "size": "29x29", 18 | "scale": "1x", 19 | "filename": "App-Icon-29x29@1x.png" 20 | }, 21 | { 22 | "idiom": "iphone", 23 | "size": "29x29", 24 | "scale": "2x", 25 | "filename": "App-Icon-29x29@2x.png" 26 | }, 27 | { 28 | "idiom": "iphone", 29 | "size": "29x29", 30 | "scale": "3x", 31 | "filename": "App-Icon-29x29@3x.png" 32 | }, 33 | { 34 | "idiom": "iphone", 35 | "size": "40x40", 36 | "scale": "2x", 37 | "filename": "App-Icon-40x40@2x.png" 38 | }, 39 | { 40 | "idiom": "iphone", 41 | "size": "40x40", 42 | "scale": "3x", 43 | "filename": "App-Icon-40x40@3x.png" 44 | }, 45 | { 46 | "idiom": "iphone", 47 | "size": "60x60", 48 | "scale": "2x", 49 | "filename": "App-Icon-60x60@2x.png" 50 | }, 51 | { 52 | "idiom": "iphone", 53 | "size": "60x60", 54 | "scale": "3x", 55 | "filename": "App-Icon-60x60@3x.png" 56 | }, 57 | { 58 | "idiom": "ipad", 59 | "size": "20x20", 60 | "scale": "1x", 61 | "filename": "App-Icon-20x20@1x.png" 62 | }, 63 | { 64 | "idiom": "ipad", 65 | "size": "20x20", 66 | "scale": "2x", 67 | "filename": "App-Icon-20x20@2x.png" 68 | }, 69 | { 70 | "idiom": "ipad", 71 | "size": "29x29", 72 | "scale": "1x", 73 | "filename": "App-Icon-29x29@1x.png" 74 | }, 75 | { 76 | "idiom": "ipad", 77 | "size": "29x29", 78 | "scale": "2x", 79 | "filename": "App-Icon-29x29@2x.png" 80 | }, 81 | { 82 | "idiom": "ipad", 83 | "size": "40x40", 84 | "scale": "1x", 85 | "filename": "App-Icon-40x40@1x.png" 86 | }, 87 | { 88 | "idiom": "ipad", 89 | "size": "40x40", 90 | "scale": "2x", 91 | "filename": "App-Icon-40x40@2x.png" 92 | }, 93 | { 94 | "idiom": "ipad", 95 | "size": "76x76", 96 | "scale": "1x", 97 | "filename": "App-Icon-76x76@1x.png" 98 | }, 99 | { 100 | "idiom": "ipad", 101 | "size": "76x76", 102 | "scale": "2x", 103 | "filename": "App-Icon-76x76@2x.png" 104 | }, 105 | { 106 | "idiom": "ipad", 107 | "size": "83.5x83.5", 108 | "scale": "2x", 109 | "filename": "App-Icon-83.5x83.5@2x.png" 110 | }, 111 | { 112 | "idiom": "ios-marketing", 113 | "size": "1024x1024", 114 | "scale": "1x", 115 | "filename": "ItunesArtwork@2x.png" 116 | } 117 | ], 118 | "info": { 119 | "version": 1, 120 | "author": "expo" 121 | } 122 | } -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "expo" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/SplashScreen.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "universal", 5 | "filename": "image.png", 6 | "scale": "1x" 7 | }, 8 | { 9 | "idiom": "universal", 10 | "scale": "2x" 11 | }, 12 | { 13 | "idiom": "universal", 14 | "scale": "3x" 15 | } 16 | ], 17 | "info": { 18 | "version": 1, 19 | "author": "expo" 20 | } 21 | } -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/SplashScreen.imageset/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/SplashScreen.imageset/image.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/SplashScreenBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "universal", 5 | "filename": "image.png", 6 | "scale": "1x" 7 | }, 8 | { 9 | "idiom": "universal", 10 | "scale": "2x" 11 | }, 12 | { 13 | "idiom": "universal", 14 | "scale": "3x" 15 | } 16 | ], 17 | "info": { 18 | "version": 1, 19 | "author": "expo" 20 | } 21 | } -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Images.xcassets/SplashScreenBackground.imageset/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roboflow/RoboflowExpoExample/07ad0bd32f2081ce871f70b0830640d6bd8d7e0f/ios/RoboflowExpoExample/Images.xcassets/SplashScreenBackground.imageset/image.png -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | RoboflowExpoExample 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleURLTypes 24 | 25 | 26 | CFBundleURLSchemes 27 | 28 | com.roboflow.RobofloExpoExample 29 | 30 | 31 | 32 | CFBundleVersion 33 | 1 34 | LSRequiresIPhoneOS 35 | 36 | NSAppTransportSecurity 37 | 38 | NSAllowsArbitraryLoads 39 | 40 | NSExceptionDomains 41 | 42 | localhost 43 | 44 | NSExceptionAllowsInsecureHTTPLoads 45 | 46 | 47 | 48 | 49 | NSCameraUsageDescription 50 | The Roboflow Expo Example would like to access your camera for demonstration purposes. 51 | UILaunchStoryboardName 52 | SplashScreen 53 | UIRequiredDeviceCapabilities 54 | 55 | armv7 56 | 57 | UIRequiresFullScreen 58 | 59 | UIStatusBarStyle 60 | UIStatusBarStyleDefault 61 | UISupportedInterfaceOrientations 62 | 63 | UIInterfaceOrientationPortrait 64 | UIInterfaceOrientationPortraitUpsideDown 65 | 66 | UISupportedInterfaceOrientations~ipad 67 | 68 | UIInterfaceOrientationPortrait 69 | UIInterfaceOrientationPortraitUpsideDown 70 | UIInterfaceOrientationLandscapeLeft 71 | UIInterfaceOrientationLandscapeRight 72 | 73 | UIUserInterfaceStyle 74 | Light 75 | UIViewControllerBasedStatusBarAppearance 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/RobofloExpoExample.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | 8 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/RoboflowExpoExample-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | #import 5 | #import -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/RoboflowFrameProcessorPlugin.m: -------------------------------------------------------------------------------- 1 | // 2 | // RoboflowFrameProcessorPlugin.m 3 | // TelePharmDeployTesting 4 | // 5 | // Created by Maxwell Stone on 4/20/22. 6 | // 7 | 8 | #import 9 | #import 10 | 11 | @interface VISION_EXPORT_SWIFT_FRAME_PROCESSOR(roboflowDetect, RoboflowFrameProcessorPlugin) 12 | @end 13 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/RoboflowFrameProcessorPlugin.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RoboflowFrameProcessorPlugin.swift 3 | // 4 | // Created by Maxwell Stone on 4/20/22. 5 | // 6 | 7 | import Foundation 8 | import Roboflow 9 | import CoreImage 10 | @objc(RoboflowFrameProcessorPlugin) 11 | public class RoboflowFrameProcessorPlugin: NSObject, FrameProcessorPluginBase { 12 | 13 | static let rf = RoboflowMobile(apiKey: "YOUR API KEY") 14 | static private var model: RFObjectDetectionModel? 15 | static private var loading = false 16 | static private var predictionsBuffer = [[RFObjectDetectionPrediction]]() 17 | 18 | private static func loadRoboflowModelWith(model: String, version: Int, threshold: Double, overlap: Double, maxObjects: Float) { 19 | loading = true 20 | rf.load(model: model, modelVersion: version) { [self] model, error, modelName, modelType in 21 | if error != nil { 22 | print(error?.localizedDescription as Any) 23 | } else { 24 | model?.configure(threshold: threshold, overlap: overlap, maxObjects: maxObjects) 25 | self.model = model 26 | } 27 | loading = false 28 | } 29 | } 30 | 31 | private static func parsePredictions(predictions: [RFObjectDetectionPrediction]) -> [[String: Any]] { 32 | var res = [[String: Any]]() 33 | for det in predictions { 34 | res.append(det.vals()) 35 | } 36 | return res 37 | } 38 | 39 | @objc 40 | public static func callback(_ frame: Frame!, withArgs _: [Any]!) -> Any! { 41 | let buffer = CMSampleBufferGetImageBuffer(frame.buffer) 42 | let ciimage = CIImage(cvPixelBuffer: buffer!) 43 | let context = CIContext(options: nil) 44 | let cgImage = context.createCGImage(ciimage, from: ciimage.extent)! 45 | let image = UIImage(cgImage: cgImage) 46 | let orientation = frame.orientation 47 | if self.model != nil { 48 | model?.detect(image: image) { predictions, error in 49 | if error != nil { 50 | print(error) 51 | } else if let predictions = predictions { 52 | print("New Predictions: \(predictions.count)") 53 | predictionsBuffer.append(predictions) 54 | } 55 | } 56 | //return predictions 57 | } else if (!loading) { 58 | loadRoboflowModelWith(model: "american-sign-language-letters-hpwrr", version: 7/*insert your model version here*/, threshold: 0.1, overlap: 0.5, maxObjects: 20.0) 59 | } 60 | 61 | if predictionsBuffer.count > 0 { 62 | let toReturn = predictionsBuffer[0] 63 | predictionsBuffer.remove(at: 0) 64 | return parsePredictions(predictions:toReturn) 65 | } 66 | return [] 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/SplashScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/Supporting/Expo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | EXUpdatesCheckOnLaunch 6 | ALWAYS 7 | EXUpdatesEnabled 8 | 9 | EXUpdatesLaunchWaitMs 10 | 0 11 | EXUpdatesSDKVersion 12 | 44.0.0 13 | EXUpdatesURL 14 | https://exp.host/@maxhs2014/RoboflowExpoExample 15 | 16 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char * argv[]) { 6 | @autoreleasepool { 7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 8 | } 9 | } 10 | 11 | -------------------------------------------------------------------------------- /ios/RoboflowExpoExample/noop-file.swift: -------------------------------------------------------------------------------- 1 | // 2 | // @generated 3 | // A blank Swift file must be created for native modules with Swift files to work correctly. 4 | // 5 | -------------------------------------------------------------------------------- /metro.config.js: -------------------------------------------------------------------------------- 1 | // Learn more https://docs.expo.io/guides/customizing-metro 2 | const { getDefaultConfig } = require('expo/metro-config'); 3 | 4 | module.exports = getDefaultConfig(__dirname); 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "roboflowexpoexample", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "start": "expo start --dev-client", 6 | "android": "expo run:android", 7 | "ios": "expo run:ios", 8 | "web": "expo start --web", 9 | "eject": "expo eject" 10 | }, 11 | "dependencies": { 12 | "expo": "~44.0.0", 13 | "expo-splash-screen": "~0.14.1", 14 | "expo-status-bar": "~1.2.0", 15 | "react": "17.0.1", 16 | "react-dom": "17.0.1", 17 | "react-native": "0.64.3", 18 | "react-native-reanimated": "~2.10.0", 19 | "react-native-vision-camera": "^2.13.2", 20 | "react-native-web": "0.17.1" 21 | }, 22 | "devDependencies": { 23 | "@babel/core": "^7.12.9" 24 | }, 25 | "private": true 26 | } 27 | -------------------------------------------------------------------------------- /roboflowDetect.js: -------------------------------------------------------------------------------- 1 | import "react-native-reanimated"; 2 | 3 | export const roboflowDetect = (frame) => { 4 | "worklet"; 5 | return [__roboflowDetect(frame), frame.width, frame.height]; 6 | }; 7 | --------------------------------------------------------------------------------