14 |
15 | static void InitializeFlipper(UIApplication *application) {
16 | FlipperClient *client = [FlipperClient sharedClient];
17 | SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults];
18 | [client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]];
19 | [client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]];
20 | [client addPlugin:[FlipperKitReactPlugin new]];
21 | [client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]];
22 | [client start];
23 | }
24 | #endif
25 |
26 | @implementation AppDelegate
27 |
28 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
29 | {
30 | #ifdef FB_SONARKIT_ENABLED
31 | InitializeFlipper(application);
32 | #endif
33 |
34 | RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
35 | RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
36 | moduleName:@"LocationSample"
37 | initialProperties:nil];
38 |
39 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
40 |
41 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
42 | UIViewController *rootViewController = [UIViewController new];
43 | rootViewController.view = rootView;
44 | self.window.rootViewController = rootViewController;
45 | [self.window makeKeyAndVisible];
46 | return YES;
47 | }
48 |
49 | - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
50 | {
51 | #if DEBUG
52 | return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
53 | #else
54 | return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
55 | #endif
56 | }
57 |
58 | @end
59 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/mranderson/locationsample/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.mranderson.locationsample;
2 |
3 | // ---------- START: Required by `package com.mranderson.locationsample.location` ----------
4 | import android.content.ComponentName;
5 | import android.content.Context;
6 | import android.content.Intent;
7 | import android.content.ServiceConnection;
8 | import android.os.IBinder;
9 | import com.mranderson.locationsample.location.LocationUpdatesService;
10 | // ---------- END: Required by `package com.mranderson.locationsample.location` ----------
11 |
12 | import com.facebook.react.ReactActivity;
13 | import com.facebook.react.ReactActivityDelegate;
14 | import com.facebook.react.ReactRootView;
15 |
16 | public class MainActivity extends ReactActivity {
17 | /**
18 | * Returns the name of the main component registered from JavaScript.
19 | * This is used to schedule rendering of the component.
20 | */
21 | @Override
22 | protected String getMainComponentName() {
23 | return "LocationSample";
24 | }
25 |
26 | // @Override
27 | // protected ReactActivityDelegate createReactActivityDelegate() {
28 | // return new ReactActivityDelegate(this, getMainComponentName()) {
29 | // @Override
30 | // protected ReactRootView createRootView() {
31 | // return new RNGestureHandlerEnabledRootView(MainActivity.this);
32 | // }
33 | // };
34 | // }
35 |
36 | // ---------- START: Required by `package com.mranderson.locationsample.location` ----------
37 |
38 | // Tracks the bound state of the service.
39 | private boolean mBound = false;
40 |
41 | // Monitors the state of the connection to the service.
42 | private final ServiceConnection mServiceConnection = new ServiceConnection() {
43 | @Override
44 | public void onServiceConnected(ComponentName name, IBinder service) {
45 | LocationUpdatesService.LocalBinder binder = (LocationUpdatesService.LocalBinder) service;
46 | mBound = true;
47 | }
48 |
49 | @Override
50 | public void onServiceDisconnected(ComponentName name) {
51 | mBound = false;
52 | }
53 | };
54 |
55 | @Override
56 | protected void onStart() {
57 | super.onStart();
58 | bindService(new Intent(this, LocationUpdatesService.class), mServiceConnection,
59 | Context.BIND_AUTO_CREATE);
60 | }
61 |
62 | @Override
63 | protected void onStop() {
64 | if (mBound) {
65 | // Unbind from the service. This signals to the service that this activity is no longer
66 | // in the foreground, and the service can respond by promoting itself to a foreground
67 | // service.
68 | unbindService(mServiceConnection);
69 | mBound = false;
70 | }
71 | super.onStop();
72 | }
73 |
74 | // ---------- STOP: Required by `package com.mranderson.locationsample.location` ----------
75 | }
76 |
--------------------------------------------------------------------------------
/ios/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/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 http://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/app/src/debug/java/com/hoodtocoast/timing/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.mranderson.locationsample;
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 |
32 | client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
33 | client.addPlugin(new ReactFlipperPlugin());
34 | client.addPlugin(new DatabasesFlipperPlugin(context));
35 | client.addPlugin(new SharedPreferencesFlipperPlugin(context));
36 | client.addPlugin(CrashReporterPlugin.getInstance());
37 |
38 | NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
39 | NetworkingModule.setCustomClientBuilder(
40 | new NetworkingModule.CustomClientBuilder() {
41 | @Override
42 | public void apply(OkHttpClient.Builder builder) {
43 | builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
44 | }
45 | });
46 | client.addPlugin(networkFlipperPlugin);
47 | client.start();
48 |
49 | // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
50 | // Hence we run if after all native modules have been initialized
51 | ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
52 | if (reactContext == null) {
53 | reactInstanceManager.addReactInstanceEventListener(
54 | new ReactInstanceManager.ReactInstanceEventListener() {
55 | @Override
56 | public void onReactContextInitialized(ReactContext reactContext) {
57 | reactInstanceManager.removeReactInstanceEventListener(this);
58 | reactContext.runOnNativeModulesQueueThread(
59 | new Runnable() {
60 | @Override
61 | public void run() {
62 | client.addPlugin(new FrescoFlipperPlugin());
63 | }
64 | });
65 | }
66 | });
67 | } else {
68 | client.addPlugin(new FrescoFlipperPlugin());
69 | }
70 | }
71 | }
72 | }
--------------------------------------------------------------------------------
/android/app/src/main/java/com/mranderson/locationsample/MainApplication.java:
--------------------------------------------------------------------------------
1 | package com.mranderson.locationsample;
2 |
3 | // ---------- START: Required by `package com.mranderson.locationsample.location` ----------
4 | import androidx.multidex.MultiDexApplication;
5 | import com.mranderson.locationsample.location.LocationPackage;
6 | // ---------- STOP: Required by `package com.mranderson.locationsample.location` ----------
7 |
8 | // ---------- REMOVED: `import android.app.Application;` ----------
9 | import android.content.Context;
10 | import com.facebook.react.PackageList;
11 | import com.facebook.react.ReactApplication;
12 | import com.facebook.react.ReactInstanceManager;
13 | import com.facebook.react.ReactNativeHost;
14 | import com.facebook.react.ReactPackage;
15 | import com.facebook.soloader.SoLoader;
16 | import java.lang.reflect.InvocationTargetException;
17 | import java.util.List;
18 |
19 | // ---------- REPLACED: `extends Application` with `extends MultiDexApplication` ----------
20 | public class MainApplication extends MultiDexApplication implements ReactApplication {
21 |
22 | private final ReactNativeHost mReactNativeHost =
23 | new ReactNativeHost(this) {
24 | @Override
25 | public boolean getUseDeveloperSupport() {
26 | return BuildConfig.DEBUG;
27 | }
28 |
29 | @Override
30 | protected List getPackages() {
31 | @SuppressWarnings("UnnecessaryLocalVariable")
32 | List packages = new PackageList(this).getPackages();
33 | // Packages that cannot be autolinked yet can be added manually here, for example:
34 | // packages.add(new MyReactNativePackage());
35 | // ---------- START: Required by `package com.mranderson.locationsample.location` ----------
36 | packages.add(new LocationPackage());
37 | // ---------- STOP: Required by `package com.mranderson.locationsample.location` ----------
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 | initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
57 | }
58 |
59 | /**
60 | * Loads Flipper in React Native templates. Call this in the onCreate method with something like
61 | * initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
62 | *
63 | * @param context
64 | * @param reactInstanceManager
65 | */
66 | private static void initializeFlipper(
67 | Context context, ReactInstanceManager reactInstanceManager) {
68 | if (BuildConfig.DEBUG) {
69 | try {
70 | /*
71 | We use reflection here to pick up the class that initializes Flipper,
72 | since Flipper library is not available in release mode
73 | */
74 | Class> aClass = Class.forName("com.mranderson.locationsample.ReactNativeFlipper");
75 | aClass
76 | .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
77 | .invoke(null, context, reactInstanceManager);
78 | } catch (ClassNotFoundException e) {
79 | e.printStackTrace();
80 | } catch (NoSuchMethodException e) {
81 | e.printStackTrace();
82 | } catch (IllegalAccessException e) {
83 | e.printStackTrace();
84 | } catch (InvocationTargetException e) {
85 | e.printStackTrace();
86 | }
87 | }
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/ios/LocationSample.xcodeproj/xcshareddata/xcschemes/LocationSample.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/LocationSample.xcodeproj/xcshareddata/xcschemes/LocationSample-tvOS.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 |
--------------------------------------------------------------------------------
/app/hooks.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @format
3 | * @flow
4 | */
5 |
6 | import type {
7 | AppState as AppStateType,
8 | Location,
9 | TimingDispatch,
10 | TimingState,
11 | } from './types';
12 |
13 | import { useEffect } from 'react';
14 | import { AppState, DeviceEventEmitter, NativeModules } from 'react-native';
15 | import RNLocation from 'react-native-location';
16 | import { Actions } from './reducer';
17 |
18 | export const useLocation = (state: TimingState, dispatch: TimingDispatch) => {
19 | return useEffect(() => {
20 | const checkPermission = () => {
21 | RNLocation.getCurrentPermission().then(currentPermission => {
22 | if (currentPermission === 'notDetermined') {
23 | return;
24 | }
25 |
26 | const granted =
27 | currentPermission !== 'denied' && currentPermission !== 'restricted';
28 | dispatch({ type: Actions.LocationRequested, granted });
29 | });
30 | };
31 |
32 | if (typeof state.granted === 'undefined') {
33 | checkPermission();
34 | }
35 |
36 | const handleAppStateChange = (nextAppState: AppStateType) => {
37 | if (nextAppState === 'active') {
38 | checkPermission();
39 | }
40 | };
41 |
42 | AppState.addEventListener('change', handleAppStateChange);
43 |
44 | return () => {
45 | AppState.removeEventListener('change', handleAppStateChange);
46 | };
47 | }, [dispatch, state.granted]);
48 | };
49 |
50 | type NativeLocationEvent = {
51 | latitude: number,
52 | longitude: number,
53 | timestamp: number,
54 | };
55 |
56 | export const useNativeLocationTracking = (
57 | state: TimingState,
58 | dispatch: TimingDispatch
59 | ) => {
60 | return useEffect(() => {
61 | let subscription;
62 | if (!state.running) {
63 | NativeModules.LocationManager.stopBackgroundLocation();
64 | typeof subscription !== 'undefined' && subscription.remove();
65 | return;
66 | }
67 |
68 | if (state.granted) {
69 | subscription = DeviceEventEmitter.addListener(
70 | NativeModules.LocationManager.JS_LOCATION_EVENT_NAME,
71 | (e: NativeLocationEvent) => {
72 | // console.log('Received Location Event:', e);
73 | dispatch({
74 | type: Actions.UpdatePosition,
75 | position: {
76 | accuracy: 10,
77 | lat: e.latitude,
78 | lng: e.longitude,
79 | timestamp: e.timestamp,
80 | },
81 | });
82 | }
83 | );
84 |
85 | NativeModules.LocationManager.startBackgroundLocation();
86 | }
87 |
88 | return () => {
89 | NativeModules.LocationManager.stopBackgroundLocation();
90 | typeof subscription !== 'undefined' && subscription.remove();
91 | };
92 | }, [state.granted, state.running, dispatch]);
93 | };
94 |
95 | export const useLocationTracking = (
96 | state: TimingState,
97 | dispatch: TimingDispatch
98 | ) => {
99 | return useEffect(() => {
100 | let unsubscribe;
101 | if (!state.running) {
102 | typeof unsubscribe !== 'undefined' && unsubscribe();
103 | return;
104 | }
105 |
106 | if (state.granted) {
107 | unsubscribe = RNLocation.subscribeToLocationUpdates(
108 | (locations: Location[]) => {
109 | locations.forEach(l => {
110 | // console.log('Received Location:', l);
111 | dispatch({
112 | type: Actions.UpdatePosition,
113 | position: {
114 | accuracy: l.accuracy,
115 | lat: l.latitude,
116 | lng: l.longitude,
117 | timestamp: l.timestamp,
118 | },
119 | });
120 | });
121 | }
122 | );
123 | }
124 |
125 | return () => {
126 | typeof unsubscribe !== 'undefined' && unsubscribe();
127 | };
128 | }, [state.granted, state.running, dispatch]);
129 | };
130 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/mranderson/locationsample/location/LocationModule.java:
--------------------------------------------------------------------------------
1 | package com.mranderson.locationsample.location;
2 |
3 | import android.content.BroadcastReceiver;
4 | import android.content.Context;
5 | import android.content.Intent;
6 | import android.content.IntentFilter;
7 |
8 | import com.facebook.react.bridge.Arguments;
9 | import com.facebook.react.bridge.ReactApplicationContext;
10 | import com.facebook.react.bridge.ReactContext;
11 | import com.facebook.react.bridge.ReactContextBaseJavaModule;
12 | import com.facebook.react.bridge.ReactMethod;
13 | import com.facebook.react.bridge.WritableMap;
14 | import com.facebook.react.modules.core.DeviceEventManagerModule;
15 | import com.google.gson.Gson;
16 |
17 | import java.util.HashMap;
18 | import java.util.Map;
19 |
20 | import javax.annotation.Nonnull;
21 | import javax.annotation.Nullable;
22 |
23 | public class LocationModule extends ReactContextBaseJavaModule implements JSEventSender {
24 |
25 | // private static final String TAG = LocationModule.class.getSimpleName();
26 |
27 | private static final String MODULE_NAME = "LocationManager";
28 | private static final String CONST_JS_LOCATION_EVENT_NAME = "JS_LOCATION_EVENT_NAME";
29 | private static final String CONST_JS_LOCATION_LAT = "JS_LOCATION_LAT_KEY";
30 | private static final String CONST_JS_LOCATION_LON = "JS_LOCATION_LON_KEY";
31 | private static final String CONST_JS_LOCATION_TIME = "JS_LOCATION_TIME_KEY";
32 | public static final String JS_LOCATION_LAT_KEY = "latitude";
33 | public static final String JS_LOCATION_LON_KEY = "longitude";
34 | public static final String JS_LOCATION_TIME_KEY = "timestamp";
35 | public static final String JS_LOCATION_EVENT_NAME = "location_received";
36 |
37 | private Context mContext;
38 | private BroadcastReceiver mEventReceiver;
39 |
40 | private Gson mGson;
41 |
42 | LocationModule(@Nonnull ReactApplicationContext reactContext) {
43 | super(reactContext);
44 | mContext = reactContext;
45 | mGson = new Gson();
46 | createEventReceiver();
47 | registerEventReceiver();
48 | }
49 |
50 |
51 | @ReactMethod
52 | @SuppressWarnings("unused")
53 | public void startBackgroundLocation() {
54 | Intent eventIntent = new Intent("LocationUpdatesService.startStopLocation");
55 | eventIntent.putExtra("StartStopLocation", "START");
56 | getReactApplicationContext().sendBroadcast(eventIntent);
57 | }
58 |
59 | @ReactMethod
60 | @SuppressWarnings("unused")
61 | public void stopBackgroundLocation() {
62 | Intent eventIntent = new Intent("LocationUpdatesService.startStopLocation");
63 | eventIntent.putExtra("StartStopLocation", "STOP");
64 | getReactApplicationContext().sendBroadcast(eventIntent);
65 | }
66 |
67 | @Nullable
68 | @Override
69 | public Map getConstants() {
70 | final Map constants = new HashMap<>();
71 | constants.put(CONST_JS_LOCATION_EVENT_NAME, JS_LOCATION_EVENT_NAME);
72 | constants.put(CONST_JS_LOCATION_LAT, JS_LOCATION_LAT_KEY);
73 | constants.put(CONST_JS_LOCATION_LON, JS_LOCATION_LON_KEY);
74 | constants.put(CONST_JS_LOCATION_TIME, JS_LOCATION_TIME_KEY);
75 | return constants;
76 | }
77 |
78 | @Nonnull
79 | @Override
80 | public String getName() {
81 | return MODULE_NAME;
82 | }
83 |
84 | public void createEventReceiver() {
85 | mEventReceiver = new BroadcastReceiver() {
86 | @Override
87 | public void onReceive(Context context, Intent intent) {
88 | LocationCoordinates locationCoordinates = mGson.fromJson(
89 | intent.getStringExtra(LocationUpdatesService.LOCATION_EVENT_DATA_NAME),
90 | LocationCoordinates.class);
91 |
92 | WritableMap eventData = Arguments.createMap();
93 | eventData.putDouble(JS_LOCATION_LAT_KEY, locationCoordinates.getLatitude());
94 | eventData.putDouble(JS_LOCATION_LON_KEY, locationCoordinates.getLongitude());
95 | eventData.putDouble(JS_LOCATION_TIME_KEY, locationCoordinates.getTimestamp());
96 |
97 | // if you actually want to send events to JS side, it needs to be in the "Module"
98 | sendEventToJS(getReactApplicationContext(), JS_LOCATION_EVENT_NAME, eventData);
99 | }
100 | };
101 | }
102 |
103 | public void registerEventReceiver() {
104 | IntentFilter eventFilter = new IntentFilter();
105 | eventFilter.addAction(LocationUpdatesService.LOCATION_EVENT_NAME);
106 | mContext.registerReceiver(mEventReceiver, eventFilter);
107 | }
108 |
109 | @Override
110 | public void sendEventToJS(ReactContext reactContext, String eventName, @Nullable WritableMap params) {
111 | reactContext
112 | .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
113 | .emit(eventName, params);
114 | }
115 |
116 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ReactNative "Background" Location Tracking
2 |
3 | ### This is an example app which demonstrates "background" location tracking in both iOS and Android.
4 |
5 | > I put "background" in quotes, because on Android it's actually using a "Foreground Service".
6 |
7 | This project contains an [Android Native Module](https://reactnative.dev/docs/native-modules-android) so you'll have to have your project "ejected" (if you started with Expo). If you started with the React Native CLI (via `react-native init`) you should be good to go.
8 |
9 | ### iOS Features
10 |
11 | - Uses [React Native Location](https://github.com/timfpark/react-native-location)
12 |
13 | ### Android Features
14 |
15 | - Uses APIs provided by Android (like: [FusedLocationProviderClient](https://developers.google.com/android/reference/com/google/android/gms/location/FusedLocationProviderClient) and [Foreground Service](https://developer.android.com/guide/components/services#Types-of-services))
16 | - Android Location query interval is customisable down to 1s (maybe faster? I haven't tested that yet...)
17 | - Display's "Ongoing" notification to the user while the app is requesting location updates
18 | - Communicates location to your ReactNative JS code while the app is closed and/or the phone screen is off for processing
19 | - Ready to do work on the native side if you'd prefer to save the data directly to the device instead
20 |
21 | ### References
22 |
23 | This project was based on the combination of two other demo apps:
24 |
25 | - https://github.com/comoser/rn-background-location (Uses "Background Service" for better power efficiency but is limited to locations updates down to 1 minute... I needed something faster)
26 | - Android's [LocationUpdatesForegroundService Example](https://github.com/android/location-samples/tree/432d3b72b8c058f220416958b444274ddd186abd/LocationUpdatesForegroundService) found in their [Request Location Updates](https://developer.android.com/training/location/request-updates#addt-resources) page.
27 |
28 | ### WARNING
29 |
30 | I'm very much new to Android development so I had to stumble through parts of this... During development I was testing on device and in simulators using Android API 28 + 29. I have not done exaustive testing, nor know enough about Android to say with confidence how far back this code will support.
31 |
32 | ### Notes about Android Specific changes
33 |
34 | As listed above in the feature sections, iOS is taken care of by [React Native Location](https://github.com/timfpark/react-native-location). The core of this sample project is in the Android specific code. Most of the changes are rolled up into an [Android Native Module](https://reactnative.dev/docs/native-modules-android), located here:
35 |
36 | [./android/app/src/main/java/com/mranderson/locationsample/location](./android/app/src/main/java/com/mranderson/locationsample/location)
37 |
38 | However, a number of other changes also need to be made to the main React Native project:
39 |
40 | - [MainApplication.java](./android/app/src/main/java/com/mranderson/locationsample/MainApplication.java) (to include the location package in the project)
41 | - [MainActivity.java](./android/app/src/main/java/com/mranderson/locationsample/MainActivity.java) (to bind the MainActivity to the location forground service provided by the package mentioned above)
42 | - [AndroidManifest.xml](./android/app/src/main/AndroidManifest.xml) (added the forground location service `` and `` for `ACCESS_FINE_LOCATION` and `FOREGROUND_SERVICE`)
43 | - [strings.xml](./android/app/src/main/res/values/strings.xml) (added a number of text values used by the location service)
44 | - multiple `ic_notify_icon.png` files found in the `drawable-...` folders inside [res](./android/app/src/main/res) (used as the icon that shows in the system notification try while the forground service is active)
45 |
46 | Hopefully that covers pretty much all of it. If I've missed any changes, I'll come back in here and update this list. I also tried to add comments to those files to indicate which changes or additions need to be made.
47 |
48 | ### Notes about the React Native app code
49 |
50 | First and foremost, this sample project uses [React Native Location](https://github.com/timfpark/react-native-location). So, if you plan on trying to copy my changes into your own project, you may want to look over the docs for `RNLocation` first.
51 |
52 | On the iOS side of things, `RNLocation` provides everything you need. It also works on the Android side, just not while the app is "in the background". On both platforms, `RNLocation` is used to prompt the user for location access permission. To do this, you use `RNLocation.requestPermission()` which, in this project, can be found in the [<LocationAccessButton> component](./app/components/LocationAccessButton.js#L21-L35) (or just read more about how it in the `RNLocation` docs).
53 |
54 | For iOS, you also need to initialize `RNLocation` by calling `RNLocation.configure()` which, in this project, can be found in the [index.js](./index.js#L15-L33). In this case, you'll see that I left in the "Android Only" configuration options, even though this sample project actually uses it's own [Android Native Module](https://reactnative.dev/docs/native-modules-android) mentioned above. Any options within the `RNLocation.configure()` call will only effect iOS at this point. If you want to adjust the interval or anything on the Android side, you would need to make changes directly to the Android specific native module files.
55 |
56 | Lastly, for this project, I chose to create a [reducer](./app/reducer.js) and a couple of [custom hooks](./app/hooks.js) to handle the location data and starting/stopping of the location tracking subscription. On iOS, the `useLocationTracking()` hook is used to start and stop `RNLocation.subscribeToLocationUpdates()`. On Android, the `useNativeLocationTracking()` hook is used to start and stop background tracking as well as creates a native event listener which listens for location events that are emitted by the Android Native Module. Both of these hooks then fire an `UpdatePosition` action to the reducer to handle the data provided by each and normalize them into a single usable format in the app.
57 |
--------------------------------------------------------------------------------
/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/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://facebook.github.io/react-native/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: false, // clean and rebuild if changing
82 | ]
83 |
84 | apply from: "../../node_modules/react-native/react.gradle"
85 |
86 | /**
87 | * Set this to true to create two separate APKs instead of one:
88 | * - An APK that only works on ARM devices
89 | * - An APK that only works on x86 devices
90 | * The advantage is the size of the APK is reduced by about 4MB.
91 | * Upload all the APKs to the Play Store and people will download
92 | * the correct one based on the CPU architecture of their device.
93 | */
94 | def enableSeparateBuildPerCPUArchitecture = false
95 |
96 | /**
97 | * Run Proguard to shrink the Java bytecode in release builds.
98 | */
99 | def enableProguardInReleaseBuilds = false
100 |
101 | /**
102 | * The preferred build flavor of JavaScriptCore.
103 | *
104 | * For example, to use the international variant, you can use:
105 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
106 | *
107 | * The international variant includes ICU i18n library and necessary data
108 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
109 | * give correct results when using with locales other than en-US. Note that
110 | * this variant is about 6MiB larger per architecture than default.
111 | */
112 | def jscFlavor = 'org.webkit:android-jsc:+'
113 |
114 | /**
115 | * Whether to enable the Hermes VM.
116 | *
117 | * This should be set on project.ext.react and mirrored here. If it is not set
118 | * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
119 | * and the benefits of using Hermes will therefore be sharply reduced.
120 | */
121 | def enableHermes = project.ext.react.get("enableHermes", false);
122 |
123 | android {
124 | compileSdkVersion rootProject.ext.compileSdkVersion
125 |
126 | compileOptions {
127 | sourceCompatibility JavaVersion.VERSION_1_8
128 | targetCompatibility JavaVersion.VERSION_1_8
129 | }
130 |
131 | defaultConfig {
132 | applicationId "com.mranderson.locationsample"
133 | minSdkVersion rootProject.ext.minSdkVersion
134 | targetSdkVersion rootProject.ext.targetSdkVersion
135 | multiDexEnabled true
136 | versionCode 1
137 | versionName "1.0.0"
138 | }
139 | splits {
140 | abi {
141 | reset()
142 | enable enableSeparateBuildPerCPUArchitecture
143 | universalApk false // If true, also generate a universal APK
144 | include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
145 | }
146 | }
147 | signingConfigs {
148 | debug {
149 | storeFile file('debug.keystore')
150 | storePassword 'android'
151 | keyAlias 'androiddebugkey'
152 | keyPassword 'android'
153 | }
154 | }
155 | buildTypes {
156 | debug {
157 | signingConfig signingConfigs.debug
158 | }
159 | }
160 |
161 | packagingOptions {
162 | pickFirst "lib/armeabi-v7a/libc++_shared.so"
163 | pickFirst "lib/arm64-v8a/libc++_shared.so"
164 | pickFirst "lib/x86/libc++_shared.so"
165 | pickFirst "lib/x86_64/libc++_shared.so"
166 | }
167 |
168 | // applicationVariants are e.g. debug, release
169 | applicationVariants.all { variant ->
170 | variant.outputs.each { output ->
171 | // For each separate APK per architecture, set a unique version code as described here:
172 | // https://developer.android.com/studio/build/configure-apk-splits.html
173 | def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
174 | def abi = output.getFilter(OutputFile.ABI)
175 | if (abi != null) { // null for the universal-debug, universal-release variants
176 | output.versionCodeOverride =
177 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
178 | }
179 |
180 | }
181 | }
182 | }
183 |
184 | dependencies {
185 | implementation fileTree(dir: "libs", include: ["*.jar"])
186 | //noinspection GradleDynamicVersion
187 | implementation "com.facebook.react:react-native:+" // From node_modules
188 |
189 | // For: Better Location
190 | // https://github.com/timfpark/react-native-location#3-install-the-google-fused-location-provider-dependency-optional
191 | implementation "com.google.android.gms:play-services-base:16.0.1"
192 | implementation "com.google.android.gms:play-services-location:16.0.0"
193 |
194 | // For: Background Location NativeModule
195 | implementation 'com.android.support:appcompat-v7:28.0.0'
196 | implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
197 | implementation "com.google.code.gson:gson:2.8.6"
198 | // implementation "androidx.multidex:multidex:2.0.1"
199 | implementation 'com.android.support:multidex:1.0.3'
200 |
201 | implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
202 | debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
203 | exclude group:'com.facebook.fbjni'
204 | }
205 | debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
206 | exclude group:'com.facebook.flipper'
207 | }
208 | debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
209 | exclude group:'com.facebook.flipper'
210 | }
211 |
212 | if (enableHermes) {
213 | def hermesPath = "../../node_modules/hermes-engine/android/";
214 | debugImplementation files(hermesPath + "hermes-debug.aar")
215 | releaseImplementation files(hermesPath + "hermes-release.aar")
216 | } else {
217 | implementation jscFlavor
218 | }
219 | }
220 |
221 | // Run this once to be able to run the application with BUCK
222 | // puts all compile dependencies into folder libs for BUCK to use
223 | task copyDownloadableDepsToLibs(type: Copy) {
224 | from configurations.compile
225 | into 'libs'
226 | }
227 |
228 | apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
229 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/mranderson/locationsample/location/LocationUpdatesService.java:
--------------------------------------------------------------------------------
1 | package com.mranderson.locationsample.location;
2 |
3 | import android.app.ActivityManager;
4 | import android.app.Notification;
5 | import android.app.NotificationChannel;
6 | import android.app.NotificationManager;
7 | import android.app.PendingIntent;
8 | import android.app.Service;
9 | import android.content.BroadcastReceiver;
10 | import android.content.Context;
11 | import android.content.Intent;
12 | import android.content.IntentFilter;
13 | import android.content.res.Configuration;
14 | import android.location.Location;
15 | import android.os.Binder;
16 | import android.os.Build;
17 | import android.os.Handler;
18 | import android.os.HandlerThread;
19 | import android.os.IBinder;
20 | import android.os.Looper;
21 | import android.util.Log;
22 |
23 | import androidx.annotation.NonNull;
24 | import androidx.core.app.NotificationCompat;
25 | import androidx.localbroadcastmanager.content.LocalBroadcastManager;
26 |
27 | import com.google.android.gms.location.FusedLocationProviderClient;
28 | import com.google.android.gms.location.LocationCallback;
29 | import com.google.android.gms.location.LocationRequest;
30 | import com.google.android.gms.location.LocationResult;
31 | import com.google.android.gms.location.LocationServices;
32 | import com.google.android.gms.tasks.OnCompleteListener;
33 | import com.google.android.gms.tasks.Task;
34 | import com.google.gson.Gson;
35 | import com.mranderson.locationsample.MainActivity;
36 | import com.mranderson.locationsample.R;
37 |
38 | import java.util.Date;
39 |
40 | /**
41 | * A bound and started service that is promoted to a foreground service when location updates have
42 | * been requested and all clients unbind.
43 | *
44 | * For apps running in the background on "O" devices, location is computed only once every 10
45 | * minutes and delivered batched every 30 minutes. This restriction applies even to apps
46 | * targeting "N" or lower which are run on "O" devices.
47 | *
48 | * This sample show how to use a long-running service for location updates. When an activity is
49 | * bound to this service, frequent location updates are permitted. When the activity is removed
50 | * from the foreground, the service promotes itself to a foreground service, and location updates
51 | * continue. When the activity comes back to the foreground, the foreground service stops, and the
52 | * notification assocaited with that service is removed.
53 | */
54 | public class LocationUpdatesService extends Service {
55 |
56 | private static final String PACKAGE_NAME = "com.mranderson.locationsample.location";
57 |
58 | private static final String TAG = LocationUpdatesService.class.getSimpleName();
59 |
60 | public static final String LOCATION_EVENT_NAME = "com.mranderson.locationsample.LOCATION_INFO";
61 | public static final String LOCATION_EVENT_DATA_NAME = "LocationData";
62 |
63 | /**
64 | * The name of the channel for notifications.
65 | */
66 | private static final String CHANNEL_ID = "channel_01";
67 |
68 | public static final String ACTION_BROADCAST = PACKAGE_NAME + ".broadcast";
69 |
70 | static final String EXTRA_LOCATION = PACKAGE_NAME + ".location";
71 | private static final String EXTRA_STARTED_FROM_NOTIFICATION = PACKAGE_NAME +
72 | ".started_from_notification";
73 |
74 | private final IBinder mBinder = new LocalBinder();
75 |
76 | /**
77 | * The desired interval for location updates. Inexact. Updates may be more or less frequent.
78 | */
79 | private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 2000;
80 |
81 | /**
82 | * The fastest rate for active location updates. Updates will never be more frequent
83 | * than this value.
84 | */
85 | private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS =
86 | UPDATE_INTERVAL_IN_MILLISECONDS / 2;
87 |
88 | /**
89 | * The identifier for the notification displayed for the foreground service.
90 | */
91 | private static final int NOTIFICATION_ID = 12345678;
92 |
93 | /**
94 | * Used to check whether the bound activity has really gone away and not unbound as part of an
95 | * orientation change. We create a foreground service notification only if the former takes
96 | * place.
97 | */
98 | private boolean mChangingConfiguration = false;
99 |
100 | private NotificationManager mNotificationManager;
101 |
102 | /**
103 | * Contains parameters used by {@link com.google.android.gms.location.FusedLocationProviderApi}.
104 | */
105 | private LocationRequest mLocationRequest;
106 |
107 | /**
108 | * Provides access to the Fused Location Provider API.
109 | */
110 | private FusedLocationProviderClient mFusedLocationClient;
111 |
112 | /**
113 | * Callback for changes in location.
114 | */
115 | private LocationCallback mLocationCallback;
116 |
117 | private Handler mServiceHandler;
118 |
119 | /**
120 | * The current location.
121 | */
122 | private Location mLocation;
123 |
124 | private Gson mGson;
125 |
126 | public LocationUpdatesService() {
127 | mGson = new Gson();
128 | }
129 |
130 | @Override
131 | public void onCreate() {
132 | Log.i(TAG, "in onCreate()");
133 |
134 | mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
135 |
136 | mLocationCallback = new LocationCallback() {
137 | @Override
138 | public void onLocationResult(LocationResult locationResult) {
139 | super.onLocationResult(locationResult);
140 | onNewLocation(locationResult.getLastLocation());
141 | }
142 | };
143 |
144 | createLocationRequest();
145 | getLastLocation();
146 |
147 | HandlerThread handlerThread = new HandlerThread(TAG);
148 | handlerThread.start();
149 | mServiceHandler = new Handler(handlerThread.getLooper());
150 | mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
151 |
152 | // Android O requires a Notification Channel.
153 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
154 | CharSequence name = getString(R.string.app_name);
155 | // Create the channel for the notification
156 | NotificationChannel mChannel =
157 | new NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_MIN);
158 |
159 | // Set the Notification Channel for the Notification Manager.
160 | mNotificationManager.createNotificationChannel(mChannel);
161 | }
162 |
163 | createEventReceiver();
164 | registerEventReceiver();
165 | }
166 |
167 | @Override
168 | public int onStartCommand(Intent intent, int flags, int startId) {
169 | // Log.i(TAG, "in onStartCommand()");
170 |
171 | // We got here because the user decided to remove location updates from the notification.
172 | // boolean startedFromNotification = intent.getBooleanExtra(EXTRA_STARTED_FROM_NOTIFICATION, false);
173 | // if (startedFromNotification) {
174 | // removeLocationUpdates();
175 | // stopSelf();
176 | // stopForeground(true);
177 | // }
178 |
179 | // Tells the system to not try to recreate the service after it has been killed.
180 | return START_NOT_STICKY;
181 | }
182 |
183 | @Override
184 | public void onConfigurationChanged(Configuration newConfig) {
185 | super.onConfigurationChanged(newConfig);
186 | mChangingConfiguration = true;
187 | }
188 |
189 | @Override
190 | public IBinder onBind(Intent intent) {
191 | // Called when a client (MainActivity in case of this sample) comes to the foreground
192 | // and binds with this service. The service should cease to be a foreground service
193 | // when that happens.
194 | Log.i(TAG, "in onBind()");
195 | // stopForeground(true);
196 | mChangingConfiguration = false;
197 | return mBinder;
198 | }
199 |
200 | @Override
201 | public void onRebind(Intent intent) {
202 | // Called when a client (MainActivity in case of this sample) returns to the foreground
203 | // and binds once again with this service. The service should cease to be a foreground
204 | // service when that happens.
205 | Log.i(TAG, "in onRebind()");
206 | // stopForeground(true);
207 | mChangingConfiguration = false;
208 | super.onRebind(intent);
209 | }
210 |
211 | @Override
212 | public boolean onUnbind(Intent intent) {
213 | Log.i(TAG, "Last client unbound from service");
214 |
215 | // Called when the last client (MainActivity in case of this sample) unbinds from this
216 | // service. If this method is called due to a configuration change in MainActivity, we
217 | // do nothing. Otherwise, we make this service a foreground service.
218 | if (!mChangingConfiguration && Utils.requestingLocationUpdates(this)) {
219 | Log.i(TAG, "Starting foreground service");
220 | /*
221 | // TODO(developer). If targeting O, use the following code.
222 | if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O) {
223 | mNotificationManager.startServiceInForeground(new Intent(this,
224 | LocationUpdatesService.class), NOTIFICATION_ID, getNotification());
225 | } else {
226 | startForeground(NOTIFICATION_ID, getNotification());
227 | }
228 | */
229 |
230 | // startForeground(NOTIFICATION_ID, getNotification());
231 | }
232 | return true; // Ensures onRebind() is called when a client re-binds.
233 | }
234 |
235 | @Override
236 | public void onDestroy() {
237 | Log.i(TAG, "in onDestroy()");
238 | removeLocationUpdates();
239 | mServiceHandler.removeCallbacksAndMessages(null);
240 | }
241 |
242 | private BroadcastReceiver mEventReceiver;
243 |
244 | public void createEventReceiver() {
245 | mEventReceiver = new BroadcastReceiver() {
246 | @Override
247 | public void onReceive(Context context, Intent intent) {
248 | String startStop = intent.getStringExtra("StartStopLocation");
249 | // Log.i(TAG, "startStop: " + startStop);
250 | if (startStop.equals("START")) {
251 | requestLocationUpdates();
252 | } else {
253 | removeLocationUpdates();
254 | }
255 | }
256 | };
257 | }
258 |
259 | public void registerEventReceiver() {
260 | IntentFilter eventFilter = new IntentFilter();
261 | eventFilter.addAction("LocationUpdatesService.startStopLocation");
262 | /* mContext */ getApplicationContext().registerReceiver(mEventReceiver, eventFilter);
263 | }
264 |
265 | /**
266 | * Makes a request for location updates. Note that in this sample we merely log the
267 | * {@link SecurityException}.
268 | */
269 | public void requestLocationUpdates() {
270 | Log.i(TAG, "Requesting location updates");
271 | Utils.setRequestingLocationUpdates(this, true);
272 | startService(new Intent(getApplicationContext(), LocationUpdatesService.class));
273 | startForeground(NOTIFICATION_ID, getNotification());
274 | try {
275 | mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
276 | } catch (SecurityException unlikely) {
277 | Utils.setRequestingLocationUpdates(this, false);
278 | Log.e(TAG, "Lost location permission. Could not request updates. " + unlikely);
279 | }
280 | }
281 |
282 | /**
283 | * Removes location updates. Note that in this sample we merely log the
284 | * {@link SecurityException}.
285 | */
286 | public void removeLocationUpdates() {
287 | Log.i(TAG, "Removing location updates");
288 | try {
289 | mFusedLocationClient.removeLocationUpdates(mLocationCallback);
290 | Utils.setRequestingLocationUpdates(this, false);
291 | stopSelf();
292 | stopForeground(true);
293 | } catch (SecurityException unlikely) {
294 | Utils.setRequestingLocationUpdates(this, true);
295 | Log.e(TAG, "Lost location permission. Could not remove updates. " + unlikely);
296 | }
297 | }
298 |
299 | /**
300 | * Returns the {@link NotificationCompat} used as part of the foreground service.
301 | */
302 | private Notification getNotification() {
303 | /**
304 | * PendingIntent that leads to a call to onStartCommand() in this service.
305 | * Extra to help us figure out if we arrived in onStartCommand via the notification or not.
306 | */
307 | // Intent intent = new Intent(this, LocationUpdatesService.class);
308 | // intent.putExtra(EXTRA_STARTED_FROM_NOTIFICATION, true);
309 | // PendingIntent servicePendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
310 |
311 | // PendingIntent to launch app.
312 | PendingIntent activityPendingIntent = PendingIntent.getActivity(this, 0,
313 | new Intent(this, MainActivity.class), 0);
314 |
315 | // CharSequence text = Utils.getLocationText(mLocation);
316 | CharSequence title = "LocationSample is tracking your movement.";
317 |
318 | Notification.Builder builder = new Notification.Builder(this)
319 | // .addAction(R.drawable.ic_launch, getString(R.string.launch_activity), activityPendingIntent)
320 | // .addAction(R.drawable.ic_cancel, getString(R.string.remove_location_updates), servicePendingIntent)
321 | // .setContentText(Utils.getLocationUpdatedDatetime(this))
322 | .setContentIntent(activityPendingIntent)
323 | .setContentTitle(title)
324 | .setOngoing(true)
325 | .setPriority(Notification.PRIORITY_HIGH)
326 | .setSmallIcon(R.drawable.ic_notify_icon)
327 | .setTicker(title)
328 | .setWhen(System.currentTimeMillis());
329 |
330 | // Set the Channel ID for Android O.
331 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
332 | builder.setChannelId(CHANNEL_ID); // Channel ID
333 | }
334 |
335 | return builder.build();
336 | }
337 |
338 | private void getLastLocation() {
339 | try {
340 | mFusedLocationClient.getLastLocation()
341 | .addOnCompleteListener(new OnCompleteListener() {
342 | @Override
343 | public void onComplete(@NonNull Task task) {
344 | if (task.isSuccessful() && task.getResult() != null) {
345 | mLocation = task.getResult();
346 | Log.i(TAG, "got location:" + mLocation);
347 | } else {
348 | Log.w(TAG, "Failed to get location.");
349 | }
350 | }
351 | });
352 | } catch (SecurityException unlikely) {
353 | Log.e(TAG, "Lost location permission." + unlikely);
354 | }
355 | }
356 |
357 | private void onNewLocation(Location location) {
358 | // Log.i(TAG, "New location: " + location);
359 |
360 | mLocation = location;
361 |
362 | // Notify anyone listening for broadcasts about the new location.
363 | Intent intent = new Intent(ACTION_BROADCAST);
364 | intent.putExtra(EXTRA_LOCATION, location);
365 | LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
366 |
367 | // Update notification content if running as a foreground service.
368 | // if (serviceIsRunningInForeground(this)) {
369 | // mNotificationManager.notify(NOTIFICATION_ID, getNotification());
370 | // }
371 |
372 | LocationCoordinates locationCoordinates = createCoordinates(location.getLatitude(), location.getLongitude());
373 | broadcastLocationReceived(locationCoordinates);
374 | }
375 |
376 | private LocationCoordinates createCoordinates(double latitude, double longitude) {
377 | return new LocationCoordinates()
378 | .setLatitude(latitude)
379 | .setLongitude(longitude)
380 | .setTimestamp(new Date().getTime());
381 | }
382 |
383 | private void broadcastLocationReceived(LocationCoordinates locationCoordinates) {
384 | // Log.i(TAG, "broadcasting: " + mGson.toJson(locationCoordinates));
385 | Intent eventIntent = new Intent(LOCATION_EVENT_NAME);
386 | eventIntent.putExtra(LOCATION_EVENT_DATA_NAME, mGson.toJson(locationCoordinates));
387 | getApplicationContext().sendBroadcast(eventIntent);
388 | }
389 |
390 | /**
391 | * Sets the location request parameters.
392 | */
393 | private void createLocationRequest() {
394 | mLocationRequest = new LocationRequest();
395 | mLocationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
396 | mLocationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
397 | mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
398 | }
399 |
400 | /**
401 | * Class used for the client Binder. Since this service runs in the same process as its
402 | * clients, we don't need to deal with IPC.
403 | */
404 | public class LocalBinder extends Binder {
405 | public LocationUpdatesService getService() {
406 | return LocationUpdatesService.this;
407 | }
408 | }
409 |
410 | // /**
411 | // * Returns true if this is a foreground service.
412 | // *
413 | // * @param context The {@link Context}.
414 | // */
415 | // public boolean serviceIsRunningInForeground(Context context) {
416 | // ActivityManager manager = (ActivityManager) context.getSystemService(
417 | // Context.ACTIVITY_SERVICE);
418 | // for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(
419 | // Integer.MAX_VALUE)) {
420 | // if (getClass().getName().equals(service.service.getClassName())) {
421 | // if (service.foreground) {
422 | // return true;
423 | // }
424 | // }
425 | // }
426 | // return false;
427 | // }
428 | }
--------------------------------------------------------------------------------
/ios/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - boost-for-react-native (1.63.0)
3 | - CocoaAsyncSocket (7.6.4)
4 | - CocoaLibEvent (1.0.0)
5 | - DoubleConversion (1.1.6)
6 | - FBLazyVector (0.63.1)
7 | - FBReactNativeSpec (0.63.1):
8 | - Folly (= 2020.01.13.00)
9 | - RCTRequired (= 0.63.1)
10 | - RCTTypeSafety (= 0.63.1)
11 | - React-Core (= 0.63.1)
12 | - React-jsi (= 0.63.1)
13 | - ReactCommon/turbomodule/core (= 0.63.1)
14 | - Flipper (0.41.5):
15 | - Flipper-Folly (~> 2.2)
16 | - Flipper-RSocket (~> 1.1)
17 | - Flipper-DoubleConversion (1.1.7)
18 | - Flipper-Folly (2.2.0):
19 | - boost-for-react-native
20 | - CocoaLibEvent (~> 1.0)
21 | - Flipper-DoubleConversion
22 | - Flipper-Glog
23 | - OpenSSL-Universal (= 1.0.2.19)
24 | - Flipper-Glog (0.3.6)
25 | - Flipper-PeerTalk (0.0.4)
26 | - Flipper-RSocket (1.1.0):
27 | - Flipper-Folly (~> 2.2)
28 | - FlipperKit (0.41.5):
29 | - FlipperKit/Core (= 0.41.5)
30 | - FlipperKit/Core (0.41.5):
31 | - Flipper (~> 0.41.5)
32 | - FlipperKit/CppBridge
33 | - FlipperKit/FBCxxFollyDynamicConvert
34 | - FlipperKit/FBDefines
35 | - FlipperKit/FKPortForwarding
36 | - FlipperKit/CppBridge (0.41.5):
37 | - Flipper (~> 0.41.5)
38 | - FlipperKit/FBCxxFollyDynamicConvert (0.41.5):
39 | - Flipper-Folly (~> 2.2)
40 | - FlipperKit/FBDefines (0.41.5)
41 | - FlipperKit/FKPortForwarding (0.41.5):
42 | - CocoaAsyncSocket (~> 7.6)
43 | - Flipper-PeerTalk (~> 0.0.4)
44 | - FlipperKit/FlipperKitHighlightOverlay (0.41.5)
45 | - FlipperKit/FlipperKitLayoutPlugin (0.41.5):
46 | - FlipperKit/Core
47 | - FlipperKit/FlipperKitHighlightOverlay
48 | - FlipperKit/FlipperKitLayoutTextSearchable
49 | - YogaKit (~> 1.18)
50 | - FlipperKit/FlipperKitLayoutTextSearchable (0.41.5)
51 | - FlipperKit/FlipperKitNetworkPlugin (0.41.5):
52 | - FlipperKit/Core
53 | - FlipperKit/FlipperKitReactPlugin (0.41.5):
54 | - FlipperKit/Core
55 | - FlipperKit/FlipperKitUserDefaultsPlugin (0.41.5):
56 | - FlipperKit/Core
57 | - FlipperKit/SKIOSNetworkPlugin (0.41.5):
58 | - FlipperKit/Core
59 | - FlipperKit/FlipperKitNetworkPlugin
60 | - Folly (2020.01.13.00):
61 | - boost-for-react-native
62 | - DoubleConversion
63 | - Folly/Default (= 2020.01.13.00)
64 | - glog
65 | - Folly/Default (2020.01.13.00):
66 | - boost-for-react-native
67 | - DoubleConversion
68 | - glog
69 | - glog (0.3.5)
70 | - OpenSSL-Universal (1.0.2.19):
71 | - OpenSSL-Universal/Static (= 1.0.2.19)
72 | - OpenSSL-Universal/Static (1.0.2.19)
73 | - RCTRequired (0.63.1)
74 | - RCTTypeSafety (0.63.1):
75 | - FBLazyVector (= 0.63.1)
76 | - Folly (= 2020.01.13.00)
77 | - RCTRequired (= 0.63.1)
78 | - React-Core (= 0.63.1)
79 | - React (0.63.1):
80 | - React-Core (= 0.63.1)
81 | - React-Core/DevSupport (= 0.63.1)
82 | - React-Core/RCTWebSocket (= 0.63.1)
83 | - React-RCTActionSheet (= 0.63.1)
84 | - React-RCTAnimation (= 0.63.1)
85 | - React-RCTBlob (= 0.63.1)
86 | - React-RCTImage (= 0.63.1)
87 | - React-RCTLinking (= 0.63.1)
88 | - React-RCTNetwork (= 0.63.1)
89 | - React-RCTSettings (= 0.63.1)
90 | - React-RCTText (= 0.63.1)
91 | - React-RCTVibration (= 0.63.1)
92 | - React-callinvoker (0.63.1)
93 | - React-Core (0.63.1):
94 | - Folly (= 2020.01.13.00)
95 | - glog
96 | - React-Core/Default (= 0.63.1)
97 | - React-cxxreact (= 0.63.1)
98 | - React-jsi (= 0.63.1)
99 | - React-jsiexecutor (= 0.63.1)
100 | - Yoga
101 | - React-Core/CoreModulesHeaders (0.63.1):
102 | - Folly (= 2020.01.13.00)
103 | - glog
104 | - React-Core/Default
105 | - React-cxxreact (= 0.63.1)
106 | - React-jsi (= 0.63.1)
107 | - React-jsiexecutor (= 0.63.1)
108 | - Yoga
109 | - React-Core/Default (0.63.1):
110 | - Folly (= 2020.01.13.00)
111 | - glog
112 | - React-cxxreact (= 0.63.1)
113 | - React-jsi (= 0.63.1)
114 | - React-jsiexecutor (= 0.63.1)
115 | - Yoga
116 | - React-Core/DevSupport (0.63.1):
117 | - Folly (= 2020.01.13.00)
118 | - glog
119 | - React-Core/Default (= 0.63.1)
120 | - React-Core/RCTWebSocket (= 0.63.1)
121 | - React-cxxreact (= 0.63.1)
122 | - React-jsi (= 0.63.1)
123 | - React-jsiexecutor (= 0.63.1)
124 | - React-jsinspector (= 0.63.1)
125 | - Yoga
126 | - React-Core/RCTActionSheetHeaders (0.63.1):
127 | - Folly (= 2020.01.13.00)
128 | - glog
129 | - React-Core/Default
130 | - React-cxxreact (= 0.63.1)
131 | - React-jsi (= 0.63.1)
132 | - React-jsiexecutor (= 0.63.1)
133 | - Yoga
134 | - React-Core/RCTAnimationHeaders (0.63.1):
135 | - Folly (= 2020.01.13.00)
136 | - glog
137 | - React-Core/Default
138 | - React-cxxreact (= 0.63.1)
139 | - React-jsi (= 0.63.1)
140 | - React-jsiexecutor (= 0.63.1)
141 | - Yoga
142 | - React-Core/RCTBlobHeaders (0.63.1):
143 | - Folly (= 2020.01.13.00)
144 | - glog
145 | - React-Core/Default
146 | - React-cxxreact (= 0.63.1)
147 | - React-jsi (= 0.63.1)
148 | - React-jsiexecutor (= 0.63.1)
149 | - Yoga
150 | - React-Core/RCTImageHeaders (0.63.1):
151 | - Folly (= 2020.01.13.00)
152 | - glog
153 | - React-Core/Default
154 | - React-cxxreact (= 0.63.1)
155 | - React-jsi (= 0.63.1)
156 | - React-jsiexecutor (= 0.63.1)
157 | - Yoga
158 | - React-Core/RCTLinkingHeaders (0.63.1):
159 | - Folly (= 2020.01.13.00)
160 | - glog
161 | - React-Core/Default
162 | - React-cxxreact (= 0.63.1)
163 | - React-jsi (= 0.63.1)
164 | - React-jsiexecutor (= 0.63.1)
165 | - Yoga
166 | - React-Core/RCTNetworkHeaders (0.63.1):
167 | - Folly (= 2020.01.13.00)
168 | - glog
169 | - React-Core/Default
170 | - React-cxxreact (= 0.63.1)
171 | - React-jsi (= 0.63.1)
172 | - React-jsiexecutor (= 0.63.1)
173 | - Yoga
174 | - React-Core/RCTSettingsHeaders (0.63.1):
175 | - Folly (= 2020.01.13.00)
176 | - glog
177 | - React-Core/Default
178 | - React-cxxreact (= 0.63.1)
179 | - React-jsi (= 0.63.1)
180 | - React-jsiexecutor (= 0.63.1)
181 | - Yoga
182 | - React-Core/RCTTextHeaders (0.63.1):
183 | - Folly (= 2020.01.13.00)
184 | - glog
185 | - React-Core/Default
186 | - React-cxxreact (= 0.63.1)
187 | - React-jsi (= 0.63.1)
188 | - React-jsiexecutor (= 0.63.1)
189 | - Yoga
190 | - React-Core/RCTVibrationHeaders (0.63.1):
191 | - Folly (= 2020.01.13.00)
192 | - glog
193 | - React-Core/Default
194 | - React-cxxreact (= 0.63.1)
195 | - React-jsi (= 0.63.1)
196 | - React-jsiexecutor (= 0.63.1)
197 | - Yoga
198 | - React-Core/RCTWebSocket (0.63.1):
199 | - Folly (= 2020.01.13.00)
200 | - glog
201 | - React-Core/Default (= 0.63.1)
202 | - React-cxxreact (= 0.63.1)
203 | - React-jsi (= 0.63.1)
204 | - React-jsiexecutor (= 0.63.1)
205 | - Yoga
206 | - React-CoreModules (0.63.1):
207 | - FBReactNativeSpec (= 0.63.1)
208 | - Folly (= 2020.01.13.00)
209 | - RCTTypeSafety (= 0.63.1)
210 | - React-Core/CoreModulesHeaders (= 0.63.1)
211 | - React-jsi (= 0.63.1)
212 | - React-RCTImage (= 0.63.1)
213 | - ReactCommon/turbomodule/core (= 0.63.1)
214 | - React-cxxreact (0.63.1):
215 | - boost-for-react-native (= 1.63.0)
216 | - DoubleConversion
217 | - Folly (= 2020.01.13.00)
218 | - glog
219 | - React-callinvoker (= 0.63.1)
220 | - React-jsinspector (= 0.63.1)
221 | - React-jsi (0.63.1):
222 | - boost-for-react-native (= 1.63.0)
223 | - DoubleConversion
224 | - Folly (= 2020.01.13.00)
225 | - glog
226 | - React-jsi/Default (= 0.63.1)
227 | - React-jsi/Default (0.63.1):
228 | - boost-for-react-native (= 1.63.0)
229 | - DoubleConversion
230 | - Folly (= 2020.01.13.00)
231 | - glog
232 | - React-jsiexecutor (0.63.1):
233 | - DoubleConversion
234 | - Folly (= 2020.01.13.00)
235 | - glog
236 | - React-cxxreact (= 0.63.1)
237 | - React-jsi (= 0.63.1)
238 | - React-jsinspector (0.63.1)
239 | - react-native-location (2.3.0):
240 | - React
241 | - React-RCTActionSheet (0.63.1):
242 | - React-Core/RCTActionSheetHeaders (= 0.63.1)
243 | - React-RCTAnimation (0.63.1):
244 | - FBReactNativeSpec (= 0.63.1)
245 | - Folly (= 2020.01.13.00)
246 | - RCTTypeSafety (= 0.63.1)
247 | - React-Core/RCTAnimationHeaders (= 0.63.1)
248 | - React-jsi (= 0.63.1)
249 | - ReactCommon/turbomodule/core (= 0.63.1)
250 | - React-RCTBlob (0.63.1):
251 | - FBReactNativeSpec (= 0.63.1)
252 | - Folly (= 2020.01.13.00)
253 | - React-Core/RCTBlobHeaders (= 0.63.1)
254 | - React-Core/RCTWebSocket (= 0.63.1)
255 | - React-jsi (= 0.63.1)
256 | - React-RCTNetwork (= 0.63.1)
257 | - ReactCommon/turbomodule/core (= 0.63.1)
258 | - React-RCTImage (0.63.1):
259 | - FBReactNativeSpec (= 0.63.1)
260 | - Folly (= 2020.01.13.00)
261 | - RCTTypeSafety (= 0.63.1)
262 | - React-Core/RCTImageHeaders (= 0.63.1)
263 | - React-jsi (= 0.63.1)
264 | - React-RCTNetwork (= 0.63.1)
265 | - ReactCommon/turbomodule/core (= 0.63.1)
266 | - React-RCTLinking (0.63.1):
267 | - FBReactNativeSpec (= 0.63.1)
268 | - React-Core/RCTLinkingHeaders (= 0.63.1)
269 | - React-jsi (= 0.63.1)
270 | - ReactCommon/turbomodule/core (= 0.63.1)
271 | - React-RCTNetwork (0.63.1):
272 | - FBReactNativeSpec (= 0.63.1)
273 | - Folly (= 2020.01.13.00)
274 | - RCTTypeSafety (= 0.63.1)
275 | - React-Core/RCTNetworkHeaders (= 0.63.1)
276 | - React-jsi (= 0.63.1)
277 | - ReactCommon/turbomodule/core (= 0.63.1)
278 | - React-RCTSettings (0.63.1):
279 | - FBReactNativeSpec (= 0.63.1)
280 | - Folly (= 2020.01.13.00)
281 | - RCTTypeSafety (= 0.63.1)
282 | - React-Core/RCTSettingsHeaders (= 0.63.1)
283 | - React-jsi (= 0.63.1)
284 | - ReactCommon/turbomodule/core (= 0.63.1)
285 | - React-RCTText (0.63.1):
286 | - React-Core/RCTTextHeaders (= 0.63.1)
287 | - React-RCTVibration (0.63.1):
288 | - FBReactNativeSpec (= 0.63.1)
289 | - Folly (= 2020.01.13.00)
290 | - React-Core/RCTVibrationHeaders (= 0.63.1)
291 | - React-jsi (= 0.63.1)
292 | - ReactCommon/turbomodule/core (= 0.63.1)
293 | - ReactCommon/turbomodule/core (0.63.1):
294 | - DoubleConversion
295 | - Folly (= 2020.01.13.00)
296 | - glog
297 | - React-callinvoker (= 0.63.1)
298 | - React-Core (= 0.63.1)
299 | - React-cxxreact (= 0.63.1)
300 | - React-jsi (= 0.63.1)
301 | - Yoga (1.14.0)
302 | - YogaKit (1.18.1):
303 | - Yoga (~> 1.14)
304 |
305 | DEPENDENCIES:
306 | - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
307 | - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
308 | - FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`)
309 | - Flipper (~> 0.41.1)
310 | - Flipper-DoubleConversion (= 1.1.7)
311 | - Flipper-Folly (~> 2.2)
312 | - Flipper-Glog (= 0.3.6)
313 | - Flipper-PeerTalk (~> 0.0.4)
314 | - Flipper-RSocket (~> 1.1)
315 | - FlipperKit (~> 0.41.1)
316 | - FlipperKit/Core (~> 0.41.1)
317 | - FlipperKit/CppBridge (~> 0.41.1)
318 | - FlipperKit/FBCxxFollyDynamicConvert (~> 0.41.1)
319 | - FlipperKit/FBDefines (~> 0.41.1)
320 | - FlipperKit/FKPortForwarding (~> 0.41.1)
321 | - FlipperKit/FlipperKitHighlightOverlay (~> 0.41.1)
322 | - FlipperKit/FlipperKitLayoutPlugin (~> 0.41.1)
323 | - FlipperKit/FlipperKitLayoutTextSearchable (~> 0.41.1)
324 | - FlipperKit/FlipperKitNetworkPlugin (~> 0.41.1)
325 | - FlipperKit/FlipperKitReactPlugin (~> 0.41.1)
326 | - FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.41.1)
327 | - FlipperKit/SKIOSNetworkPlugin (~> 0.41.1)
328 | - Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`)
329 | - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
330 | - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
331 | - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
332 | - React (from `../node_modules/react-native/`)
333 | - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
334 | - React-Core (from `../node_modules/react-native/`)
335 | - React-Core/DevSupport (from `../node_modules/react-native/`)
336 | - React-Core/RCTWebSocket (from `../node_modules/react-native/`)
337 | - React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
338 | - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
339 | - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
340 | - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
341 | - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
342 | - react-native-location (from `../node_modules/react-native-location`)
343 | - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
344 | - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
345 | - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
346 | - React-RCTImage (from `../node_modules/react-native/Libraries/Image`)
347 | - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`)
348 | - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`)
349 | - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
350 | - React-RCTText (from `../node_modules/react-native/Libraries/Text`)
351 | - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
352 | - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
353 | - Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
354 |
355 | SPEC REPOS:
356 | trunk:
357 | - boost-for-react-native
358 | - CocoaAsyncSocket
359 | - CocoaLibEvent
360 | - Flipper
361 | - Flipper-DoubleConversion
362 | - Flipper-Folly
363 | - Flipper-Glog
364 | - Flipper-PeerTalk
365 | - Flipper-RSocket
366 | - FlipperKit
367 | - OpenSSL-Universal
368 | - YogaKit
369 |
370 | EXTERNAL SOURCES:
371 | DoubleConversion:
372 | :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
373 | FBLazyVector:
374 | :path: "../node_modules/react-native/Libraries/FBLazyVector"
375 | FBReactNativeSpec:
376 | :path: "../node_modules/react-native/Libraries/FBReactNativeSpec"
377 | Folly:
378 | :podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec"
379 | glog:
380 | :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
381 | RCTRequired:
382 | :path: "../node_modules/react-native/Libraries/RCTRequired"
383 | RCTTypeSafety:
384 | :path: "../node_modules/react-native/Libraries/TypeSafety"
385 | React:
386 | :path: "../node_modules/react-native/"
387 | React-callinvoker:
388 | :path: "../node_modules/react-native/ReactCommon/callinvoker"
389 | React-Core:
390 | :path: "../node_modules/react-native/"
391 | React-CoreModules:
392 | :path: "../node_modules/react-native/React/CoreModules"
393 | React-cxxreact:
394 | :path: "../node_modules/react-native/ReactCommon/cxxreact"
395 | React-jsi:
396 | :path: "../node_modules/react-native/ReactCommon/jsi"
397 | React-jsiexecutor:
398 | :path: "../node_modules/react-native/ReactCommon/jsiexecutor"
399 | React-jsinspector:
400 | :path: "../node_modules/react-native/ReactCommon/jsinspector"
401 | react-native-location:
402 | :path: "../node_modules/react-native-location"
403 | React-RCTActionSheet:
404 | :path: "../node_modules/react-native/Libraries/ActionSheetIOS"
405 | React-RCTAnimation:
406 | :path: "../node_modules/react-native/Libraries/NativeAnimation"
407 | React-RCTBlob:
408 | :path: "../node_modules/react-native/Libraries/Blob"
409 | React-RCTImage:
410 | :path: "../node_modules/react-native/Libraries/Image"
411 | React-RCTLinking:
412 | :path: "../node_modules/react-native/Libraries/LinkingIOS"
413 | React-RCTNetwork:
414 | :path: "../node_modules/react-native/Libraries/Network"
415 | React-RCTSettings:
416 | :path: "../node_modules/react-native/Libraries/Settings"
417 | React-RCTText:
418 | :path: "../node_modules/react-native/Libraries/Text"
419 | React-RCTVibration:
420 | :path: "../node_modules/react-native/Libraries/Vibration"
421 | ReactCommon:
422 | :path: "../node_modules/react-native/ReactCommon"
423 | Yoga:
424 | :path: "../node_modules/react-native/ReactCommon/yoga"
425 |
426 | SPEC CHECKSUMS:
427 | boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
428 | CocoaAsyncSocket: 694058e7c0ed05a9e217d1b3c7ded962f4180845
429 | CocoaLibEvent: 2fab71b8bd46dd33ddb959f7928ec5909f838e3f
430 | DoubleConversion: cde416483dac037923206447da6e1454df403714
431 | FBLazyVector: a50434c875bd42f2b1c99c712bda892a1dc659c7
432 | FBReactNativeSpec: 393853a536428e05a9da00b6290042f09809b15b
433 | Flipper: 33585e2d9810fe5528346be33bcf71b37bb7ae13
434 | Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41
435 | Flipper-Folly: c12092ea368353b58e992843a990a3225d4533c3
436 | Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6
437 | Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9
438 | Flipper-RSocket: 64e7431a55835eb953b0bf984ef3b90ae9fdddd7
439 | FlipperKit: bc68102cd4952a258a23c9c1b316c7bec1fecf83
440 | Folly: b73c3869541e86821df3c387eb0af5f65addfab4
441 | glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3
442 | OpenSSL-Universal: 8b48cc0d10c1b2923617dfe5c178aa9ed2689355
443 | RCTRequired: d9b1a9e6fa097744ca3ede59f86a35096df7202b
444 | RCTTypeSafety: c227cd061983e9e964115afbc4e8730d6a6f1395
445 | React: 86e972a20967ee4137aa19dc48319405927c2e94
446 | React-callinvoker: 87ee376c25277d74e164ff036b27084e343f3e69
447 | React-Core: f5ec03baf7ed58d9f3ee04a8f84e4c97ee8bf4c9
448 | React-CoreModules: 958898aa8c069280e866e35a2f29480a81fcf335
449 | React-cxxreact: 90de76b9b51575668ad7fd4e33a5a8c143beecc2
450 | React-jsi: b32a31da32e030f30bbf9a8d3a9c8325df9e793f
451 | React-jsiexecutor: 7ab9cdcdd18d57652fb041f8a147fe9658d4e00a
452 | React-jsinspector: 2e28bb487e42dda6c94dbfa0c648d1343767a0fb
453 | react-native-location: d7c9a0dd2e642c751405b3e24ca4307c099c52db
454 | React-RCTActionSheet: 1702a1a85e550b5c36e2e03cb2bd3adea053de95
455 | React-RCTAnimation: ddda576010a878865a4eab83a78acd92176ef6a1
456 | React-RCTBlob: 34334384284c81577409d5205bd2b9ff594d8ab6
457 | React-RCTImage: e2a661266dca295cffb33909cc64675a2efedb26
458 | React-RCTLinking: cd39b9b5e9cbb9e827854e30dfa92d7db074cea8
459 | React-RCTNetwork: 16939b7e4058d6f662b304a1f61689e249a2bfcc
460 | React-RCTSettings: 24726a62de0c326f9ebfc3838898a501b87ce711
461 | React-RCTText: 4f95d322b7e6da72817284abf8a2cdcec18b9cd8
462 | React-RCTVibration: f3a9123c244f35c40d3c9f3ec3f0b9e5717bb292
463 | ReactCommon: 2905859f84a94a381bb0d8dd3921ccb1a0047cb8
464 | Yoga: d5bd05a2b6b94c52323745c2c2b64557c8c66f64
465 | YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
466 |
467 | PODFILE CHECKSUM: 1049f05df23db8b241546e0f14a277dc235bb801
468 |
469 | COCOAPODS: 1.9.3
470 |
--------------------------------------------------------------------------------
/ios/LocationSample.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 00E356F31AD99517003FC87E /* LocationSampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* LocationSampleTests.m */; };
11 | 08DF0CFA09D935E093D1DEC8 /* libPods-LocationSample-LocationSampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FEE6EF8AE25A47EE64573EB1 /* libPods-LocationSample-LocationSampleTests.a */; };
12 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
13 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
14 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
15 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
16 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
17 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
18 | 2DCD954D1E0B4F2C00145EB5 /* LocationSampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* LocationSampleTests.m */; };
19 | 6B5BFED39717B21E3F4268C7 /* libPods-LocationSample-tvOSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F2906D59479EABCA113EA39A /* libPods-LocationSample-tvOSTests.a */; };
20 | 948714F224C7A36B00DD1A3B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 948714F124C7A36B00DD1A3B /* LaunchScreen.storyboard */; };
21 | 97E88EC02AF8CCF1DFEFFD45 /* libPods-LocationSample-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 35FA30B91463E8E2B2A81A35 /* libPods-LocationSample-tvOS.a */; };
22 | C3D4AB68DD62342301CFC21A /* libPods-LocationSample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DAFA00ED79F5D32A538DC4D /* libPods-LocationSample.a */; };
23 | /* End PBXBuildFile section */
24 |
25 | /* Begin PBXContainerItemProxy section */
26 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
27 | isa = PBXContainerItemProxy;
28 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
29 | proxyType = 1;
30 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
31 | remoteInfo = LocationSample;
32 | };
33 | 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {
34 | isa = PBXContainerItemProxy;
35 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
36 | proxyType = 1;
37 | remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7;
38 | remoteInfo = "LocationSample-tvOS";
39 | };
40 | /* End PBXContainerItemProxy section */
41 |
42 | /* Begin PBXFileReference section */
43 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; };
44 | 00E356EE1AD99517003FC87E /* LocationSampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LocationSampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
45 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
46 | 00E356F21AD99517003FC87E /* LocationSampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LocationSampleTests.m; sourceTree = ""; };
47 | 13B07F961A680F5B00A75B9A /* LocationSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LocationSample.app; sourceTree = BUILT_PRODUCTS_DIR; };
48 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = LocationSample/AppDelegate.h; sourceTree = ""; };
49 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = LocationSample/AppDelegate.m; sourceTree = ""; };
50 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = LocationSample/Images.xcassets; sourceTree = ""; };
51 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = LocationSample/Info.plist; sourceTree = ""; };
52 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = LocationSample/main.m; sourceTree = ""; };
53 | 140306D95B49A72A5B57A041 /* Pods-LocationSample-tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LocationSample-tvOSTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-LocationSample-tvOSTests/Pods-LocationSample-tvOSTests.release.xcconfig"; sourceTree = ""; };
54 | 1E4795B2E0C1175EA2D18CAB /* Pods-LocationSampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LocationSampleTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-LocationSampleTests/Pods-LocationSampleTests.debug.xcconfig"; sourceTree = ""; };
55 | 2D02E47B1E0B4A5D006451C7 /* LocationSample-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "LocationSample-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
56 | 2D02E4901E0B4A5D006451C7 /* LocationSample-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "LocationSample-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
57 | 35FA30B91463E8E2B2A81A35 /* libPods-LocationSample-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-LocationSample-tvOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
58 | 430D17B6956B340A708D5CC4 /* Pods-LocationSample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LocationSample.release.xcconfig"; path = "Pods/Target Support Files/Pods-LocationSample/Pods-LocationSample.release.xcconfig"; sourceTree = ""; };
59 | 4DAFA00ED79F5D32A538DC4D /* libPods-LocationSample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-LocationSample.a"; sourceTree = BUILT_PRODUCTS_DIR; };
60 | 5FF4E913BFED04FA75873582 /* Pods-LocationSample-LocationSampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LocationSample-LocationSampleTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-LocationSample-LocationSampleTests/Pods-LocationSample-LocationSampleTests.release.xcconfig"; sourceTree = ""; };
61 | 767FC5A4DEDBC192A20B2289 /* Pods-LocationSampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LocationSampleTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-LocationSampleTests/Pods-LocationSampleTests.release.xcconfig"; sourceTree = ""; };
62 | 948714F124C7A36B00DD1A3B /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; };
63 | 94B114AF24C78BD2008CAB2A /* LocationSample-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "LocationSample-Bridging-Header.h"; sourceTree = ""; };
64 | A7CD62573F54AF0A1A5DBB3D /* Pods-LocationSample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LocationSample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-LocationSample/Pods-LocationSample.debug.xcconfig"; sourceTree = ""; };
65 | C2DFA9DC6D18C63C744FF162 /* Pods-LocationSample-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LocationSample-tvOS.release.xcconfig"; path = "Pods/Target Support Files/Pods-LocationSample-tvOS/Pods-LocationSample-tvOS.release.xcconfig"; sourceTree = ""; };
66 | C62C31B9BA6129C692F6A2AA /* Pods-LocationSample-LocationSampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LocationSample-LocationSampleTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-LocationSample-LocationSampleTests/Pods-LocationSample-LocationSampleTests.debug.xcconfig"; sourceTree = ""; };
67 | CE0FE53B27517664AD9B9707 /* Pods-LocationSample-tvOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LocationSample-tvOSTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-LocationSample-tvOSTests/Pods-LocationSample-tvOSTests.debug.xcconfig"; sourceTree = ""; };
68 | D08091B373FC2D7738555C4F /* Pods-LocationSample-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LocationSample-tvOS.debug.xcconfig"; path = "Pods/Target Support Files/Pods-LocationSample-tvOS/Pods-LocationSample-tvOS.debug.xcconfig"; sourceTree = ""; };
69 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
70 | ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = ../../../../AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
71 | F2906D59479EABCA113EA39A /* libPods-LocationSample-tvOSTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-LocationSample-tvOSTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
72 | FEE6EF8AE25A47EE64573EB1 /* libPods-LocationSample-LocationSampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-LocationSample-LocationSampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
73 | /* End PBXFileReference section */
74 |
75 | /* Begin PBXFrameworksBuildPhase section */
76 | 00E356EB1AD99517003FC87E /* Frameworks */ = {
77 | isa = PBXFrameworksBuildPhase;
78 | buildActionMask = 2147483647;
79 | files = (
80 | 08DF0CFA09D935E093D1DEC8 /* libPods-LocationSample-LocationSampleTests.a in Frameworks */,
81 | );
82 | runOnlyForDeploymentPostprocessing = 0;
83 | };
84 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
85 | isa = PBXFrameworksBuildPhase;
86 | buildActionMask = 2147483647;
87 | files = (
88 | C3D4AB68DD62342301CFC21A /* libPods-LocationSample.a in Frameworks */,
89 | );
90 | runOnlyForDeploymentPostprocessing = 0;
91 | };
92 | 2D02E4781E0B4A5D006451C7 /* Frameworks */ = {
93 | isa = PBXFrameworksBuildPhase;
94 | buildActionMask = 2147483647;
95 | files = (
96 | 97E88EC02AF8CCF1DFEFFD45 /* libPods-LocationSample-tvOS.a in Frameworks */,
97 | );
98 | runOnlyForDeploymentPostprocessing = 0;
99 | };
100 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = {
101 | isa = PBXFrameworksBuildPhase;
102 | buildActionMask = 2147483647;
103 | files = (
104 | 6B5BFED39717B21E3F4268C7 /* libPods-LocationSample-tvOSTests.a in Frameworks */,
105 | );
106 | runOnlyForDeploymentPostprocessing = 0;
107 | };
108 | /* End PBXFrameworksBuildPhase section */
109 |
110 | /* Begin PBXGroup section */
111 | 00E356EF1AD99517003FC87E /* LocationSampleTests */ = {
112 | isa = PBXGroup;
113 | children = (
114 | 00E356F21AD99517003FC87E /* LocationSampleTests.m */,
115 | 00E356F01AD99517003FC87E /* Supporting Files */,
116 | );
117 | path = LocationSampleTests;
118 | sourceTree = "";
119 | };
120 | 00E356F01AD99517003FC87E /* Supporting Files */ = {
121 | isa = PBXGroup;
122 | children = (
123 | 00E356F11AD99517003FC87E /* Info.plist */,
124 | );
125 | name = "Supporting Files";
126 | sourceTree = "";
127 | };
128 | 13B07FAE1A68108700A75B9A /* LocationSample */ = {
129 | isa = PBXGroup;
130 | children = (
131 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */,
132 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
133 | 13B07FB01A68108700A75B9A /* AppDelegate.m */,
134 | 13B07FB51A68108700A75B9A /* Images.xcassets */,
135 | 13B07FB61A68108700A75B9A /* Info.plist */,
136 | 13B07FB71A68108700A75B9A /* main.m */,
137 | 94B114AF24C78BD2008CAB2A /* LocationSample-Bridging-Header.h */,
138 | 948714F124C7A36B00DD1A3B /* LaunchScreen.storyboard */,
139 | );
140 | name = LocationSample;
141 | sourceTree = "";
142 | };
143 | 1DC1298F4CDD99BAC6618C6C /* Pods */ = {
144 | isa = PBXGroup;
145 | children = (
146 | A7CD62573F54AF0A1A5DBB3D /* Pods-LocationSample.debug.xcconfig */,
147 | 430D17B6956B340A708D5CC4 /* Pods-LocationSample.release.xcconfig */,
148 | D08091B373FC2D7738555C4F /* Pods-LocationSample-tvOS.debug.xcconfig */,
149 | C2DFA9DC6D18C63C744FF162 /* Pods-LocationSample-tvOS.release.xcconfig */,
150 | CE0FE53B27517664AD9B9707 /* Pods-LocationSample-tvOSTests.debug.xcconfig */,
151 | 140306D95B49A72A5B57A041 /* Pods-LocationSample-tvOSTests.release.xcconfig */,
152 | 1E4795B2E0C1175EA2D18CAB /* Pods-LocationSampleTests.debug.xcconfig */,
153 | 767FC5A4DEDBC192A20B2289 /* Pods-LocationSampleTests.release.xcconfig */,
154 | C62C31B9BA6129C692F6A2AA /* Pods-LocationSample-LocationSampleTests.debug.xcconfig */,
155 | 5FF4E913BFED04FA75873582 /* Pods-LocationSample-LocationSampleTests.release.xcconfig */,
156 | );
157 | name = Pods;
158 | sourceTree = "";
159 | };
160 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
161 | isa = PBXGroup;
162 | children = (
163 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
164 | ED2971642150620600B7C4FE /* JavaScriptCore.framework */,
165 | 4DAFA00ED79F5D32A538DC4D /* libPods-LocationSample.a */,
166 | 35FA30B91463E8E2B2A81A35 /* libPods-LocationSample-tvOS.a */,
167 | F2906D59479EABCA113EA39A /* libPods-LocationSample-tvOSTests.a */,
168 | FEE6EF8AE25A47EE64573EB1 /* libPods-LocationSample-LocationSampleTests.a */,
169 | );
170 | name = Frameworks;
171 | sourceTree = "";
172 | };
173 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
174 | isa = PBXGroup;
175 | children = (
176 | );
177 | name = Libraries;
178 | sourceTree = "";
179 | };
180 | 83CBB9F61A601CBA00E9B192 = {
181 | isa = PBXGroup;
182 | children = (
183 | 13B07FAE1A68108700A75B9A /* LocationSample */,
184 | 832341AE1AAA6A7D00B99B32 /* Libraries */,
185 | 00E356EF1AD99517003FC87E /* LocationSampleTests */,
186 | 83CBBA001A601CBA00E9B192 /* Products */,
187 | 2D16E6871FA4F8E400B85C8A /* Frameworks */,
188 | 1DC1298F4CDD99BAC6618C6C /* Pods */,
189 | F12A7F8B722A40FB96C089BF /* Resources */,
190 | );
191 | indentWidth = 2;
192 | sourceTree = "";
193 | tabWidth = 2;
194 | usesTabs = 0;
195 | };
196 | 83CBBA001A601CBA00E9B192 /* Products */ = {
197 | isa = PBXGroup;
198 | children = (
199 | 13B07F961A680F5B00A75B9A /* LocationSample.app */,
200 | 00E356EE1AD99517003FC87E /* LocationSampleTests.xctest */,
201 | 2D02E47B1E0B4A5D006451C7 /* LocationSample-tvOS.app */,
202 | 2D02E4901E0B4A5D006451C7 /* LocationSample-tvOSTests.xctest */,
203 | );
204 | name = Products;
205 | sourceTree = "";
206 | };
207 | F12A7F8B722A40FB96C089BF /* Resources */ = {
208 | isa = PBXGroup;
209 | children = (
210 | );
211 | name = Resources;
212 | sourceTree = "";
213 | };
214 | /* End PBXGroup section */
215 |
216 | /* Begin PBXNativeTarget section */
217 | 00E356ED1AD99517003FC87E /* LocationSampleTests */ = {
218 | isa = PBXNativeTarget;
219 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "LocationSampleTests" */;
220 | buildPhases = (
221 | 0D0D5B928AE3EF55230D41B3 /* [CP] Check Pods Manifest.lock */,
222 | 00E356EA1AD99517003FC87E /* Sources */,
223 | 00E356EB1AD99517003FC87E /* Frameworks */,
224 | 00E356EC1AD99517003FC87E /* Resources */,
225 | 6626B66CCEC82DAC28051B02 /* [CP] Copy Pods Resources */,
226 | );
227 | buildRules = (
228 | );
229 | dependencies = (
230 | 00E356F51AD99517003FC87E /* PBXTargetDependency */,
231 | );
232 | name = LocationSampleTests;
233 | productName = LocationSampleTests;
234 | productReference = 00E356EE1AD99517003FC87E /* LocationSampleTests.xctest */;
235 | productType = "com.apple.product-type.bundle.unit-test";
236 | };
237 | 13B07F861A680F5B00A75B9A /* LocationSample */ = {
238 | isa = PBXNativeTarget;
239 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "LocationSample" */;
240 | buildPhases = (
241 | 6F786C2FEDA64862EC2728E6 /* [CP] Check Pods Manifest.lock */,
242 | FD10A7F022414F080027D42C /* Start Packager */,
243 | 13B07F871A680F5B00A75B9A /* Sources */,
244 | 13B07F8C1A680F5B00A75B9A /* Frameworks */,
245 | 13B07F8E1A680F5B00A75B9A /* Resources */,
246 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
247 | 82A3C1310B7322BFBE30080F /* [CP] Copy Pods Resources */,
248 | );
249 | buildRules = (
250 | );
251 | dependencies = (
252 | );
253 | name = LocationSample;
254 | productName = LocationSample;
255 | productReference = 13B07F961A680F5B00A75B9A /* LocationSample.app */;
256 | productType = "com.apple.product-type.application";
257 | };
258 | 2D02E47A1E0B4A5D006451C7 /* LocationSample-tvOS */ = {
259 | isa = PBXNativeTarget;
260 | buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "LocationSample-tvOS" */;
261 | buildPhases = (
262 | 80A9380E145AC68D5EB1E81C /* [CP] Check Pods Manifest.lock */,
263 | FD10A7F122414F3F0027D42C /* Start Packager */,
264 | 2D02E4771E0B4A5D006451C7 /* Sources */,
265 | 2D02E4781E0B4A5D006451C7 /* Frameworks */,
266 | 2D02E4791E0B4A5D006451C7 /* Resources */,
267 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */,
268 | );
269 | buildRules = (
270 | );
271 | dependencies = (
272 | );
273 | name = "LocationSample-tvOS";
274 | productName = "LocationSample-tvOS";
275 | productReference = 2D02E47B1E0B4A5D006451C7 /* LocationSample-tvOS.app */;
276 | productType = "com.apple.product-type.application";
277 | };
278 | 2D02E48F1E0B4A5D006451C7 /* LocationSample-tvOSTests */ = {
279 | isa = PBXNativeTarget;
280 | buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "LocationSample-tvOSTests" */;
281 | buildPhases = (
282 | 8472CB537A53E56E3700DDFB /* [CP] Check Pods Manifest.lock */,
283 | 2D02E48C1E0B4A5D006451C7 /* Sources */,
284 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */,
285 | 2D02E48E1E0B4A5D006451C7 /* Resources */,
286 | );
287 | buildRules = (
288 | );
289 | dependencies = (
290 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */,
291 | );
292 | name = "LocationSample-tvOSTests";
293 | productName = "LocationSample-tvOSTests";
294 | productReference = 2D02E4901E0B4A5D006451C7 /* LocationSample-tvOSTests.xctest */;
295 | productType = "com.apple.product-type.bundle.unit-test";
296 | };
297 | /* End PBXNativeTarget section */
298 |
299 | /* Begin PBXProject section */
300 | 83CBB9F71A601CBA00E9B192 /* Project object */ = {
301 | isa = PBXProject;
302 | attributes = {
303 | LastUpgradeCheck = 1160;
304 | ORGANIZATIONNAME = "";
305 | TargetAttributes = {
306 | 00E356ED1AD99517003FC87E = {
307 | CreatedOnToolsVersion = 6.2;
308 | DevelopmentTeam = Q84W2R32W3;
309 | TestTargetID = 13B07F861A680F5B00A75B9A;
310 | };
311 | 13B07F861A680F5B00A75B9A = {
312 | DevelopmentTeam = Q84W2R32W3;
313 | LastSwiftMigration = 1160;
314 | ProvisioningStyle = Automatic;
315 | SystemCapabilities = {
316 | com.apple.BackgroundModes = {
317 | enabled = 1;
318 | };
319 | };
320 | };
321 | 2D02E47A1E0B4A5D006451C7 = {
322 | CreatedOnToolsVersion = 8.2.1;
323 | DevelopmentTeam = Q84W2R32W3;
324 | ProvisioningStyle = Automatic;
325 | };
326 | 2D02E48F1E0B4A5D006451C7 = {
327 | CreatedOnToolsVersion = 8.2.1;
328 | DevelopmentTeam = Q84W2R32W3;
329 | ProvisioningStyle = Automatic;
330 | TestTargetID = 2D02E47A1E0B4A5D006451C7;
331 | };
332 | };
333 | };
334 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "LocationSample" */;
335 | compatibilityVersion = "Xcode 3.2";
336 | developmentRegion = English;
337 | hasScannedForEncodings = 0;
338 | knownRegions = (
339 | English,
340 | en,
341 | Base,
342 | );
343 | mainGroup = 83CBB9F61A601CBA00E9B192;
344 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
345 | projectDirPath = "";
346 | projectRoot = "";
347 | targets = (
348 | 13B07F861A680F5B00A75B9A /* LocationSample */,
349 | 00E356ED1AD99517003FC87E /* LocationSampleTests */,
350 | 2D02E47A1E0B4A5D006451C7 /* LocationSample-tvOS */,
351 | 2D02E48F1E0B4A5D006451C7 /* LocationSample-tvOSTests */,
352 | );
353 | };
354 | /* End PBXProject section */
355 |
356 | /* Begin PBXResourcesBuildPhase section */
357 | 00E356EC1AD99517003FC87E /* Resources */ = {
358 | isa = PBXResourcesBuildPhase;
359 | buildActionMask = 2147483647;
360 | files = (
361 | );
362 | runOnlyForDeploymentPostprocessing = 0;
363 | };
364 | 13B07F8E1A680F5B00A75B9A /* Resources */ = {
365 | isa = PBXResourcesBuildPhase;
366 | buildActionMask = 2147483647;
367 | files = (
368 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
369 | 948714F224C7A36B00DD1A3B /* LaunchScreen.storyboard in Resources */,
370 | );
371 | runOnlyForDeploymentPostprocessing = 0;
372 | };
373 | 2D02E4791E0B4A5D006451C7 /* Resources */ = {
374 | isa = PBXResourcesBuildPhase;
375 | buildActionMask = 2147483647;
376 | files = (
377 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */,
378 | );
379 | runOnlyForDeploymentPostprocessing = 0;
380 | };
381 | 2D02E48E1E0B4A5D006451C7 /* Resources */ = {
382 | isa = PBXResourcesBuildPhase;
383 | buildActionMask = 2147483647;
384 | files = (
385 | );
386 | runOnlyForDeploymentPostprocessing = 0;
387 | };
388 | /* End PBXResourcesBuildPhase section */
389 |
390 | /* Begin PBXShellScriptBuildPhase section */
391 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
392 | isa = PBXShellScriptBuildPhase;
393 | buildActionMask = 2147483647;
394 | files = (
395 | );
396 | inputPaths = (
397 | );
398 | name = "Bundle React Native code and images";
399 | outputPaths = (
400 | );
401 | runOnlyForDeploymentPostprocessing = 0;
402 | shellPath = /bin/sh;
403 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n";
404 | };
405 | 0D0D5B928AE3EF55230D41B3 /* [CP] Check Pods Manifest.lock */ = {
406 | isa = PBXShellScriptBuildPhase;
407 | buildActionMask = 2147483647;
408 | files = (
409 | );
410 | inputFileListPaths = (
411 | );
412 | inputPaths = (
413 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
414 | "${PODS_ROOT}/Manifest.lock",
415 | );
416 | name = "[CP] Check Pods Manifest.lock";
417 | outputFileListPaths = (
418 | );
419 | outputPaths = (
420 | "$(DERIVED_FILE_DIR)/Pods-LocationSample-LocationSampleTests-checkManifestLockResult.txt",
421 | );
422 | runOnlyForDeploymentPostprocessing = 0;
423 | shellPath = /bin/sh;
424 | 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";
425 | showEnvVarsInLog = 0;
426 | };
427 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {
428 | isa = PBXShellScriptBuildPhase;
429 | buildActionMask = 2147483647;
430 | files = (
431 | );
432 | inputPaths = (
433 | );
434 | name = "Bundle React Native Code And Images";
435 | outputPaths = (
436 | );
437 | runOnlyForDeploymentPostprocessing = 0;
438 | shellPath = /bin/sh;
439 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh";
440 | };
441 | 6626B66CCEC82DAC28051B02 /* [CP] Copy Pods Resources */ = {
442 | isa = PBXShellScriptBuildPhase;
443 | buildActionMask = 2147483647;
444 | files = (
445 | );
446 | inputPaths = (
447 | "${PODS_ROOT}/Target Support Files/Pods-LocationSample-LocationSampleTests/Pods-LocationSample-LocationSampleTests-resources.sh",
448 | "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
449 | );
450 | name = "[CP] Copy Pods Resources";
451 | outputPaths = (
452 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
453 | );
454 | runOnlyForDeploymentPostprocessing = 0;
455 | shellPath = /bin/sh;
456 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-LocationSample-LocationSampleTests/Pods-LocationSample-LocationSampleTests-resources.sh\"\n";
457 | showEnvVarsInLog = 0;
458 | };
459 | 6F786C2FEDA64862EC2728E6 /* [CP] Check Pods Manifest.lock */ = {
460 | isa = PBXShellScriptBuildPhase;
461 | buildActionMask = 2147483647;
462 | files = (
463 | );
464 | inputFileListPaths = (
465 | );
466 | inputPaths = (
467 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
468 | "${PODS_ROOT}/Manifest.lock",
469 | );
470 | name = "[CP] Check Pods Manifest.lock";
471 | outputFileListPaths = (
472 | );
473 | outputPaths = (
474 | "$(DERIVED_FILE_DIR)/Pods-LocationSample-checkManifestLockResult.txt",
475 | );
476 | runOnlyForDeploymentPostprocessing = 0;
477 | shellPath = /bin/sh;
478 | 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";
479 | showEnvVarsInLog = 0;
480 | };
481 | 80A9380E145AC68D5EB1E81C /* [CP] Check Pods Manifest.lock */ = {
482 | isa = PBXShellScriptBuildPhase;
483 | buildActionMask = 2147483647;
484 | files = (
485 | );
486 | inputFileListPaths = (
487 | );
488 | inputPaths = (
489 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
490 | "${PODS_ROOT}/Manifest.lock",
491 | );
492 | name = "[CP] Check Pods Manifest.lock";
493 | outputFileListPaths = (
494 | );
495 | outputPaths = (
496 | "$(DERIVED_FILE_DIR)/Pods-LocationSample-tvOS-checkManifestLockResult.txt",
497 | );
498 | runOnlyForDeploymentPostprocessing = 0;
499 | shellPath = /bin/sh;
500 | 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";
501 | showEnvVarsInLog = 0;
502 | };
503 | 82A3C1310B7322BFBE30080F /* [CP] Copy Pods Resources */ = {
504 | isa = PBXShellScriptBuildPhase;
505 | buildActionMask = 2147483647;
506 | files = (
507 | );
508 | inputPaths = (
509 | "${PODS_ROOT}/Target Support Files/Pods-LocationSample/Pods-LocationSample-resources.sh",
510 | "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/AccessibilityResources.bundle",
511 | );
512 | name = "[CP] Copy Pods Resources";
513 | outputPaths = (
514 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle",
515 | );
516 | runOnlyForDeploymentPostprocessing = 0;
517 | shellPath = /bin/sh;
518 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-LocationSample/Pods-LocationSample-resources.sh\"\n";
519 | showEnvVarsInLog = 0;
520 | };
521 | 8472CB537A53E56E3700DDFB /* [CP] Check Pods Manifest.lock */ = {
522 | isa = PBXShellScriptBuildPhase;
523 | buildActionMask = 2147483647;
524 | files = (
525 | );
526 | inputFileListPaths = (
527 | );
528 | inputPaths = (
529 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
530 | "${PODS_ROOT}/Manifest.lock",
531 | );
532 | name = "[CP] Check Pods Manifest.lock";
533 | outputFileListPaths = (
534 | );
535 | outputPaths = (
536 | "$(DERIVED_FILE_DIR)/Pods-LocationSample-tvOSTests-checkManifestLockResult.txt",
537 | );
538 | runOnlyForDeploymentPostprocessing = 0;
539 | shellPath = /bin/sh;
540 | 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";
541 | showEnvVarsInLog = 0;
542 | };
543 | FD10A7F022414F080027D42C /* Start Packager */ = {
544 | isa = PBXShellScriptBuildPhase;
545 | buildActionMask = 2147483647;
546 | files = (
547 | );
548 | inputFileListPaths = (
549 | );
550 | inputPaths = (
551 | );
552 | name = "Start Packager";
553 | outputFileListPaths = (
554 | );
555 | outputPaths = (
556 | );
557 | runOnlyForDeploymentPostprocessing = 0;
558 | shellPath = /bin/sh;
559 | shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/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 \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n";
560 | showEnvVarsInLog = 0;
561 | };
562 | FD10A7F122414F3F0027D42C /* Start Packager */ = {
563 | isa = PBXShellScriptBuildPhase;
564 | buildActionMask = 2147483647;
565 | files = (
566 | );
567 | inputFileListPaths = (
568 | );
569 | inputPaths = (
570 | );
571 | name = "Start Packager";
572 | outputFileListPaths = (
573 | );
574 | outputPaths = (
575 | );
576 | runOnlyForDeploymentPostprocessing = 0;
577 | shellPath = /bin/sh;
578 | shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/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 \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n";
579 | showEnvVarsInLog = 0;
580 | };
581 | /* End PBXShellScriptBuildPhase section */
582 |
583 | /* Begin PBXSourcesBuildPhase section */
584 | 00E356EA1AD99517003FC87E /* Sources */ = {
585 | isa = PBXSourcesBuildPhase;
586 | buildActionMask = 2147483647;
587 | files = (
588 | 00E356F31AD99517003FC87E /* LocationSampleTests.m in Sources */,
589 | );
590 | runOnlyForDeploymentPostprocessing = 0;
591 | };
592 | 13B07F871A680F5B00A75B9A /* Sources */ = {
593 | isa = PBXSourcesBuildPhase;
594 | buildActionMask = 2147483647;
595 | files = (
596 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
597 | 13B07FC11A68108700A75B9A /* main.m in Sources */,
598 | );
599 | runOnlyForDeploymentPostprocessing = 0;
600 | };
601 | 2D02E4771E0B4A5D006451C7 /* Sources */ = {
602 | isa = PBXSourcesBuildPhase;
603 | buildActionMask = 2147483647;
604 | files = (
605 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */,
606 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */,
607 | );
608 | runOnlyForDeploymentPostprocessing = 0;
609 | };
610 | 2D02E48C1E0B4A5D006451C7 /* Sources */ = {
611 | isa = PBXSourcesBuildPhase;
612 | buildActionMask = 2147483647;
613 | files = (
614 | 2DCD954D1E0B4F2C00145EB5 /* LocationSampleTests.m in Sources */,
615 | );
616 | runOnlyForDeploymentPostprocessing = 0;
617 | };
618 | /* End PBXSourcesBuildPhase section */
619 |
620 | /* Begin PBXTargetDependency section */
621 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
622 | isa = PBXTargetDependency;
623 | target = 13B07F861A680F5B00A75B9A /* LocationSample */;
624 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
625 | };
626 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = {
627 | isa = PBXTargetDependency;
628 | target = 2D02E47A1E0B4A5D006451C7 /* LocationSample-tvOS */;
629 | targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */;
630 | };
631 | /* End PBXTargetDependency section */
632 |
633 | /* Begin XCBuildConfiguration section */
634 | 00E356F61AD99517003FC87E /* Debug */ = {
635 | isa = XCBuildConfiguration;
636 | baseConfigurationReference = C62C31B9BA6129C692F6A2AA /* Pods-LocationSample-LocationSampleTests.debug.xcconfig */;
637 | buildSettings = {
638 | BUNDLE_LOADER = "$(TEST_HOST)";
639 | GCC_PREPROCESSOR_DEFINITIONS = (
640 | "DEBUG=1",
641 | "$(inherited)",
642 | );
643 | INFOPLIST_FILE = LocationSampleTests/Info.plist;
644 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
645 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
646 | OTHER_LDFLAGS = (
647 | "-ObjC",
648 | "-lc++",
649 | "$(inherited)",
650 | );
651 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
652 | PRODUCT_NAME = "$(TARGET_NAME)";
653 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LocationSample.app/LocationSample";
654 | };
655 | name = Debug;
656 | };
657 | 00E356F71AD99517003FC87E /* Release */ = {
658 | isa = XCBuildConfiguration;
659 | baseConfigurationReference = 5FF4E913BFED04FA75873582 /* Pods-LocationSample-LocationSampleTests.release.xcconfig */;
660 | buildSettings = {
661 | BUNDLE_LOADER = "$(TEST_HOST)";
662 | COPY_PHASE_STRIP = NO;
663 | INFOPLIST_FILE = LocationSampleTests/Info.plist;
664 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
665 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
666 | OTHER_LDFLAGS = (
667 | "-ObjC",
668 | "-lc++",
669 | "$(inherited)",
670 | );
671 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
672 | PRODUCT_NAME = "$(TARGET_NAME)";
673 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LocationSample.app/LocationSample";
674 | };
675 | name = Release;
676 | };
677 | 13B07F941A680F5B00A75B9A /* Debug */ = {
678 | isa = XCBuildConfiguration;
679 | baseConfigurationReference = A7CD62573F54AF0A1A5DBB3D /* Pods-LocationSample.debug.xcconfig */;
680 | buildSettings = {
681 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
682 | CLANG_ENABLE_MODULES = YES;
683 | CODE_SIGN_IDENTITY = "Apple Development";
684 | CODE_SIGN_STYLE = Automatic;
685 | CURRENT_PROJECT_VERSION = 1;
686 | DEVELOPMENT_TEAM = Q84W2R32W3;
687 | ENABLE_BITCODE = NO;
688 | INFOPLIST_FILE = LocationSample/Info.plist;
689 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
690 | MARKETING_VERSION = 1.0.0;
691 | OTHER_LDFLAGS = (
692 | "$(inherited)",
693 | "-ObjC",
694 | "-lc++",
695 | );
696 | PRODUCT_BUNDLE_IDENTIFIER = com.mranderson.locationsample;
697 | PRODUCT_NAME = LocationSample;
698 | PROVISIONING_PROFILE_SPECIFIER = "";
699 | SWIFT_OBJC_BRIDGING_HEADER = "LocationSample-Bridging-Header.h";
700 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
701 | SWIFT_VERSION = 5.0;
702 | VERSIONING_SYSTEM = "apple-generic";
703 | };
704 | name = Debug;
705 | };
706 | 13B07F951A680F5B00A75B9A /* Release */ = {
707 | isa = XCBuildConfiguration;
708 | baseConfigurationReference = 430D17B6956B340A708D5CC4 /* Pods-LocationSample.release.xcconfig */;
709 | buildSettings = {
710 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
711 | CLANG_ENABLE_MODULES = YES;
712 | CODE_SIGN_IDENTITY = "Apple Development";
713 | CODE_SIGN_STYLE = Automatic;
714 | CURRENT_PROJECT_VERSION = 1;
715 | DEVELOPMENT_TEAM = Q84W2R32W3;
716 | INFOPLIST_FILE = LocationSample/Info.plist;
717 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
718 | MARKETING_VERSION = 1.0.0;
719 | OTHER_LDFLAGS = (
720 | "$(inherited)",
721 | "-ObjC",
722 | "-lc++",
723 | );
724 | PRODUCT_BUNDLE_IDENTIFIER = com.mranderson.locationsample;
725 | PRODUCT_NAME = LocationSample;
726 | PROVISIONING_PROFILE_SPECIFIER = "";
727 | SWIFT_OBJC_BRIDGING_HEADER = "LocationSample-Bridging-Header.h";
728 | SWIFT_VERSION = 5.0;
729 | VERSIONING_SYSTEM = "apple-generic";
730 | };
731 | name = Release;
732 | };
733 | 2D02E4971E0B4A5E006451C7 /* Debug */ = {
734 | isa = XCBuildConfiguration;
735 | baseConfigurationReference = D08091B373FC2D7738555C4F /* Pods-LocationSample-tvOS.debug.xcconfig */;
736 | buildSettings = {
737 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
738 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
739 | CLANG_ANALYZER_NONNULL = YES;
740 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
741 | CLANG_WARN_INFINITE_RECURSION = YES;
742 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
743 | DEBUG_INFORMATION_FORMAT = dwarf;
744 | ENABLE_TESTABILITY = YES;
745 | GCC_NO_COMMON_BLOCKS = YES;
746 | INFOPLIST_FILE = "LocationSample-tvOS/Info.plist";
747 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
748 | OTHER_LDFLAGS = (
749 | "$(inherited)",
750 | "-ObjC",
751 | "-lc++",
752 | );
753 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.LocationSample-tvOS";
754 | PRODUCT_NAME = "$(TARGET_NAME)";
755 | SDKROOT = appletvos;
756 | TARGETED_DEVICE_FAMILY = 3;
757 | TVOS_DEPLOYMENT_TARGET = 9.2;
758 | };
759 | name = Debug;
760 | };
761 | 2D02E4981E0B4A5E006451C7 /* Release */ = {
762 | isa = XCBuildConfiguration;
763 | baseConfigurationReference = C2DFA9DC6D18C63C744FF162 /* Pods-LocationSample-tvOS.release.xcconfig */;
764 | buildSettings = {
765 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
766 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
767 | CLANG_ANALYZER_NONNULL = YES;
768 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
769 | CLANG_WARN_INFINITE_RECURSION = YES;
770 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
771 | COPY_PHASE_STRIP = NO;
772 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
773 | GCC_NO_COMMON_BLOCKS = YES;
774 | INFOPLIST_FILE = "LocationSample-tvOS/Info.plist";
775 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
776 | OTHER_LDFLAGS = (
777 | "$(inherited)",
778 | "-ObjC",
779 | "-lc++",
780 | );
781 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.LocationSample-tvOS";
782 | PRODUCT_NAME = "$(TARGET_NAME)";
783 | SDKROOT = appletvos;
784 | TARGETED_DEVICE_FAMILY = 3;
785 | TVOS_DEPLOYMENT_TARGET = 9.2;
786 | };
787 | name = Release;
788 | };
789 | 2D02E4991E0B4A5E006451C7 /* Debug */ = {
790 | isa = XCBuildConfiguration;
791 | baseConfigurationReference = CE0FE53B27517664AD9B9707 /* Pods-LocationSample-tvOSTests.debug.xcconfig */;
792 | buildSettings = {
793 | BUNDLE_LOADER = "$(TEST_HOST)";
794 | CLANG_ANALYZER_NONNULL = YES;
795 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
796 | CLANG_WARN_INFINITE_RECURSION = YES;
797 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
798 | DEBUG_INFORMATION_FORMAT = dwarf;
799 | ENABLE_TESTABILITY = YES;
800 | GCC_NO_COMMON_BLOCKS = YES;
801 | INFOPLIST_FILE = "LocationSample-tvOSTests/Info.plist";
802 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
803 | OTHER_LDFLAGS = (
804 | "$(inherited)",
805 | "-ObjC",
806 | "-lc++",
807 | );
808 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.LocationSample-tvOSTests";
809 | PRODUCT_NAME = "$(TARGET_NAME)";
810 | SDKROOT = appletvos;
811 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LocationSample-tvOS.app/LocationSample-tvOS";
812 | TVOS_DEPLOYMENT_TARGET = 10.1;
813 | };
814 | name = Debug;
815 | };
816 | 2D02E49A1E0B4A5E006451C7 /* Release */ = {
817 | isa = XCBuildConfiguration;
818 | baseConfigurationReference = 140306D95B49A72A5B57A041 /* Pods-LocationSample-tvOSTests.release.xcconfig */;
819 | buildSettings = {
820 | BUNDLE_LOADER = "$(TEST_HOST)";
821 | CLANG_ANALYZER_NONNULL = YES;
822 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
823 | CLANG_WARN_INFINITE_RECURSION = YES;
824 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
825 | COPY_PHASE_STRIP = NO;
826 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
827 | GCC_NO_COMMON_BLOCKS = YES;
828 | INFOPLIST_FILE = "LocationSample-tvOSTests/Info.plist";
829 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
830 | OTHER_LDFLAGS = (
831 | "$(inherited)",
832 | "-ObjC",
833 | "-lc++",
834 | );
835 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.LocationSample-tvOSTests";
836 | PRODUCT_NAME = "$(TARGET_NAME)";
837 | SDKROOT = appletvos;
838 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/LocationSample-tvOS.app/LocationSample-tvOS";
839 | TVOS_DEPLOYMENT_TARGET = 10.1;
840 | };
841 | name = Release;
842 | };
843 | 83CBBA201A601CBA00E9B192 /* Debug */ = {
844 | isa = XCBuildConfiguration;
845 | buildSettings = {
846 | ALWAYS_SEARCH_USER_PATHS = NO;
847 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
848 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
849 | CLANG_CXX_LIBRARY = "libc++";
850 | CLANG_ENABLE_MODULES = YES;
851 | CLANG_ENABLE_OBJC_ARC = YES;
852 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
853 | CLANG_WARN_BOOL_CONVERSION = YES;
854 | CLANG_WARN_COMMA = YES;
855 | CLANG_WARN_CONSTANT_CONVERSION = YES;
856 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
857 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
858 | CLANG_WARN_EMPTY_BODY = YES;
859 | CLANG_WARN_ENUM_CONVERSION = YES;
860 | CLANG_WARN_INFINITE_RECURSION = YES;
861 | CLANG_WARN_INT_CONVERSION = YES;
862 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
863 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
864 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
865 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
866 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
867 | CLANG_WARN_STRICT_PROTOTYPES = YES;
868 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
869 | CLANG_WARN_UNREACHABLE_CODE = YES;
870 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
871 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
872 | COPY_PHASE_STRIP = NO;
873 | DEVELOPMENT_TEAM = Q84W2R32W3;
874 | ENABLE_STRICT_OBJC_MSGSEND = YES;
875 | ENABLE_TESTABILITY = YES;
876 | GCC_C_LANGUAGE_STANDARD = gnu99;
877 | GCC_DYNAMIC_NO_PIC = NO;
878 | GCC_NO_COMMON_BLOCKS = YES;
879 | GCC_OPTIMIZATION_LEVEL = 0;
880 | GCC_PREPROCESSOR_DEFINITIONS = (
881 | "FB_SONARKIT_ENABLED=1",
882 | "DEBUG=1",
883 | "$(inherited)",
884 | );
885 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
886 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
887 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
888 | GCC_WARN_UNDECLARED_SELECTOR = YES;
889 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
890 | GCC_WARN_UNUSED_FUNCTION = YES;
891 | GCC_WARN_UNUSED_VARIABLE = YES;
892 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
893 | LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
894 | LIBRARY_SEARCH_PATHS = (
895 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
896 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"",
897 | "\"$(inherited)\"",
898 | );
899 | MTL_ENABLE_DEBUG_INFO = YES;
900 | ONLY_ACTIVE_ARCH = YES;
901 | SDKROOT = iphoneos;
902 | };
903 | name = Debug;
904 | };
905 | 83CBBA211A601CBA00E9B192 /* Release */ = {
906 | isa = XCBuildConfiguration;
907 | buildSettings = {
908 | ALWAYS_SEARCH_USER_PATHS = NO;
909 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
910 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
911 | CLANG_CXX_LIBRARY = "libc++";
912 | CLANG_ENABLE_MODULES = YES;
913 | CLANG_ENABLE_OBJC_ARC = YES;
914 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
915 | CLANG_WARN_BOOL_CONVERSION = YES;
916 | CLANG_WARN_COMMA = YES;
917 | CLANG_WARN_CONSTANT_CONVERSION = YES;
918 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
919 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
920 | CLANG_WARN_EMPTY_BODY = YES;
921 | CLANG_WARN_ENUM_CONVERSION = YES;
922 | CLANG_WARN_INFINITE_RECURSION = YES;
923 | CLANG_WARN_INT_CONVERSION = YES;
924 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
925 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
926 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
927 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
928 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
929 | CLANG_WARN_STRICT_PROTOTYPES = YES;
930 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
931 | CLANG_WARN_UNREACHABLE_CODE = YES;
932 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
933 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
934 | COPY_PHASE_STRIP = YES;
935 | DEVELOPMENT_TEAM = Q84W2R32W3;
936 | ENABLE_NS_ASSERTIONS = NO;
937 | ENABLE_STRICT_OBJC_MSGSEND = YES;
938 | GCC_C_LANGUAGE_STANDARD = gnu99;
939 | GCC_NO_COMMON_BLOCKS = YES;
940 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
941 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
942 | GCC_WARN_UNDECLARED_SELECTOR = YES;
943 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
944 | GCC_WARN_UNUSED_FUNCTION = YES;
945 | GCC_WARN_UNUSED_VARIABLE = YES;
946 | IPHONEOS_DEPLOYMENT_TARGET = 9.0;
947 | LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
948 | LIBRARY_SEARCH_PATHS = (
949 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
950 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"",
951 | "\"$(inherited)\"",
952 | );
953 | MTL_ENABLE_DEBUG_INFO = NO;
954 | SDKROOT = iphoneos;
955 | VALIDATE_PRODUCT = YES;
956 | };
957 | name = Release;
958 | };
959 | /* End XCBuildConfiguration section */
960 |
961 | /* Begin XCConfigurationList section */
962 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "LocationSampleTests" */ = {
963 | isa = XCConfigurationList;
964 | buildConfigurations = (
965 | 00E356F61AD99517003FC87E /* Debug */,
966 | 00E356F71AD99517003FC87E /* Release */,
967 | );
968 | defaultConfigurationIsVisible = 0;
969 | defaultConfigurationName = Release;
970 | };
971 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "LocationSample" */ = {
972 | isa = XCConfigurationList;
973 | buildConfigurations = (
974 | 13B07F941A680F5B00A75B9A /* Debug */,
975 | 13B07F951A680F5B00A75B9A /* Release */,
976 | );
977 | defaultConfigurationIsVisible = 0;
978 | defaultConfigurationName = Release;
979 | };
980 | 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "LocationSample-tvOS" */ = {
981 | isa = XCConfigurationList;
982 | buildConfigurations = (
983 | 2D02E4971E0B4A5E006451C7 /* Debug */,
984 | 2D02E4981E0B4A5E006451C7 /* Release */,
985 | );
986 | defaultConfigurationIsVisible = 0;
987 | defaultConfigurationName = Release;
988 | };
989 | 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "LocationSample-tvOSTests" */ = {
990 | isa = XCConfigurationList;
991 | buildConfigurations = (
992 | 2D02E4991E0B4A5E006451C7 /* Debug */,
993 | 2D02E49A1E0B4A5E006451C7 /* Release */,
994 | );
995 | defaultConfigurationIsVisible = 0;
996 | defaultConfigurationName = Release;
997 | };
998 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "LocationSample" */ = {
999 | isa = XCConfigurationList;
1000 | buildConfigurations = (
1001 | 83CBBA201A601CBA00E9B192 /* Debug */,
1002 | 83CBBA211A601CBA00E9B192 /* Release */,
1003 | );
1004 | defaultConfigurationIsVisible = 0;
1005 | defaultConfigurationName = Release;
1006 | };
1007 | /* End XCConfigurationList section */
1008 | };
1009 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
1010 | }
1011 |
--------------------------------------------------------------------------------