Browse Source

Merge branch 'master' into shirakaba/animated-support

* master:
  chore(release): 8.0.6 [skip ci]
  fix(Android): Revert "Redirected URLs now redirect correctly. (#991)" (#1177)
  chore(release): 8.0.5 [skip ci]
  fix(Android): Redirected URLs now redirect correctly. (#991)
  chore(example): Added three test examples: Alerts, Scrolling, and Background.
  chore(release): 8.0.4 [skip ci]
  fix(iOS): Meta method 'UIScrollViewContentInsetAdjustmentBehavior:' conflict warning
  chore(example): Added example app
  chore(iOS): Extract wkWebViewConfig setup to setUpWkWebViewConfig function
  chore(release): 8.0.3 [skip ci]
  fix(whitelisted origins): Prevent handling of un-whitelisted URLs
  chore(README): Lean Core badge
Jamie Birch 4 years ago
parent
commit
c3977fe515
67 changed files with 3898 additions and 376 deletions
  1. 4
    1
      README.md
  2. 1
    0
      babel.config.js
  3. 1
    0
      example/.gitattributes
  4. 64
    0
      example/.gitignore
  5. 6
    0
      example/.prettierrc.js
  6. 1
    0
      example/.watchmanconfig
  7. 159
    0
      example/App.tsx
  8. 55
    0
      example/android/app/_BUCK
  9. 204
    0
      example/android/app/build.gradle
  10. 19
    0
      example/android/app/build_defs.bzl
  11. BIN
      example/android/app/debug.keystore
  12. 10
    0
      example/android/app/proguard-rules.pro
  13. 8
    0
      example/android/app/src/debug/AndroidManifest.xml
  14. 26
    0
      example/android/app/src/main/AndroidManifest.xml
  15. 15
    0
      example/android/app/src/main/java/com/example/MainActivity.java
  16. 76
    0
      example/android/app/src/main/java/com/example/MainApplication.java
  17. BIN
      example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  18. BIN
      example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  19. BIN
      example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  20. BIN
      example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  21. BIN
      example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  22. BIN
      example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  23. BIN
      example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  24. BIN
      example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  25. BIN
      example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  26. BIN
      example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  27. 3
    0
      example/android/app/src/main/res/values/strings.xml
  28. 9
    0
      example/android/app/src/main/res/values/styles.xml
  29. 38
    0
      example/android/build.gradle
  30. 21
    0
      example/android/gradle.properties
  31. BIN
      example/android/gradle/wrapper/gradle-wrapper.jar
  32. 5
    0
      example/android/gradle/wrapper/gradle-wrapper.properties
  33. 188
    0
      example/android/gradlew
  34. 100
    0
      example/android/gradlew.bat
  35. 5
    0
      example/android/settings.gradle
  36. 4
    0
      example/app.json
  37. 3
    0
      example/babel.config.js
  38. 72
    0
      example/examples/Alerts.tsx
  39. 54
    0
      example/examples/Background.tsx
  40. 68
    0
      example/examples/Scrolling.tsx
  41. 9
    0
      example/index.js
  42. 56
    0
      example/ios/Podfile
  43. 344
    0
      example/ios/Podfile.lock
  44. 53
    0
      example/ios/example-tvOS/Info.plist
  45. 24
    0
      example/ios/example-tvOSTests/Info.plist
  46. 925
    0
      example/ios/example.xcodeproj/project.pbxproj
  47. 129
    0
      example/ios/example.xcodeproj/xcshareddata/xcschemes/example-tvOS.xcscheme
  48. 129
    0
      example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme
  49. 10
    0
      example/ios/example.xcworkspace/contents.xcworkspacedata
  50. 8
    0
      example/ios/example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  51. 15
    0
      example/ios/example/AppDelegate.h
  52. 42
    0
      example/ios/example/AppDelegate.m
  53. 42
    0
      example/ios/example/Base.lproj/LaunchScreen.xib
  54. 38
    0
      example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json
  55. 6
    0
      example/ios/example/Images.xcassets/Contents.json
  56. 57
    0
      example/ios/example/Info.plist
  57. 16
    0
      example/ios/example/main.m
  58. 24
    0
      example/ios/exampleTests/Info.plist
  59. 72
    0
      example/ios/exampleTests/exampleTests.m
  60. 17
    0
      example/metro.config.js
  61. 62
    0
      example/tsconfig.json
  62. 138
    132
      ios/RNCWebView.m
  63. 0
    13
      ios/RNCWebViewManager.m
  64. 12
    7
      package.json
  65. 10
    4
      src/WebViewShared.tsx
  66. 80
    8
      src/__tests__/WebViewShared-test.js
  67. 361
    211
      yarn.lock

+ 4
- 1
README.md View File

@@ -4,7 +4,8 @@
4 4
 [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
5 5
 [![All Contributors](https://img.shields.io/badge/all_contributors-16-orange.svg?style=flat-square)](#contributors)
6 6
 [![Known Vulnerabilities](https://snyk.io/test/github/react-native-community/react-native-webview/badge.svg?style=flat-square)](https://snyk.io/test/github/react-native-community/react-native-webview)
7
-<a href="https://www.npmjs.com/package/react-native-webview"><img src="https://img.shields.io/npm/v/react-native-webview.svg"></a>
7
+[![NPM Version](https://img.shields.io/npm/v/react-native-webview.svg?style=flat-square)](https://www.npmjs.com/package/react-native-webview)
8
+[![Lean Core Extracted](https://img.shields.io/badge/Lean%20Core-Extracted-brightgreen.svg?style=flat-square)][lean-core-issue]
8 9
 
9 10
 **React Native WebView** is a modern, well-supported, and cross-platform WebView for React Native. It is intended to be a replacement for the built-in WebView (which will be [removed from core](https://github.com/react-native-community/discussions-and-proposals/pull/3)).
10 11
 
@@ -101,3 +102,5 @@ MIT
101 102
 This readme is available in:
102 103
 
103 104
 - [Brazilian portuguese](docs/README.portuguese.md)
105
+
106
+[lean-core-issue]: https://github.com/facebook/react-native/issues/23313

+ 1
- 0
babel.config.js View File

@@ -6,5 +6,6 @@ module.exports = function(api) {
6 6
         presets: ['module:metro-react-native-babel-preset'],
7 7
       },
8 8
     },
9
+    presets: ['module:metro-react-native-babel-preset'],
9 10
   };
10 11
 };

+ 1
- 0
example/.gitattributes View File

@@ -0,0 +1 @@
1
+*.pbxproj -text

+ 64
- 0
example/.gitignore View File

@@ -0,0 +1,64 @@
1
+# OSX
2
+#
3
+.DS_Store
4
+
5
+# Xcode
6
+#
7
+build/
8
+*.pbxuser
9
+!default.pbxuser
10
+*.mode1v3
11
+!default.mode1v3
12
+*.mode2v3
13
+!default.mode2v3
14
+*.perspectivev3
15
+!default.perspectivev3
16
+xcuserdata
17
+*.xccheckout
18
+*.moved-aside
19
+DerivedData
20
+*.hmap
21
+*.ipa
22
+*.xcuserstate
23
+project.xcworkspace
24
+
25
+# Android/IntelliJ
26
+#
27
+build/
28
+.idea
29
+.gradle
30
+local.properties
31
+*.iml
32
+
33
+# Visual Studio Code
34
+#
35
+.vscode/
36
+
37
+# node.js
38
+#
39
+node_modules/
40
+npm-debug.log
41
+yarn-error.log
42
+
43
+# BUCK
44
+buck-out/
45
+\.buckd/
46
+*.keystore
47
+!debug.keystore
48
+
49
+# fastlane
50
+#
51
+# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
52
+# screenshots whenever they are needed.
53
+# For more information about the recommended setup visit:
54
+# https://docs.fastlane.tools/best-practices/source-control/
55
+
56
+*/fastlane/report.xml
57
+*/fastlane/Preview.html
58
+*/fastlane/screenshots
59
+
60
+# Bundle artifact
61
+*.jsbundle
62
+
63
+# CocoaPods
64
+/ios/Pods/

+ 6
- 0
example/.prettierrc.js View File

@@ -0,0 +1,6 @@
1
+module.exports = {
2
+  bracketSpacing: false,
3
+  jsxBracketSameLine: true,
4
+  singleQuote: true,
5
+  trailingComma: 'all',
6
+};

+ 1
- 0
example/.watchmanconfig View File

@@ -0,0 +1 @@
1
+{}

+ 159
- 0
example/App.tsx View File

@@ -0,0 +1,159 @@
1
+import React, {Component} from 'react';
2
+import {
3
+  StyleSheet,
4
+  SafeAreaView,
5
+  Text,
6
+  TouchableOpacity,
7
+  View,
8
+  Keyboard,
9
+  Button,
10
+} from 'react-native';
11
+
12
+import Alerts from './examples/Alerts';
13
+import Scrolling from './examples/Scrolling';
14
+import Background from './examples/Background';
15
+
16
+const TESTS = {
17
+  Alerts: {
18
+    title: 'Alerts',
19
+    testId: 'alerts',
20
+    description: 'Alerts tests',
21
+    render() {
22
+      return <Alerts />;
23
+    },
24
+  },
25
+  Scrolling: {
26
+    title: 'Scrolling',
27
+    testId: 'scrolling',
28
+    description: 'Scrolling event test',
29
+    render() {
30
+      return <Scrolling />;
31
+    },
32
+  },
33
+  Background: {
34
+    title: 'Background',
35
+    testId: 'background',
36
+    description: 'Background color test',
37
+    render() {
38
+      return <Background />;
39
+    },
40
+  },
41
+};
42
+
43
+type Props = {};
44
+type State = {restarting: boolean, currentTest: Object};
45
+
46
+export default class App extends Component<Props, State> {
47
+  state = {
48
+    restarting: false,
49
+    currentTest: TESTS.Alerts,
50
+  };
51
+
52
+  _simulateRestart = () => {
53
+    this.setState({restarting: true}, () => this.setState({restarting: false}));
54
+  };
55
+
56
+  _changeTest = testName => {
57
+    this.setState({currentTest: TESTS[testName]});
58
+  };
59
+
60
+  render() {
61
+    const {restarting, currentTest} = this.state;
62
+    return (
63
+      <SafeAreaView style={styles.container}>
64
+        <TouchableOpacity
65
+          style={styles.closeKeyboardView}
66
+          onPress={() => Keyboard.dismiss()}
67
+          testID="closeKeyboard"
68
+        />
69
+
70
+        <TouchableOpacity
71
+          testID="restart_button"
72
+          onPress={this._simulateRestart}
73
+          style={styles.restartButton}
74
+          activeOpacity={0.6}>
75
+          <Text>Simulate Restart</Text>
76
+        </TouchableOpacity>
77
+
78
+        <View style={styles.testPickerContainer}>
79
+          <Button
80
+            testID="testType_alerts"
81
+            title="Alerts"
82
+            onPress={() => this._changeTest('Alerts')}
83
+          />
84
+          <Button
85
+            testID="testType_scrolling"
86
+            title="Scrolling"
87
+            onPress={() => this._changeTest('Scrolling')}
88
+          />
89
+          <Button
90
+            testID="testType_background"
91
+            title="Background"
92
+            onPress={() => this._changeTest('Background')}
93
+          />
94
+        </View>
95
+
96
+        {restarting ? null : (
97
+          <View
98
+            testID={`example-${currentTest.testId}`}
99
+            key={currentTest.title}
100
+            style={styles.exampleContainer}>
101
+            <Text style={styles.exampleTitle}>{currentTest.title}</Text>
102
+            <Text style={styles.exampleDescription}>
103
+              {currentTest.description}
104
+            </Text>
105
+            <View style={styles.exampleInnerContainer}>
106
+              {currentTest.render()}
107
+            </View>
108
+          </View>
109
+        )}
110
+      </SafeAreaView>
111
+    );
112
+  }
113
+}
114
+
115
+const styles = StyleSheet.create({
116
+  container: {
117
+    flex: 1,
118
+    backgroundColor: '#F5FCFF',
119
+    padding: 8,
120
+  },
121
+  exampleContainer: {
122
+    padding: 16,
123
+    backgroundColor: '#FFF',
124
+    borderColor: '#EEE',
125
+    borderTopWidth: 1,
126
+    borderBottomWidth: 1,
127
+    flex: 1,
128
+  },
129
+  exampleTitle: {
130
+    fontSize: 18,
131
+  },
132
+  exampleDescription: {
133
+    color: '#333333',
134
+    marginBottom: 16,
135
+  },
136
+  exampleInnerContainer: {
137
+    borderColor: '#EEE',
138
+    borderTopWidth: 1,
139
+    paddingTop: 10,
140
+    flex: 1,
141
+  },
142
+  restartButton: {
143
+    padding: 6,
144
+    fontSize: 16,
145
+    borderRadius: 5,
146
+    backgroundColor: '#F3F3F3',
147
+    alignItems: 'center',
148
+    justifyContent: 'center',
149
+    alignSelf: 'flex-end',
150
+  },
151
+  closeKeyboardView: {
152
+    width: 5,
153
+    height: 5,
154
+  },
155
+  testPickerContainer: {
156
+    flexDirection: 'row',
157
+    flexWrap: 'wrap',
158
+  },
159
+});

+ 55
- 0
example/android/app/_BUCK View File

@@ -0,0 +1,55 @@
1
+# To learn about Buck see [Docs](https://buckbuild.com/).
2
+# To run your application with Buck:
3
+# - install Buck
4
+# - `npm start` - to start the packager
5
+# - `cd android`
6
+# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"`
7
+# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck
8
+# - `buck install -r android/app` - compile, install and run application
9
+#
10
+
11
+load(":build_defs.bzl", "create_aar_targets", "create_jar_targets")
12
+
13
+lib_deps = []
14
+
15
+create_aar_targets(glob(["libs/*.aar"]))
16
+
17
+create_jar_targets(glob(["libs/*.jar"]))
18
+
19
+android_library(
20
+    name = "all-libs",
21
+    exported_deps = lib_deps,
22
+)
23
+
24
+android_library(
25
+    name = "app-code",
26
+    srcs = glob([
27
+        "src/main/java/**/*.java",
28
+    ]),
29
+    deps = [
30
+        ":all-libs",
31
+        ":build_config",
32
+        ":res",
33
+    ],
34
+)
35
+
36
+android_build_config(
37
+    name = "build_config",
38
+    package = "com.example",
39
+)
40
+
41
+android_resource(
42
+    name = "res",
43
+    package = "com.example",
44
+    res = "src/main/res",
45
+)
46
+
47
+android_binary(
48
+    name = "app",
49
+    keystore = "//android/keystores:debug",
50
+    manifest = "src/main/AndroidManifest.xml",
51
+    package_type = "debug",
52
+    deps = [
53
+        ":app-code",
54
+    ],
55
+)

+ 204
- 0
example/android/app/build.gradle View File

@@ -0,0 +1,204 @@
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
19
+ *   entryFile: "index.android.js",
20
+ *
21
+ *   // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format
22
+ *   bundleCommand: "ram-bundle",
23
+ *
24
+ *   // whether to bundle JS and assets in debug mode
25
+ *   bundleInDebug: false,
26
+ *
27
+ *   // whether to bundle JS and assets in release mode
28
+ *   bundleInRelease: true,
29
+ *
30
+ *   // whether to bundle JS and assets in another build variant (if configured).
31
+ *   // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
32
+ *   // The configuration property can be in the following formats
33
+ *   //         'bundleIn${productFlavor}${buildType}'
34
+ *   //         'bundleIn${buildType}'
35
+ *   // bundleInFreeDebug: true,
36
+ *   // bundleInPaidRelease: true,
37
+ *   // bundleInBeta: true,
38
+ *
39
+ *   // whether to disable dev mode in custom build variants (by default only disabled in release)
40
+ *   // for example: to disable dev mode in the staging build type (if configured)
41
+ *   devDisabledInStaging: true,
42
+ *   // The configuration property can be in the following formats
43
+ *   //         'devDisabledIn${productFlavor}${buildType}'
44
+ *   //         'devDisabledIn${buildType}'
45
+ *
46
+ *   // the root of your project, i.e. where "package.json" lives
47
+ *   root: "../../",
48
+ *
49
+ *   // where to put the JS bundle asset in debug mode
50
+ *   jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
51
+ *
52
+ *   // where to put the JS bundle asset in release mode
53
+ *   jsBundleDirRelease: "$buildDir/intermediates/assets/release",
54
+ *
55
+ *   // where to put drawable resources / React Native assets, e.g. the ones you use via
56
+ *   // require('./image.png')), in debug mode
57
+ *   resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
58
+ *
59
+ *   // where to put drawable resources / React Native assets, e.g. the ones you use via
60
+ *   // require('./image.png')), in release mode
61
+ *   resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
62
+ *
63
+ *   // by default the gradle tasks are skipped if none of the JS files or assets change; this means
64
+ *   // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
65
+ *   // date; if you have any other folders that you want to ignore for performance reasons (gradle
66
+ *   // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
67
+ *   // for example, you might want to remove it from here.
68
+ *   inputExcludes: ["android/**", "ios/**"],
69
+ *
70
+ *   // override which node gets called and with what additional arguments
71
+ *   nodeExecutableAndArgs: ["node"],
72
+ *
73
+ *   // supply additional arguments to the packager
74
+ *   extraPackagerArgs: []
75
+ * ]
76
+ */
77
+
78
+project.ext.react = [
79
+    cliPath: "../../../node_modules/react-native/local-cli/cli.js",
80
+    entryFile: "./example/index.js",
81
+    root: "../../../",
82
+    enableHermes: false,  // clean and rebuild if changing
83
+]
84
+
85
+apply from: "../../../node_modules/react-native/react.gradle"
86
+
87
+/**
88
+ * Set this to true to create two separate APKs instead of one:
89
+ *   - An APK that only works on ARM devices
90
+ *   - An APK that only works on x86 devices
91
+ * The advantage is the size of the APK is reduced by about 4MB.
92
+ * Upload all the APKs to the Play Store and people will download
93
+ * the correct one based on the CPU architecture of their device.
94
+ */
95
+def enableSeparateBuildPerCPUArchitecture = false
96
+
97
+/**
98
+ * Run Proguard to shrink the Java bytecode in release builds.
99
+ */
100
+def enableProguardInReleaseBuilds = false
101
+
102
+/**
103
+ * The preferred build flavor of JavaScriptCore.
104
+ *
105
+ * For example, to use the international variant, you can use:
106
+ * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
107
+ *
108
+ * The international variant includes ICU i18n library and necessary data
109
+ * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
110
+ * give correct results when using with locales other than en-US.  Note that
111
+ * this variant is about 6MiB larger per architecture than default.
112
+ */
113
+def jscFlavor = 'org.webkit:android-jsc:+'
114
+
115
+/**
116
+ * Whether to enable the Hermes VM.
117
+ *
118
+ * This should be set on project.ext.react and mirrored here.  If it is not set
119
+ * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
120
+ * and the benefits of using Hermes will therefore be sharply reduced.
121
+ */
122
+def enableHermes = project.ext.react.get("enableHermes", false);
123
+
124
+android {
125
+    compileSdkVersion rootProject.ext.compileSdkVersion
126
+
127
+    compileOptions {
128
+        sourceCompatibility JavaVersion.VERSION_1_8
129
+        targetCompatibility JavaVersion.VERSION_1_8
130
+    }
131
+
132
+    defaultConfig {
133
+        applicationId "com.example"
134
+        minSdkVersion rootProject.ext.minSdkVersion
135
+        targetSdkVersion rootProject.ext.targetSdkVersion
136
+        versionCode 1
137
+        versionName "1.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
+        release {
160
+            // Caution! In production, you need to generate your own keystore file.
161
+            // see https://facebook.github.io/react-native/docs/signed-apk-android.
162
+            signingConfig signingConfigs.debug
163
+            minifyEnabled enableProguardInReleaseBuilds
164
+            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
165
+        }
166
+    }
167
+    // applicationVariants are e.g. debug, release
168
+    applicationVariants.all { variant ->
169
+        variant.outputs.each { output ->
170
+            // For each separate APK per architecture, set a unique version code as described here:
171
+            // https://developer.android.com/studio/build/configure-apk-splits.html
172
+            def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
173
+            def abi = output.getFilter(OutputFile.ABI)
174
+            if (abi != null) {  // null for the universal-debug, universal-release variants
175
+                output.versionCodeOverride =
176
+                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
177
+            }
178
+
179
+        }
180
+    }
181
+}
182
+
183
+dependencies {
184
+    implementation project(':rnWebView')
185
+    implementation fileTree(dir: "libs", include: ["*.jar"])
186
+    implementation "com.facebook.react:react-native:+"  // From node_modules
187
+
188
+    if (enableHermes) {
189
+        def hermesPath = "../../../node_modules/hermes-engine/android/";
190
+        debugImplementation files(hermesPath + "hermes-debug.aar")
191
+        releaseImplementation files(hermesPath + "hermes-release.aar")
192
+    } else {
193
+        implementation jscFlavor
194
+    }
195
+}
196
+
197
+// Run this once to be able to run the application with BUCK
198
+// puts all compile dependencies into folder libs for BUCK to use
199
+task copyDownloadableDepsToLibs(type: Copy) {
200
+    from configurations.compile
201
+    into 'libs'
202
+}
203
+
204
+apply from: file("../../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)

+ 19
- 0
example/android/app/build_defs.bzl View File

@@ -0,0 +1,19 @@
1
+"""Helper definitions to glob .aar and .jar targets"""
2
+
3
+def create_aar_targets(aarfiles):
4
+    for aarfile in aarfiles:
5
+        name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")]
6
+        lib_deps.append(":" + name)
7
+        android_prebuilt_aar(
8
+            name = name,
9
+            aar = aarfile,
10
+        )
11
+
12
+def create_jar_targets(jarfiles):
13
+    for jarfile in jarfiles:
14
+        name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")]
15
+        lib_deps.append(":" + name)
16
+        prebuilt_jar(
17
+            name = name,
18
+            binary_jar = jarfile,
19
+        )

BIN
example/android/app/debug.keystore View File


+ 10
- 0
example/android/app/proguard-rules.pro View File

@@ -0,0 +1,10 @@
1
+# Add project specific ProGuard rules here.
2
+# By default, the flags in this file are appended to flags specified
3
+# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
4
+# You can edit the include path and order by changing the proguardFiles
5
+# directive in build.gradle.
6
+#
7
+# For more details, see
8
+#   http://developer.android.com/guide/developing/tools/proguard.html
9
+
10
+# Add any project specific keep options here:

+ 8
- 0
example/android/app/src/debug/AndroidManifest.xml View File

@@ -0,0 +1,8 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3
+    xmlns:tools="http://schemas.android.com/tools">
4
+
5
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
6
+
7
+    <application android:usesCleartextTraffic="true" tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning" />
8
+</manifest>

+ 26
- 0
example/android/app/src/main/AndroidManifest.xml View File

@@ -0,0 +1,26 @@
1
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+  package="com.example">
3
+
4
+    <uses-permission android:name="android.permission.INTERNET" />
5
+
6
+    <application
7
+      android:name=".MainApplication"
8
+      android:label="@string/app_name"
9
+      android:icon="@mipmap/ic_launcher"
10
+      android:roundIcon="@mipmap/ic_launcher_round"
11
+      android:allowBackup="false"
12
+      android:theme="@style/AppTheme">
13
+      <activity
14
+        android:name=".MainActivity"
15
+        android:label="@string/app_name"
16
+        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
17
+        android:windowSoftInputMode="adjustResize">
18
+        <intent-filter>
19
+            <action android:name="android.intent.action.MAIN" />
20
+            <category android:name="android.intent.category.LAUNCHER" />
21
+        </intent-filter>
22
+      </activity>
23
+      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
24
+    </application>
25
+
26
+</manifest>

+ 15
- 0
example/android/app/src/main/java/com/example/MainActivity.java View File

@@ -0,0 +1,15 @@
1
+package com.example;
2
+
3
+import com.facebook.react.ReactActivity;
4
+
5
+public class MainActivity extends ReactActivity {
6
+
7
+  /**
8
+   * Returns the name of the main component registered from JavaScript. This is used to schedule
9
+   * rendering of the component.
10
+   */
11
+  @Override
12
+  protected String getMainComponentName() {
13
+    return "example";
14
+  }
15
+}

+ 76
- 0
example/android/app/src/main/java/com/example/MainApplication.java View File

@@ -0,0 +1,76 @@
1
+package com.example;
2
+
3
+import android.app.Application;
4
+import android.content.Context;
5
+import com.facebook.react.PackageList;
6
+import com.facebook.react.ReactApplication;
7
+import com.facebook.react.ReactNativeHost;
8
+import com.facebook.react.ReactPackage;
9
+import com.facebook.soloader.SoLoader;
10
+import com.reactnativecommunity.webview.RNCWebViewPackage;
11
+import java.lang.reflect.InvocationTargetException;
12
+import java.util.List;
13
+
14
+public class MainApplication extends Application implements ReactApplication {
15
+
16
+  private final ReactNativeHost mReactNativeHost =
17
+      new ReactNativeHost(this) {
18
+        @Override
19
+        public boolean getUseDeveloperSupport() {
20
+          return BuildConfig.DEBUG;
21
+        }
22
+
23
+        @Override
24
+        protected List<ReactPackage> getPackages() {
25
+          @SuppressWarnings("UnnecessaryLocalVariable")
26
+          List<ReactPackage> packages = new PackageList(this).getPackages();
27
+          // Packages that cannot be autolinked yet can be added manually here, for example:
28
+          // packages.add(new MyReactNativePackage());
29
+          packages.add(new RNCWebViewPackage());
30
+          return packages;
31
+        }
32
+
33
+        @Override
34
+        protected String getJSMainModuleName() {
35
+          return "example/index";
36
+        }
37
+      };
38
+
39
+  @Override
40
+  public ReactNativeHost getReactNativeHost() {
41
+    return mReactNativeHost;
42
+  }
43
+
44
+  @Override
45
+  public void onCreate() {
46
+    super.onCreate();
47
+    SoLoader.init(this, /* native exopackage */ false);
48
+    initializeFlipper(this); // Remove this line if you don't want Flipper enabled
49
+  }
50
+
51
+  /**
52
+   * Loads Flipper in React Native templates.
53
+   *
54
+   * @param context
55
+   */
56
+  private static void initializeFlipper(Context context) {
57
+    if (BuildConfig.DEBUG) {
58
+      try {
59
+        /*
60
+         We use reflection here to pick up the class that initializes Flipper,
61
+        since Flipper library is not available in release mode
62
+        */
63
+        Class<?> aClass = Class.forName("com.facebook.flipper.ReactNativeFlipper");
64
+        aClass.getMethod("initializeFlipper", Context.class).invoke(null, context);
65
+      } catch (ClassNotFoundException e) {
66
+        e.printStackTrace();
67
+      } catch (NoSuchMethodException e) {
68
+        e.printStackTrace();
69
+      } catch (IllegalAccessException e) {
70
+        e.printStackTrace();
71
+      } catch (InvocationTargetException e) {
72
+        e.printStackTrace();
73
+      }
74
+    }
75
+  }
76
+}

BIN
example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png View File


BIN
example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png View File


BIN
example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png View File


BIN
example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png View File


BIN
example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png View File


BIN
example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png View File


BIN
example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png View File


BIN
example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png View File


BIN
example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png View File


BIN
example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png View File


+ 3
- 0
example/android/app/src/main/res/values/strings.xml View File

@@ -0,0 +1,3 @@
1
+<resources>
2
+    <string name="app_name">example</string>
3
+</resources>

+ 9
- 0
example/android/app/src/main/res/values/styles.xml View File

@@ -0,0 +1,9 @@
1
+<resources>
2
+
3
+    <!-- Base application theme. -->
4
+    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
5
+        <!-- Customize your theme here. -->
6
+        <item name="android:textColor">#000000</item>
7
+    </style>
8
+
9
+</resources>

+ 38
- 0
example/android/build.gradle View File

@@ -0,0 +1,38 @@
1
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
2
+
3
+buildscript {
4
+    ext {
5
+        buildToolsVersion = "28.0.3"
6
+        minSdkVersion = 16
7
+        compileSdkVersion = 28
8
+        targetSdkVersion = 28
9
+    }
10
+    repositories {
11
+        google()
12
+        jcenter()
13
+    }
14
+    dependencies {
15
+        classpath("com.android.tools.build:gradle:3.4.2")
16
+
17
+        // NOTE: Do not place your application dependencies here; they belong
18
+        // in the individual module build.gradle files
19
+    }
20
+}
21
+
22
+allprojects {
23
+    repositories {
24
+        mavenLocal()
25
+        maven {
26
+            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
27
+            url("$rootDir/../../node_modules/react-native/android")
28
+        }
29
+        maven {
30
+            // Android JSC is installed from npm
31
+            url("$rootDir/../../node_modules/jsc-android/dist")
32
+        }
33
+
34
+        google()
35
+        jcenter()
36
+        maven { url 'https://jitpack.io' }
37
+    }
38
+}

+ 21
- 0
example/android/gradle.properties View File

@@ -0,0 +1,21 @@
1
+# Project-wide Gradle settings.
2
+
3
+# IDE (e.g. Android Studio) users:
4
+# Gradle settings configured through the IDE *will override*
5
+# any settings specified in this file.
6
+
7
+# For more details on how to configure your build environment visit
8
+# http://www.gradle.org/docs/current/userguide/build_environment.html
9
+
10
+# Specifies the JVM arguments used for the daemon process.
11
+# The setting is particularly useful for tweaking memory settings.
12
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
13
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14
+
15
+# When configured, Gradle will run in incubating parallel mode.
16
+# This option should only be used with decoupled projects. More details, visit
17
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18
+# org.gradle.parallel=true
19
+
20
+android.useAndroidX=true
21
+android.enableJetifier=true

BIN
example/android/gradle/wrapper/gradle-wrapper.jar View File


+ 5
- 0
example/android/gradle/wrapper/gradle-wrapper.properties View File

@@ -0,0 +1,5 @@
1
+distributionBase=GRADLE_USER_HOME
2
+distributionPath=wrapper/dists
3
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.5-all.zip
4
+zipStoreBase=GRADLE_USER_HOME
5
+zipStorePath=wrapper/dists

+ 188
- 0
example/android/gradlew View File

@@ -0,0 +1,188 @@
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
+#      http://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, switch paths to Windows format before running java
129
+if $cygwin ; 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=$((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
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
184
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
185
+  cd "$(dirname "$0")"
186
+fi
187
+
188
+exec "$JAVACMD" "$@"

+ 100
- 0
example/android/gradlew.bat View File

@@ -0,0 +1,100 @@
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 Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
33
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
34
+
35
+@rem Find java.exe
36
+if defined JAVA_HOME goto findJavaFromJavaHome
37
+
38
+set JAVA_EXE=java.exe
39
+%JAVA_EXE% -version >NUL 2>&1
40
+if "%ERRORLEVEL%" == "0" goto init
41
+
42
+echo.
43
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
44
+echo.
45
+echo Please set the JAVA_HOME variable in your environment to match the
46
+echo location of your Java installation.
47
+
48
+goto fail
49
+
50
+:findJavaFromJavaHome
51
+set JAVA_HOME=%JAVA_HOME:"=%
52
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
53
+
54
+if exist "%JAVA_EXE%" goto init
55
+
56
+echo.
57
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
58
+echo.
59
+echo Please set the JAVA_HOME variable in your environment to match the
60
+echo location of your Java installation.
61
+
62
+goto fail
63
+
64
+:init
65
+@rem Get command-line arguments, handling Windows variants
66
+
67
+if not "%OS%" == "Windows_NT" goto win9xME_args
68
+
69
+:win9xME_args
70
+@rem Slurp the command line arguments.
71
+set CMD_LINE_ARGS=
72
+set _SKIP=2
73
+
74
+:win9xME_args_slurp
75
+if "x%~1" == "x" goto execute
76
+
77
+set CMD_LINE_ARGS=%*
78
+
79
+:execute
80
+@rem Setup the command line
81
+
82
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
83
+
84
+@rem Execute Gradle
85
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
86
+
87
+:end
88
+@rem End local scope for the variables with windows NT shell
89
+if "%ERRORLEVEL%"=="0" goto mainEnd
90
+
91
+:fail
92
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
93
+rem the _cmd.exe /c_ return code!
94
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
95
+exit /b 1
96
+
97
+:mainEnd
98
+if "%OS%"=="Windows_NT" endlocal
99
+
100
+:omega

+ 5
- 0
example/android/settings.gradle View File

@@ -0,0 +1,5 @@
1
+rootProject.name = 'example'
2
+apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
3
+include ':app'
4
+include ':rnWebView'
5
+project(':rnWebView').projectDir = new File(rootProject.projectDir, '../../android')

+ 4
- 0
example/app.json View File

@@ -0,0 +1,4 @@
1
+{
2
+  "name": "example",
3
+  "displayName": "example"
4
+}

+ 3
- 0
example/babel.config.js View File

@@ -0,0 +1,3 @@
1
+module.exports = {
2
+  presets: ['module:metro-react-native-babel-preset'],
3
+};

+ 72
- 0
example/examples/Alerts.tsx View File

@@ -0,0 +1,72 @@
1
+import React, {Component} from 'react';
2
+import {Text, View} from 'react-native';
3
+
4
+import WebView from 'react-native-webview';
5
+
6
+const HTML = `
7
+<!DOCTYPE html>\n
8
+<html>
9
+  <head>
10
+    <title>Alerts</title>
11
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
12
+    <meta name="viewport" content="width=320, user-scalable=no">
13
+    <style type="text/css">
14
+      body {
15
+        margin: 0;
16
+        padding: 0;
17
+        font: 62.5% arial, sans-serif;
18
+        background: #ccc;
19
+      }
20
+    </style>
21
+  </head>
22
+  <body>
23
+    <button onclick="showAlert()">Show alert</button>
24
+    <button onclick="showConfirm()">Show confirm</button>
25
+    <button onclick="showPrompt()">Show prompt</button>
26
+    <p id="demo"></p>    
27
+    <script>
28
+      function showAlert() {
29
+        alert("Hello! I am an alert box!");
30
+        document.getElementById("demo").innerHTML = "Alert dismissed!";
31
+      }
32
+      function showConfirm() {
33
+        var response;
34
+        if (confirm("Press a button!")) {
35
+          response = "You pressed OK on confirm!";
36
+        } else {
37
+          response = "You pressed Cancel on confirm!";
38
+        }
39
+        document.getElementById("demo").innerHTML = response;
40
+      }
41
+      function showPrompt() {
42
+        var message;
43
+        const name = prompt("Please enter your name", "Name");
44
+        if (name !== null) {
45
+          message = "Hello " + name;
46
+        } else {
47
+          message = "You pressed Cancel on prompt!";
48
+        }
49
+        document.getElementById("demo").innerHTML = message;
50
+      }
51
+    </script>
52
+  </body>
53
+</html>
54
+`;
55
+
56
+type Props = {};
57
+type State = {};
58
+
59
+export default class Alerts extends Component<Props, State> {
60
+  state = {};
61
+
62
+  render() {
63
+    return (
64
+      <View style={{ height: 120 }}>
65
+        <WebView
66
+          source={{html: HTML}}
67
+          automaticallyAdjustContentInsets={false}
68
+        />
69
+      </View>
70
+    );
71
+  }
72
+}

+ 54
- 0
example/examples/Background.tsx View File

@@ -0,0 +1,54 @@
1
+import React, {Component} from 'react';
2
+import {Text, View} from 'react-native';
3
+
4
+import WebView from 'react-native-webview';
5
+
6
+const HTML = `
7
+<!DOCTYPE html>\n
8
+<html>
9
+  <head>
10
+    <title>Hello World</title>
11
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
12
+    <meta name="viewport" content="width=320, user-scalable=no">
13
+    <style type="text/css">
14
+      body {
15
+        margin: 0;
16
+        padding: 0;
17
+        font: 62.5% arial, sans-serif;
18
+        background: transparent;
19
+      }
20
+    </style>
21
+  </head>
22
+  <body>
23
+    <p>HTML content in transparent body.</p>
24
+  </body>
25
+</html>
26
+`;
27
+
28
+type Props = {};
29
+type State = {
30
+  backgroundColor: string,
31
+};
32
+
33
+export default class Background extends Component<Props, State> {
34
+  state = {
35
+    backgroundColor: '#FF00FF00'
36
+  };
37
+
38
+  render() {
39
+    return (
40
+      <View>
41
+        <View style={{backgroundColor:'red'}}>
42
+          <View style={{ height: 120 }}>
43
+            <WebView
44
+              source={{html: HTML}}
45
+              automaticallyAdjustContentInsets={false}
46
+              style={{backgroundColor:'#00000000'}}
47
+            />
48
+          </View>
49
+        </View>
50
+        <Text>WebView is transparent contained in a View with a red backgroundColor</Text>
51
+      </View>
52
+    );
53
+  }
54
+}

+ 68
- 0
example/examples/Scrolling.tsx View File

@@ -0,0 +1,68 @@
1
+import React, {Component} from 'react';
2
+import {Button, Text, View} from 'react-native';
3
+
4
+import WebView from 'react-native-webview';
5
+
6
+const HTML = `
7
+<!DOCTYPE html>\n
8
+<html>
9
+  <head>
10
+    <title>Hello World</title>
11
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
12
+    <meta name="viewport" content="width=320, user-scalable=no">
13
+    <style type="text/css">
14
+      body {
15
+        margin: 0;
16
+        padding: 0;
17
+        font: 62.5% arial, sans-serif;
18
+        background: #ccc;
19
+      }
20
+    </style>
21
+  </head>
22
+  <body>
23
+    <p>Lorem ipsum dolor sit amet, virtute utroque voluptaria et duo, probo aeque partiendo pri at. Mea ut stet aliquip deterruisset. Inani erroribus principes ei mel, no dicit recteque delicatissimi usu. Ne has dolore nominavi, feugait hendrerit interesset vis ea, amet regione ne pri. Te cum amet etiam.</p>
24
+    <p>Ut adipiscing neglegentur mediocritatem sea, suas abhorreant ius cu, ne nostrud feugiat per. Nam paulo facete iudicabit an, an brute mundi suavitate has, ex utamur numquam duo. Sea platonem argumentum instructior in, quo no prima inani perfecto. Ex illum postea copiosae has, ei mea sonet ocurreret.</p>
25
+    <p>Has convenire erroribus cu, quo homero facilisis inciderint ea. Vix choro gloriatur definitionem an, te exerci debitis voluptaria pri, mea admodum antiopam neglegentur te. His ea iisque splendide, nam id malorum pertinacia. Iusto tempor in eos, vis debet erant an. An nostrum rationibus sit, et sed dicta delenit suscipiantur. Est dolore vituperatoribus in, ubique explicari est cu. Legere tractatos ut usu, probo atqui vituperata in usu, mazim nemore praesent pro no.</p>
26
+    <p>Ei pri facilisi accusamus. Ut partem quaestio sit, an usu audiam quaerendum, ei qui hinc soleat. Fabulas phaedrum erroribus ut est. Intellegebat delicatissimi vis cu. His ea vidit libris facilis. Usu ne scripta legimus intellegam. Hendrerit urbanitas accommodare mei in.</p>
27
+    <p>Brute appetere efficiendi has ne. Ei ornatus labores vis. Vel harum fierent no, ad erat partiendo vis, harum democritum duo at. Has no labitur vulputate. Has cu autem aperiam hendrerit, sed eu justo verear menandri.</p>
28
+  </body>
29
+</html>
30
+`;
31
+
32
+type Props = {};
33
+type State = {
34
+  scrollEnabled: boolean,
35
+  lastScrollEvent: string
36
+};
37
+
38
+export default class Scrolling extends Component<Props, State> {
39
+  state = {
40
+    scrollEnabled: true,
41
+    lastScrollEvent: ''
42
+  };
43
+
44
+  render() {
45
+    return (
46
+      <View>
47
+        <View style={{ height: 120 }}>
48
+          <WebView
49
+            source={{html: HTML}}
50
+            automaticallyAdjustContentInsets={false}
51
+            onScroll={this._onScroll}
52
+            scrollEnabled={this.state.scrollEnabled}
53
+          />
54
+        </View>
55
+        <Button
56
+          title={this.state.scrollEnabled ? 'Scroll enabled' : 'Scroll disabled'}
57
+          onPress={() => this.setState({scrollEnabled: !this.state.scrollEnabled})}
58
+        />
59
+        <Text>Last scroll event:</Text>
60
+        <Text>{this.state.lastScrollEvent}</Text>
61
+      </View>
62
+    );
63
+  }
64
+
65
+  _onScroll = event => {
66
+    this.setState({lastScrollEvent: JSON.stringify(event.nativeEvent)});
67
+  }
68
+}

+ 9
- 0
example/index.js View File

@@ -0,0 +1,9 @@
1
+/**
2
+ * @format
3
+ */
4
+
5
+import {AppRegistry} from 'react-native';
6
+import App from './App';
7
+import {name as appName} from './app.json';
8
+
9
+AppRegistry.registerComponent(appName, () => App);

+ 56
- 0
example/ios/Podfile View File

@@ -0,0 +1,56 @@
1
+platform :ios, '9.0'
2
+require_relative '../../node_modules/@react-native-community/cli-platform-ios/native_modules'
3
+
4
+project './example.xcodeproj'
5
+
6
+target 'example' do
7
+  # Pods for example
8
+  pod 'react-native-webview', :path => "../.."
9
+  pod 'FBLazyVector', :path => "../../node_modules/react-native/Libraries/FBLazyVector"
10
+  pod 'FBReactNativeSpec', :path => "../../node_modules/react-native/Libraries/FBReactNativeSpec"
11
+  pod 'RCTRequired', :path => "../../node_modules/react-native/Libraries/RCTRequired"
12
+  pod 'RCTTypeSafety', :path => "../../node_modules/react-native/Libraries/TypeSafety"
13
+  pod 'React', :path => '../../node_modules/react-native/'
14
+  pod 'React-Core', :path => '../../node_modules/react-native/'
15
+  pod 'React-CoreModules', :path => '../../node_modules/react-native/React/CoreModules'
16
+  pod 'React-Core/DevSupport', :path => '../../node_modules/react-native/'
17
+  pod 'React-RCTActionSheet', :path => '../../node_modules/react-native/Libraries/ActionSheetIOS'
18
+  pod 'React-RCTAnimation', :path => '../../node_modules/react-native/Libraries/NativeAnimation'
19
+  pod 'React-RCTBlob', :path => '../../node_modules/react-native/Libraries/Blob'
20
+  pod 'React-RCTImage', :path => '../../node_modules/react-native/Libraries/Image'
21
+  pod 'React-RCTLinking', :path => '../../node_modules/react-native/Libraries/LinkingIOS'
22
+  pod 'React-RCTNetwork', :path => '../../node_modules/react-native/Libraries/Network'
23
+  pod 'React-RCTSettings', :path => '../../node_modules/react-native/Libraries/Settings'
24
+  pod 'React-RCTText', :path => '../../node_modules/react-native/Libraries/Text'
25
+  pod 'React-RCTVibration', :path => '../../node_modules/react-native/Libraries/Vibration'
26
+  pod 'React-Core/RCTWebSocket', :path => '../../node_modules/react-native/'
27
+
28
+  pod 'React-cxxreact', :path => '../../node_modules/react-native/ReactCommon/cxxreact'
29
+  pod 'React-jsi', :path => '../../node_modules/react-native/ReactCommon/jsi'
30
+  pod 'React-jsiexecutor', :path => '../../node_modules/react-native/ReactCommon/jsiexecutor'
31
+  pod 'React-jsinspector', :path => '../../node_modules/react-native/ReactCommon/jsinspector'
32
+  pod 'ReactCommon/jscallinvoker', :path => "../../node_modules/react-native/ReactCommon"
33
+  pod 'ReactCommon/turbomodule/core', :path => "../../node_modules/react-native/ReactCommon"
34
+  pod 'Yoga', :path => '../../node_modules/react-native/ReactCommon/yoga'
35
+
36
+  pod 'DoubleConversion', :podspec => '../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
37
+  pod 'glog', :podspec => '../../node_modules/react-native/third-party-podspecs/glog.podspec'
38
+  pod 'Folly', :podspec => '../../node_modules/react-native/third-party-podspecs/Folly.podspec'
39
+
40
+  target 'exampleTests' do
41
+    inherit! :search_paths
42
+    # Pods for testing
43
+  end
44
+
45
+  use_native_modules!
46
+end
47
+
48
+target 'example-tvOS' do
49
+  # Pods for example-tvOS
50
+
51
+  target 'example-tvOSTests' do
52
+    inherit! :search_paths
53
+    # Pods for testing
54
+  end
55
+
56
+end

+ 344
- 0
example/ios/Podfile.lock View File

@@ -0,0 +1,344 @@
1
+PODS:
2
+  - boost-for-react-native (1.63.0)
3
+  - DoubleConversion (1.1.6)
4
+  - FBLazyVector (0.61.5)
5
+  - FBReactNativeSpec (0.61.5):
6
+    - Folly (= 2018.10.22.00)
7
+    - RCTRequired (= 0.61.5)
8
+    - RCTTypeSafety (= 0.61.5)
9
+    - React-Core (= 0.61.5)
10
+    - React-jsi (= 0.61.5)
11
+    - ReactCommon/turbomodule/core (= 0.61.5)
12
+  - Folly (2018.10.22.00):
13
+    - boost-for-react-native
14
+    - DoubleConversion
15
+    - Folly/Default (= 2018.10.22.00)
16
+    - glog
17
+  - Folly/Default (2018.10.22.00):
18
+    - boost-for-react-native
19
+    - DoubleConversion
20
+    - glog
21
+  - glog (0.3.5)
22
+  - RCTRequired (0.61.5)
23
+  - RCTTypeSafety (0.61.5):
24
+    - FBLazyVector (= 0.61.5)
25
+    - Folly (= 2018.10.22.00)
26
+    - RCTRequired (= 0.61.5)
27
+    - React-Core (= 0.61.5)
28
+  - React (0.61.5):
29
+    - React-Core (= 0.61.5)
30
+    - React-Core/DevSupport (= 0.61.5)
31
+    - React-Core/RCTWebSocket (= 0.61.5)
32
+    - React-RCTActionSheet (= 0.61.5)
33
+    - React-RCTAnimation (= 0.61.5)
34
+    - React-RCTBlob (= 0.61.5)
35
+    - React-RCTImage (= 0.61.5)
36
+    - React-RCTLinking (= 0.61.5)
37
+    - React-RCTNetwork (= 0.61.5)
38
+    - React-RCTSettings (= 0.61.5)
39
+    - React-RCTText (= 0.61.5)
40
+    - React-RCTVibration (= 0.61.5)
41
+  - React-Core (0.61.5):
42
+    - Folly (= 2018.10.22.00)
43
+    - glog
44
+    - React-Core/Default (= 0.61.5)
45
+    - React-cxxreact (= 0.61.5)
46
+    - React-jsi (= 0.61.5)
47
+    - React-jsiexecutor (= 0.61.5)
48
+    - Yoga
49
+  - React-Core/CoreModulesHeaders (0.61.5):
50
+    - Folly (= 2018.10.22.00)
51
+    - glog
52
+    - React-Core/Default
53
+    - React-cxxreact (= 0.61.5)
54
+    - React-jsi (= 0.61.5)
55
+    - React-jsiexecutor (= 0.61.5)
56
+    - Yoga
57
+  - React-Core/Default (0.61.5):
58
+    - Folly (= 2018.10.22.00)
59
+    - glog
60
+    - React-cxxreact (= 0.61.5)
61
+    - React-jsi (= 0.61.5)
62
+    - React-jsiexecutor (= 0.61.5)
63
+    - Yoga
64
+  - React-Core/DevSupport (0.61.5):
65
+    - Folly (= 2018.10.22.00)
66
+    - glog
67
+    - React-Core/Default (= 0.61.5)
68
+    - React-Core/RCTWebSocket (= 0.61.5)
69
+    - React-cxxreact (= 0.61.5)
70
+    - React-jsi (= 0.61.5)
71
+    - React-jsiexecutor (= 0.61.5)
72
+    - React-jsinspector (= 0.61.5)
73
+    - Yoga
74
+  - React-Core/RCTActionSheetHeaders (0.61.5):
75
+    - Folly (= 2018.10.22.00)
76
+    - glog
77
+    - React-Core/Default
78
+    - React-cxxreact (= 0.61.5)
79
+    - React-jsi (= 0.61.5)
80
+    - React-jsiexecutor (= 0.61.5)
81
+    - Yoga
82
+  - React-Core/RCTAnimationHeaders (0.61.5):
83
+    - Folly (= 2018.10.22.00)
84
+    - glog
85
+    - React-Core/Default
86
+    - React-cxxreact (= 0.61.5)
87
+    - React-jsi (= 0.61.5)
88
+    - React-jsiexecutor (= 0.61.5)
89
+    - Yoga
90
+  - React-Core/RCTBlobHeaders (0.61.5):
91
+    - Folly (= 2018.10.22.00)
92
+    - glog
93
+    - React-Core/Default
94
+    - React-cxxreact (= 0.61.5)
95
+    - React-jsi (= 0.61.5)
96
+    - React-jsiexecutor (= 0.61.5)
97
+    - Yoga
98
+  - React-Core/RCTImageHeaders (0.61.5):
99
+    - Folly (= 2018.10.22.00)
100
+    - glog
101
+    - React-Core/Default
102
+    - React-cxxreact (= 0.61.5)
103
+    - React-jsi (= 0.61.5)
104
+    - React-jsiexecutor (= 0.61.5)
105
+    - Yoga
106
+  - React-Core/RCTLinkingHeaders (0.61.5):
107
+    - Folly (= 2018.10.22.00)
108
+    - glog
109
+    - React-Core/Default
110
+    - React-cxxreact (= 0.61.5)
111
+    - React-jsi (= 0.61.5)
112
+    - React-jsiexecutor (= 0.61.5)
113
+    - Yoga
114
+  - React-Core/RCTNetworkHeaders (0.61.5):
115
+    - Folly (= 2018.10.22.00)
116
+    - glog
117
+    - React-Core/Default
118
+    - React-cxxreact (= 0.61.5)
119
+    - React-jsi (= 0.61.5)
120
+    - React-jsiexecutor (= 0.61.5)
121
+    - Yoga
122
+  - React-Core/RCTSettingsHeaders (0.61.5):
123
+    - Folly (= 2018.10.22.00)
124
+    - glog
125
+    - React-Core/Default
126
+    - React-cxxreact (= 0.61.5)
127
+    - React-jsi (= 0.61.5)
128
+    - React-jsiexecutor (= 0.61.5)
129
+    - Yoga
130
+  - React-Core/RCTTextHeaders (0.61.5):
131
+    - Folly (= 2018.10.22.00)
132
+    - glog
133
+    - React-Core/Default
134
+    - React-cxxreact (= 0.61.5)
135
+    - React-jsi (= 0.61.5)
136
+    - React-jsiexecutor (= 0.61.5)
137
+    - Yoga
138
+  - React-Core/RCTVibrationHeaders (0.61.5):
139
+    - Folly (= 2018.10.22.00)
140
+    - glog
141
+    - React-Core/Default
142
+    - React-cxxreact (= 0.61.5)
143
+    - React-jsi (= 0.61.5)
144
+    - React-jsiexecutor (= 0.61.5)
145
+    - Yoga
146
+  - React-Core/RCTWebSocket (0.61.5):
147
+    - Folly (= 2018.10.22.00)
148
+    - glog
149
+    - React-Core/Default (= 0.61.5)
150
+    - React-cxxreact (= 0.61.5)
151
+    - React-jsi (= 0.61.5)
152
+    - React-jsiexecutor (= 0.61.5)
153
+    - Yoga
154
+  - React-CoreModules (0.61.5):
155
+    - FBReactNativeSpec (= 0.61.5)
156
+    - Folly (= 2018.10.22.00)
157
+    - RCTTypeSafety (= 0.61.5)
158
+    - React-Core/CoreModulesHeaders (= 0.61.5)
159
+    - React-RCTImage (= 0.61.5)
160
+    - ReactCommon/turbomodule/core (= 0.61.5)
161
+  - React-cxxreact (0.61.5):
162
+    - boost-for-react-native (= 1.63.0)
163
+    - DoubleConversion
164
+    - Folly (= 2018.10.22.00)
165
+    - glog
166
+    - React-jsinspector (= 0.61.5)
167
+  - React-jsi (0.61.5):
168
+    - boost-for-react-native (= 1.63.0)
169
+    - DoubleConversion
170
+    - Folly (= 2018.10.22.00)
171
+    - glog
172
+    - React-jsi/Default (= 0.61.5)
173
+  - React-jsi/Default (0.61.5):
174
+    - boost-for-react-native (= 1.63.0)
175
+    - DoubleConversion
176
+    - Folly (= 2018.10.22.00)
177
+    - glog
178
+  - React-jsiexecutor (0.61.5):
179
+    - DoubleConversion
180
+    - Folly (= 2018.10.22.00)
181
+    - glog
182
+    - React-cxxreact (= 0.61.5)
183
+    - React-jsi (= 0.61.5)
184
+  - React-jsinspector (0.61.5)
185
+  - react-native-webview (8.0.4):
186
+    - React
187
+  - React-RCTActionSheet (0.61.5):
188
+    - React-Core/RCTActionSheetHeaders (= 0.61.5)
189
+  - React-RCTAnimation (0.61.5):
190
+    - React-Core/RCTAnimationHeaders (= 0.61.5)
191
+  - React-RCTBlob (0.61.5):
192
+    - React-Core/RCTBlobHeaders (= 0.61.5)
193
+    - React-Core/RCTWebSocket (= 0.61.5)
194
+    - React-jsi (= 0.61.5)
195
+    - React-RCTNetwork (= 0.61.5)
196
+  - React-RCTImage (0.61.5):
197
+    - React-Core/RCTImageHeaders (= 0.61.5)
198
+    - React-RCTNetwork (= 0.61.5)
199
+  - React-RCTLinking (0.61.5):
200
+    - React-Core/RCTLinkingHeaders (= 0.61.5)
201
+  - React-RCTNetwork (0.61.5):
202
+    - React-Core/RCTNetworkHeaders (= 0.61.5)
203
+  - React-RCTSettings (0.61.5):
204
+    - React-Core/RCTSettingsHeaders (= 0.61.5)
205
+  - React-RCTText (0.61.5):
206
+    - React-Core/RCTTextHeaders (= 0.61.5)
207
+  - React-RCTVibration (0.61.5):
208
+    - React-Core/RCTVibrationHeaders (= 0.61.5)
209
+  - ReactCommon/jscallinvoker (0.61.5):
210
+    - DoubleConversion
211
+    - Folly (= 2018.10.22.00)
212
+    - glog
213
+    - React-cxxreact (= 0.61.5)
214
+  - ReactCommon/turbomodule/core (0.61.5):
215
+    - DoubleConversion
216
+    - Folly (= 2018.10.22.00)
217
+    - glog
218
+    - React-Core (= 0.61.5)
219
+    - React-cxxreact (= 0.61.5)
220
+    - React-jsi (= 0.61.5)
221
+    - ReactCommon/jscallinvoker (= 0.61.5)
222
+  - Yoga (1.14.0)
223
+
224
+DEPENDENCIES:
225
+  - DoubleConversion (from `../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
226
+  - FBLazyVector (from `../../node_modules/react-native/Libraries/FBLazyVector`)
227
+  - FBReactNativeSpec (from `../../node_modules/react-native/Libraries/FBReactNativeSpec`)
228
+  - Folly (from `../../node_modules/react-native/third-party-podspecs/Folly.podspec`)
229
+  - glog (from `../../node_modules/react-native/third-party-podspecs/glog.podspec`)
230
+  - RCTRequired (from `../../node_modules/react-native/Libraries/RCTRequired`)
231
+  - RCTTypeSafety (from `../../node_modules/react-native/Libraries/TypeSafety`)
232
+  - React (from `../../node_modules/react-native/`)
233
+  - React-Core (from `../../node_modules/react-native/`)
234
+  - React-Core/DevSupport (from `../../node_modules/react-native/`)
235
+  - React-Core/RCTWebSocket (from `../../node_modules/react-native/`)
236
+  - React-CoreModules (from `../../node_modules/react-native/React/CoreModules`)
237
+  - React-cxxreact (from `../../node_modules/react-native/ReactCommon/cxxreact`)
238
+  - React-jsi (from `../../node_modules/react-native/ReactCommon/jsi`)
239
+  - React-jsiexecutor (from `../../node_modules/react-native/ReactCommon/jsiexecutor`)
240
+  - React-jsinspector (from `../../node_modules/react-native/ReactCommon/jsinspector`)
241
+  - react-native-webview (from `../..`)
242
+  - React-RCTActionSheet (from `../../node_modules/react-native/Libraries/ActionSheetIOS`)
243
+  - React-RCTAnimation (from `../../node_modules/react-native/Libraries/NativeAnimation`)
244
+  - React-RCTBlob (from `../../node_modules/react-native/Libraries/Blob`)
245
+  - React-RCTImage (from `../../node_modules/react-native/Libraries/Image`)
246
+  - React-RCTLinking (from `../../node_modules/react-native/Libraries/LinkingIOS`)
247
+  - React-RCTNetwork (from `../../node_modules/react-native/Libraries/Network`)
248
+  - React-RCTSettings (from `../../node_modules/react-native/Libraries/Settings`)
249
+  - React-RCTText (from `../../node_modules/react-native/Libraries/Text`)
250
+  - React-RCTVibration (from `../../node_modules/react-native/Libraries/Vibration`)
251
+  - ReactCommon/jscallinvoker (from `../../node_modules/react-native/ReactCommon`)
252
+  - ReactCommon/turbomodule/core (from `../../node_modules/react-native/ReactCommon`)
253
+  - Yoga (from `../../node_modules/react-native/ReactCommon/yoga`)
254
+
255
+SPEC REPOS:
256
+  trunk:
257
+    - boost-for-react-native
258
+
259
+EXTERNAL SOURCES:
260
+  DoubleConversion:
261
+    :podspec: "../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
262
+  FBLazyVector:
263
+    :path: "../../node_modules/react-native/Libraries/FBLazyVector"
264
+  FBReactNativeSpec:
265
+    :path: "../../node_modules/react-native/Libraries/FBReactNativeSpec"
266
+  Folly:
267
+    :podspec: "../../node_modules/react-native/third-party-podspecs/Folly.podspec"
268
+  glog:
269
+    :podspec: "../../node_modules/react-native/third-party-podspecs/glog.podspec"
270
+  RCTRequired:
271
+    :path: "../../node_modules/react-native/Libraries/RCTRequired"
272
+  RCTTypeSafety:
273
+    :path: "../../node_modules/react-native/Libraries/TypeSafety"
274
+  React:
275
+    :path: "../../node_modules/react-native/"
276
+  React-Core:
277
+    :path: "../../node_modules/react-native/"
278
+  React-CoreModules:
279
+    :path: "../../node_modules/react-native/React/CoreModules"
280
+  React-cxxreact:
281
+    :path: "../../node_modules/react-native/ReactCommon/cxxreact"
282
+  React-jsi:
283
+    :path: "../../node_modules/react-native/ReactCommon/jsi"
284
+  React-jsiexecutor:
285
+    :path: "../../node_modules/react-native/ReactCommon/jsiexecutor"
286
+  React-jsinspector:
287
+    :path: "../../node_modules/react-native/ReactCommon/jsinspector"
288
+  react-native-webview:
289
+    :path: "../.."
290
+  React-RCTActionSheet:
291
+    :path: "../../node_modules/react-native/Libraries/ActionSheetIOS"
292
+  React-RCTAnimation:
293
+    :path: "../../node_modules/react-native/Libraries/NativeAnimation"
294
+  React-RCTBlob:
295
+    :path: "../../node_modules/react-native/Libraries/Blob"
296
+  React-RCTImage:
297
+    :path: "../../node_modules/react-native/Libraries/Image"
298
+  React-RCTLinking:
299
+    :path: "../../node_modules/react-native/Libraries/LinkingIOS"
300
+  React-RCTNetwork:
301
+    :path: "../../node_modules/react-native/Libraries/Network"
302
+  React-RCTSettings:
303
+    :path: "../../node_modules/react-native/Libraries/Settings"
304
+  React-RCTText:
305
+    :path: "../../node_modules/react-native/Libraries/Text"
306
+  React-RCTVibration:
307
+    :path: "../../node_modules/react-native/Libraries/Vibration"
308
+  ReactCommon:
309
+    :path: "../../node_modules/react-native/ReactCommon"
310
+  Yoga:
311
+    :path: "../../node_modules/react-native/ReactCommon/yoga"
312
+
313
+SPEC CHECKSUMS:
314
+  boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c
315
+  DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2
316
+  FBLazyVector: aaeaf388755e4f29cd74acbc9e3b8da6d807c37f
317
+  FBReactNativeSpec: 118d0d177724c2d67f08a59136eb29ef5943ec75
318
+  Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51
319
+  glog: 1f3da668190260b06b429bb211bfbee5cd790c28
320
+  RCTRequired: b153add4da6e7dbc44aebf93f3cf4fcae392ddf1
321
+  RCTTypeSafety: 9aa1b91d7f9310fc6eadc3cf95126ffe818af320
322
+  React: b6a59ef847b2b40bb6e0180a97d0ca716969ac78
323
+  React-Core: 688b451f7d616cc1134ac95295b593d1b5158a04
324
+  React-CoreModules: d04f8494c1a328b69ec11db9d1137d667f916dcb
325
+  React-cxxreact: d0f7bcafa196ae410e5300736b424455e7fb7ba7
326
+  React-jsi: cb2cd74d7ccf4cffb071a46833613edc79cdf8f7
327
+  React-jsiexecutor: d5525f9ed5f782fdbacb64b9b01a43a9323d2386
328
+  React-jsinspector: fa0ecc501688c3c4c34f28834a76302233e29dc0
329
+  react-native-webview: 3f5aa91c3cb083ea4762e006b9653291a96a777a
330
+  React-RCTActionSheet: 600b4d10e3aea0913b5a92256d2719c0cdd26d76
331
+  React-RCTAnimation: 791a87558389c80908ed06cc5dfc5e7920dfa360
332
+  React-RCTBlob: d89293cc0236d9cb0933d85e430b0bbe81ad1d72
333
+  React-RCTImage: 6b8e8df449eb7c814c99a92d6b52de6fe39dea4e
334
+  React-RCTLinking: 121bb231c7503cf9094f4d8461b96a130fabf4a5
335
+  React-RCTNetwork: fb353640aafcee84ca8b78957297bd395f065c9a
336
+  React-RCTSettings: 8db258ea2a5efee381fcf7a6d5044e2f8b68b640
337
+  React-RCTText: 9ccc88273e9a3aacff5094d2175a605efa854dbe
338
+  React-RCTVibration: a49a1f42bf8f5acf1c3e297097517c6b3af377ad
339
+  ReactCommon: 198c7c8d3591f975e5431bec1b0b3b581aa1c5dd
340
+  Yoga: f2a7cd4280bfe2cca5a7aed98ba0eb3d1310f18b
341
+
342
+PODFILE CHECKSUM: 2b0bdb79b803eefe541da6f9be6b06e99063bbfd
343
+
344
+COCOAPODS: 1.8.4

+ 53
- 0
example/ios/example-tvOS/Info.plist View File

@@ -0,0 +1,53 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleExecutable</key>
8
+	<string>$(EXECUTABLE_NAME)</string>
9
+	<key>CFBundleIdentifier</key>
10
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11
+	<key>CFBundleInfoDictionaryVersion</key>
12
+	<string>6.0</string>
13
+	<key>CFBundleName</key>
14
+	<string>$(PRODUCT_NAME)</string>
15
+	<key>CFBundlePackageType</key>
16
+	<string>APPL</string>
17
+	<key>CFBundleShortVersionString</key>
18
+	<string>1.0</string>
19
+	<key>CFBundleSignature</key>
20
+	<string>????</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>1</string>
23
+	<key>LSRequiresIPhoneOS</key>
24
+	<true/>
25
+	<key>NSAppTransportSecurity</key>
26
+	<dict>
27
+		<key>NSExceptionDomains</key>
28
+		<dict>
29
+			<key>localhost</key>
30
+			<dict>
31
+				<key>NSExceptionAllowsInsecureHTTPLoads</key>
32
+				<true/>
33
+			</dict>
34
+		</dict>
35
+	</dict>
36
+	<key>NSLocationWhenInUseUsageDescription</key>
37
+	<string></string>
38
+	<key>UILaunchStoryboardName</key>
39
+	<string>LaunchScreen</string>
40
+	<key>UIRequiredDeviceCapabilities</key>
41
+	<array>
42
+		<string>armv7</string>
43
+	</array>
44
+	<key>UISupportedInterfaceOrientations</key>
45
+	<array>
46
+		<string>UIInterfaceOrientationPortrait</string>
47
+		<string>UIInterfaceOrientationLandscapeLeft</string>
48
+		<string>UIInterfaceOrientationLandscapeRight</string>
49
+	</array>
50
+	<key>UIViewControllerBasedStatusBarAppearance</key>
51
+	<false/>
52
+</dict>
53
+</plist>

+ 24
- 0
example/ios/example-tvOSTests/Info.plist View File

@@ -0,0 +1,24 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleExecutable</key>
8
+	<string>$(EXECUTABLE_NAME)</string>
9
+	<key>CFBundleIdentifier</key>
10
+	<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
11
+	<key>CFBundleInfoDictionaryVersion</key>
12
+	<string>6.0</string>
13
+	<key>CFBundleName</key>
14
+	<string>$(PRODUCT_NAME)</string>
15
+	<key>CFBundlePackageType</key>
16
+	<string>BNDL</string>
17
+	<key>CFBundleShortVersionString</key>
18
+	<string>1.0</string>
19
+	<key>CFBundleSignature</key>
20
+	<string>????</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>1</string>
23
+</dict>
24
+</plist>

+ 925
- 0
example/ios/example.xcodeproj/project.pbxproj View File

@@ -0,0 +1,925 @@
1
+// !$*UTF8*$!
2
+{
3
+	archiveVersion = 1;
4
+	classes = {
5
+	};
6
+	objectVersion = 46;
7
+	objects = {
8
+
9
+/* Begin PBXBuildFile section */
10
+		00E356F31AD99517003FC87E /* exampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* exampleTests.m */; };
11
+		13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
12
+		13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
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 /* exampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* exampleTests.m */; };
19
+		A08B6FFAAF3CA0F03003FEB0 /* libPods-example-tvOSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5544B310E076E06B9E2EFF4C /* libPods-example-tvOSTests.a */; };
20
+		C7D826CF866C25BE421302B6 /* libPods-example-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F9A8A9F158876EC099CFA57A /* libPods-example-tvOS.a */; };
21
+		D0E3313DFCE78BFCB650F812 /* libPods-exampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CB301596D47BBAD9E9C0A45A /* libPods-exampleTests.a */; };
22
+		E719A6E171791CD8906B3D55 /* libPods-example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 917A19FC1EBE6E8B85FE404D /* libPods-example.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 = example;
32
+		};
33
+		2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {
34
+			isa = PBXContainerItemProxy;
35
+			containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
36
+			proxyType = 1;
37
+			remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7;
38
+			remoteInfo = "example-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 = "<group>"; };
44
+		00E356EE1AD99517003FC87E /* exampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = exampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
45
+		00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
46
+		00E356F21AD99517003FC87E /* exampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = exampleTests.m; sourceTree = "<group>"; };
47
+		13B07F961A680F5B00A75B9A /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; };
48
+		13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = example/AppDelegate.h; sourceTree = "<group>"; };
49
+		13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = example/AppDelegate.m; sourceTree = "<group>"; };
50
+		13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
51
+		13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = example/Images.xcassets; sourceTree = "<group>"; };
52
+		13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = example/Info.plist; sourceTree = "<group>"; };
53
+		13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = example/main.m; sourceTree = "<group>"; };
54
+		2D02E47B1E0B4A5D006451C7 /* example-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
55
+		2D02E4901E0B4A5D006451C7 /* example-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "example-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
56
+		41B6A4553C4F552488B69B01 /* Pods-exampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-exampleTests.release.xcconfig"; path = "Target Support Files/Pods-exampleTests/Pods-exampleTests.release.xcconfig"; sourceTree = "<group>"; };
57
+		4372A2FD2D749DE5C9FD8D3E /* Pods-example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.debug.xcconfig"; path = "Target Support Files/Pods-example/Pods-example.debug.xcconfig"; sourceTree = "<group>"; };
58
+		4FDD34C422D711AC8A7B10A7 /* Pods-example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example.release.xcconfig"; path = "Target Support Files/Pods-example/Pods-example.release.xcconfig"; sourceTree = "<group>"; };
59
+		5544B310E076E06B9E2EFF4C /* libPods-example-tvOSTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example-tvOSTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
60
+		59A4F27CAD1B7EFE80917453 /* Pods-example-tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-tvOSTests.release.xcconfig"; path = "Target Support Files/Pods-example-tvOSTests/Pods-example-tvOSTests.release.xcconfig"; sourceTree = "<group>"; };
61
+		775F6B7492793F5DB7ECE95B /* Pods-example-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-tvOS.debug.xcconfig"; path = "Target Support Files/Pods-example-tvOS/Pods-example-tvOS.debug.xcconfig"; sourceTree = "<group>"; };
62
+		8A20011E75A0AD2EC5C6EAE9 /* Pods-exampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-exampleTests.debug.xcconfig"; path = "Target Support Files/Pods-exampleTests/Pods-exampleTests.debug.xcconfig"; sourceTree = "<group>"; };
63
+		917A19FC1EBE6E8B85FE404D /* libPods-example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example.a"; sourceTree = BUILT_PRODUCTS_DIR; };
64
+		CB301596D47BBAD9E9C0A45A /* libPods-exampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-exampleTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
65
+		ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
66
+		ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; };
67
+		EDF80BE96CF92848F4E926EA /* Pods-example-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-tvOS.release.xcconfig"; path = "Target Support Files/Pods-example-tvOS/Pods-example-tvOS.release.xcconfig"; sourceTree = "<group>"; };
68
+		F67BC8D73DE103BA10A5488D /* Pods-example-tvOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-example-tvOSTests.debug.xcconfig"; path = "Target Support Files/Pods-example-tvOSTests/Pods-example-tvOSTests.debug.xcconfig"; sourceTree = "<group>"; };
69
+		F9A8A9F158876EC099CFA57A /* libPods-example-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-example-tvOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
70
+/* End PBXFileReference section */
71
+
72
+/* Begin PBXFrameworksBuildPhase section */
73
+		00E356EB1AD99517003FC87E /* Frameworks */ = {
74
+			isa = PBXFrameworksBuildPhase;
75
+			buildActionMask = 2147483647;
76
+			files = (
77
+				D0E3313DFCE78BFCB650F812 /* libPods-exampleTests.a in Frameworks */,
78
+			);
79
+			runOnlyForDeploymentPostprocessing = 0;
80
+		};
81
+		13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
82
+			isa = PBXFrameworksBuildPhase;
83
+			buildActionMask = 2147483647;
84
+			files = (
85
+				E719A6E171791CD8906B3D55 /* libPods-example.a in Frameworks */,
86
+			);
87
+			runOnlyForDeploymentPostprocessing = 0;
88
+		};
89
+		2D02E4781E0B4A5D006451C7 /* Frameworks */ = {
90
+			isa = PBXFrameworksBuildPhase;
91
+			buildActionMask = 2147483647;
92
+			files = (
93
+				C7D826CF866C25BE421302B6 /* libPods-example-tvOS.a in Frameworks */,
94
+			);
95
+			runOnlyForDeploymentPostprocessing = 0;
96
+		};
97
+		2D02E48D1E0B4A5D006451C7 /* Frameworks */ = {
98
+			isa = PBXFrameworksBuildPhase;
99
+			buildActionMask = 2147483647;
100
+			files = (
101
+				A08B6FFAAF3CA0F03003FEB0 /* libPods-example-tvOSTests.a in Frameworks */,
102
+			);
103
+			runOnlyForDeploymentPostprocessing = 0;
104
+		};
105
+/* End PBXFrameworksBuildPhase section */
106
+
107
+/* Begin PBXGroup section */
108
+		00E356EF1AD99517003FC87E /* exampleTests */ = {
109
+			isa = PBXGroup;
110
+			children = (
111
+				00E356F21AD99517003FC87E /* exampleTests.m */,
112
+				00E356F01AD99517003FC87E /* Supporting Files */,
113
+			);
114
+			path = exampleTests;
115
+			sourceTree = "<group>";
116
+		};
117
+		00E356F01AD99517003FC87E /* Supporting Files */ = {
118
+			isa = PBXGroup;
119
+			children = (
120
+				00E356F11AD99517003FC87E /* Info.plist */,
121
+			);
122
+			name = "Supporting Files";
123
+			sourceTree = "<group>";
124
+		};
125
+		13B07FAE1A68108700A75B9A /* example */ = {
126
+			isa = PBXGroup;
127
+			children = (
128
+				008F07F21AC5B25A0029DE68 /* main.jsbundle */,
129
+				13B07FAF1A68108700A75B9A /* AppDelegate.h */,
130
+				13B07FB01A68108700A75B9A /* AppDelegate.m */,
131
+				13B07FB51A68108700A75B9A /* Images.xcassets */,
132
+				13B07FB61A68108700A75B9A /* Info.plist */,
133
+				13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
134
+				13B07FB71A68108700A75B9A /* main.m */,
135
+			);
136
+			name = example;
137
+			sourceTree = "<group>";
138
+		};
139
+		2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
140
+			isa = PBXGroup;
141
+			children = (
142
+				ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
143
+				ED2971642150620600B7C4FE /* JavaScriptCore.framework */,
144
+				917A19FC1EBE6E8B85FE404D /* libPods-example.a */,
145
+				F9A8A9F158876EC099CFA57A /* libPods-example-tvOS.a */,
146
+				5544B310E076E06B9E2EFF4C /* libPods-example-tvOSTests.a */,
147
+				CB301596D47BBAD9E9C0A45A /* libPods-exampleTests.a */,
148
+			);
149
+			name = Frameworks;
150
+			sourceTree = "<group>";
151
+		};
152
+		832341AE1AAA6A7D00B99B32 /* Libraries */ = {
153
+			isa = PBXGroup;
154
+			children = (
155
+			);
156
+			name = Libraries;
157
+			sourceTree = "<group>";
158
+		};
159
+		83CBB9F61A601CBA00E9B192 = {
160
+			isa = PBXGroup;
161
+			children = (
162
+				13B07FAE1A68108700A75B9A /* example */,
163
+				832341AE1AAA6A7D00B99B32 /* Libraries */,
164
+				00E356EF1AD99517003FC87E /* exampleTests */,
165
+				83CBBA001A601CBA00E9B192 /* Products */,
166
+				2D16E6871FA4F8E400B85C8A /* Frameworks */,
167
+				CCBCEDC2885B5181A2E42CE7 /* Pods */,
168
+			);
169
+			indentWidth = 2;
170
+			sourceTree = "<group>";
171
+			tabWidth = 2;
172
+			usesTabs = 0;
173
+		};
174
+		83CBBA001A601CBA00E9B192 /* Products */ = {
175
+			isa = PBXGroup;
176
+			children = (
177
+				13B07F961A680F5B00A75B9A /* example.app */,
178
+				00E356EE1AD99517003FC87E /* exampleTests.xctest */,
179
+				2D02E47B1E0B4A5D006451C7 /* example-tvOS.app */,
180
+				2D02E4901E0B4A5D006451C7 /* example-tvOSTests.xctest */,
181
+			);
182
+			name = Products;
183
+			sourceTree = "<group>";
184
+		};
185
+		CCBCEDC2885B5181A2E42CE7 /* Pods */ = {
186
+			isa = PBXGroup;
187
+			children = (
188
+				4372A2FD2D749DE5C9FD8D3E /* Pods-example.debug.xcconfig */,
189
+				4FDD34C422D711AC8A7B10A7 /* Pods-example.release.xcconfig */,
190
+				775F6B7492793F5DB7ECE95B /* Pods-example-tvOS.debug.xcconfig */,
191
+				EDF80BE96CF92848F4E926EA /* Pods-example-tvOS.release.xcconfig */,
192
+				F67BC8D73DE103BA10A5488D /* Pods-example-tvOSTests.debug.xcconfig */,
193
+				59A4F27CAD1B7EFE80917453 /* Pods-example-tvOSTests.release.xcconfig */,
194
+				8A20011E75A0AD2EC5C6EAE9 /* Pods-exampleTests.debug.xcconfig */,
195
+				41B6A4553C4F552488B69B01 /* Pods-exampleTests.release.xcconfig */,
196
+			);
197
+			path = Pods;
198
+			sourceTree = "<group>";
199
+		};
200
+/* End PBXGroup section */
201
+
202
+/* Begin PBXNativeTarget section */
203
+		00E356ED1AD99517003FC87E /* exampleTests */ = {
204
+			isa = PBXNativeTarget;
205
+			buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "exampleTests" */;
206
+			buildPhases = (
207
+				A2264F1CFC0047F3C8C5D43D /* [CP] Check Pods Manifest.lock */,
208
+				00E356EA1AD99517003FC87E /* Sources */,
209
+				00E356EB1AD99517003FC87E /* Frameworks */,
210
+				00E356EC1AD99517003FC87E /* Resources */,
211
+			);
212
+			buildRules = (
213
+			);
214
+			dependencies = (
215
+				00E356F51AD99517003FC87E /* PBXTargetDependency */,
216
+			);
217
+			name = exampleTests;
218
+			productName = exampleTests;
219
+			productReference = 00E356EE1AD99517003FC87E /* exampleTests.xctest */;
220
+			productType = "com.apple.product-type.bundle.unit-test";
221
+		};
222
+		13B07F861A680F5B00A75B9A /* example */ = {
223
+			isa = PBXNativeTarget;
224
+			buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */;
225
+			buildPhases = (
226
+				6D39E19069EEC1F18C65E89E /* [CP] Check Pods Manifest.lock */,
227
+				FD10A7F022414F080027D42C /* Start Packager */,
228
+				13B07F871A680F5B00A75B9A /* Sources */,
229
+				13B07F8C1A680F5B00A75B9A /* Frameworks */,
230
+				13B07F8E1A680F5B00A75B9A /* Resources */,
231
+				00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
232
+			);
233
+			buildRules = (
234
+			);
235
+			dependencies = (
236
+			);
237
+			name = example;
238
+			productName = example;
239
+			productReference = 13B07F961A680F5B00A75B9A /* example.app */;
240
+			productType = "com.apple.product-type.application";
241
+		};
242
+		2D02E47A1E0B4A5D006451C7 /* example-tvOS */ = {
243
+			isa = PBXNativeTarget;
244
+			buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "example-tvOS" */;
245
+			buildPhases = (
246
+				B980633124DB020AB7EC55E3 /* [CP] Check Pods Manifest.lock */,
247
+				FD10A7F122414F3F0027D42C /* Start Packager */,
248
+				2D02E4771E0B4A5D006451C7 /* Sources */,
249
+				2D02E4781E0B4A5D006451C7 /* Frameworks */,
250
+				2D02E4791E0B4A5D006451C7 /* Resources */,
251
+				2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */,
252
+			);
253
+			buildRules = (
254
+			);
255
+			dependencies = (
256
+			);
257
+			name = "example-tvOS";
258
+			productName = "example-tvOS";
259
+			productReference = 2D02E47B1E0B4A5D006451C7 /* example-tvOS.app */;
260
+			productType = "com.apple.product-type.application";
261
+		};
262
+		2D02E48F1E0B4A5D006451C7 /* example-tvOSTests */ = {
263
+			isa = PBXNativeTarget;
264
+			buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "example-tvOSTests" */;
265
+			buildPhases = (
266
+				56202D3091BCA37A2C594528 /* [CP] Check Pods Manifest.lock */,
267
+				2D02E48C1E0B4A5D006451C7 /* Sources */,
268
+				2D02E48D1E0B4A5D006451C7 /* Frameworks */,
269
+				2D02E48E1E0B4A5D006451C7 /* Resources */,
270
+			);
271
+			buildRules = (
272
+			);
273
+			dependencies = (
274
+				2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */,
275
+			);
276
+			name = "example-tvOSTests";
277
+			productName = "example-tvOSTests";
278
+			productReference = 2D02E4901E0B4A5D006451C7 /* example-tvOSTests.xctest */;
279
+			productType = "com.apple.product-type.bundle.unit-test";
280
+		};
281
+/* End PBXNativeTarget section */
282
+
283
+/* Begin PBXProject section */
284
+		83CBB9F71A601CBA00E9B192 /* Project object */ = {
285
+			isa = PBXProject;
286
+			attributes = {
287
+				LastUpgradeCheck = 0940;
288
+				ORGANIZATIONNAME = Facebook;
289
+				TargetAttributes = {
290
+					00E356ED1AD99517003FC87E = {
291
+						CreatedOnToolsVersion = 6.2;
292
+						TestTargetID = 13B07F861A680F5B00A75B9A;
293
+					};
294
+					2D02E47A1E0B4A5D006451C7 = {
295
+						CreatedOnToolsVersion = 8.2.1;
296
+						ProvisioningStyle = Automatic;
297
+					};
298
+					2D02E48F1E0B4A5D006451C7 = {
299
+						CreatedOnToolsVersion = 8.2.1;
300
+						ProvisioningStyle = Automatic;
301
+						TestTargetID = 2D02E47A1E0B4A5D006451C7;
302
+					};
303
+				};
304
+			};
305
+			buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "example" */;
306
+			compatibilityVersion = "Xcode 3.2";
307
+			developmentRegion = English;
308
+			hasScannedForEncodings = 0;
309
+			knownRegions = (
310
+				English,
311
+				en,
312
+				Base,
313
+			);
314
+			mainGroup = 83CBB9F61A601CBA00E9B192;
315
+			productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
316
+			projectDirPath = "";
317
+			projectRoot = "";
318
+			targets = (
319
+				13B07F861A680F5B00A75B9A /* example */,
320
+				00E356ED1AD99517003FC87E /* exampleTests */,
321
+				2D02E47A1E0B4A5D006451C7 /* example-tvOS */,
322
+				2D02E48F1E0B4A5D006451C7 /* example-tvOSTests */,
323
+			);
324
+		};
325
+/* End PBXProject section */
326
+
327
+/* Begin PBXResourcesBuildPhase section */
328
+		00E356EC1AD99517003FC87E /* Resources */ = {
329
+			isa = PBXResourcesBuildPhase;
330
+			buildActionMask = 2147483647;
331
+			files = (
332
+			);
333
+			runOnlyForDeploymentPostprocessing = 0;
334
+		};
335
+		13B07F8E1A680F5B00A75B9A /* Resources */ = {
336
+			isa = PBXResourcesBuildPhase;
337
+			buildActionMask = 2147483647;
338
+			files = (
339
+				13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
340
+				13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
341
+			);
342
+			runOnlyForDeploymentPostprocessing = 0;
343
+		};
344
+		2D02E4791E0B4A5D006451C7 /* Resources */ = {
345
+			isa = PBXResourcesBuildPhase;
346
+			buildActionMask = 2147483647;
347
+			files = (
348
+				2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */,
349
+			);
350
+			runOnlyForDeploymentPostprocessing = 0;
351
+		};
352
+		2D02E48E1E0B4A5D006451C7 /* Resources */ = {
353
+			isa = PBXResourcesBuildPhase;
354
+			buildActionMask = 2147483647;
355
+			files = (
356
+			);
357
+			runOnlyForDeploymentPostprocessing = 0;
358
+		};
359
+/* End PBXResourcesBuildPhase section */
360
+
361
+/* Begin PBXShellScriptBuildPhase section */
362
+		00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
363
+			isa = PBXShellScriptBuildPhase;
364
+			buildActionMask = 2147483647;
365
+			files = (
366
+			);
367
+			inputPaths = (
368
+			);
369
+			name = "Bundle React Native code and images";
370
+			outputPaths = (
371
+			);
372
+			runOnlyForDeploymentPostprocessing = 0;
373
+			shellPath = /bin/sh;
374
+			shellScript = "export NODE_BINARY=node\n../../node_modules/react-native/scripts/react-native-xcode.sh\n";
375
+		};
376
+		2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = {
377
+			isa = PBXShellScriptBuildPhase;
378
+			buildActionMask = 2147483647;
379
+			files = (
380
+			);
381
+			inputPaths = (
382
+			);
383
+			name = "Bundle React Native Code And Images";
384
+			outputPaths = (
385
+			);
386
+			runOnlyForDeploymentPostprocessing = 0;
387
+			shellPath = /bin/sh;
388
+			shellScript = "export NODE_BINARY=node\n../../node_modules/react-native/scripts/react-native-xcode.sh\n";
389
+		};
390
+		56202D3091BCA37A2C594528 /* [CP] Check Pods Manifest.lock */ = {
391
+			isa = PBXShellScriptBuildPhase;
392
+			buildActionMask = 2147483647;
393
+			files = (
394
+			);
395
+			inputFileListPaths = (
396
+			);
397
+			inputPaths = (
398
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
399
+				"${PODS_ROOT}/Manifest.lock",
400
+			);
401
+			name = "[CP] Check Pods Manifest.lock";
402
+			outputFileListPaths = (
403
+			);
404
+			outputPaths = (
405
+				"$(DERIVED_FILE_DIR)/Pods-example-tvOSTests-checkManifestLockResult.txt",
406
+			);
407
+			runOnlyForDeploymentPostprocessing = 0;
408
+			shellPath = /bin/sh;
409
+			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";
410
+			showEnvVarsInLog = 0;
411
+		};
412
+		6D39E19069EEC1F18C65E89E /* [CP] Check Pods Manifest.lock */ = {
413
+			isa = PBXShellScriptBuildPhase;
414
+			buildActionMask = 2147483647;
415
+			files = (
416
+			);
417
+			inputFileListPaths = (
418
+			);
419
+			inputPaths = (
420
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
421
+				"${PODS_ROOT}/Manifest.lock",
422
+			);
423
+			name = "[CP] Check Pods Manifest.lock";
424
+			outputFileListPaths = (
425
+			);
426
+			outputPaths = (
427
+				"$(DERIVED_FILE_DIR)/Pods-example-checkManifestLockResult.txt",
428
+			);
429
+			runOnlyForDeploymentPostprocessing = 0;
430
+			shellPath = /bin/sh;
431
+			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";
432
+			showEnvVarsInLog = 0;
433
+		};
434
+		A2264F1CFC0047F3C8C5D43D /* [CP] Check Pods Manifest.lock */ = {
435
+			isa = PBXShellScriptBuildPhase;
436
+			buildActionMask = 2147483647;
437
+			files = (
438
+			);
439
+			inputFileListPaths = (
440
+			);
441
+			inputPaths = (
442
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
443
+				"${PODS_ROOT}/Manifest.lock",
444
+			);
445
+			name = "[CP] Check Pods Manifest.lock";
446
+			outputFileListPaths = (
447
+			);
448
+			outputPaths = (
449
+				"$(DERIVED_FILE_DIR)/Pods-exampleTests-checkManifestLockResult.txt",
450
+			);
451
+			runOnlyForDeploymentPostprocessing = 0;
452
+			shellPath = /bin/sh;
453
+			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";
454
+			showEnvVarsInLog = 0;
455
+		};
456
+		B980633124DB020AB7EC55E3 /* [CP] Check Pods Manifest.lock */ = {
457
+			isa = PBXShellScriptBuildPhase;
458
+			buildActionMask = 2147483647;
459
+			files = (
460
+			);
461
+			inputFileListPaths = (
462
+			);
463
+			inputPaths = (
464
+				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
465
+				"${PODS_ROOT}/Manifest.lock",
466
+			);
467
+			name = "[CP] Check Pods Manifest.lock";
468
+			outputFileListPaths = (
469
+			);
470
+			outputPaths = (
471
+				"$(DERIVED_FILE_DIR)/Pods-example-tvOS-checkManifestLockResult.txt",
472
+			);
473
+			runOnlyForDeploymentPostprocessing = 0;
474
+			shellPath = /bin/sh;
475
+			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";
476
+			showEnvVarsInLog = 0;
477
+		};
478
+		FD10A7F022414F080027D42C /* Start Packager */ = {
479
+			isa = PBXShellScriptBuildPhase;
480
+			buildActionMask = 2147483647;
481
+			files = (
482
+			);
483
+			inputFileListPaths = (
484
+			);
485
+			inputPaths = (
486
+			);
487
+			name = "Start Packager";
488
+			outputFileListPaths = (
489
+			);
490
+			outputPaths = (
491
+			);
492
+			runOnlyForDeploymentPostprocessing = 0;
493
+			shellPath = /bin/sh;
494
+			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";
495
+			showEnvVarsInLog = 0;
496
+		};
497
+		FD10A7F122414F3F0027D42C /* Start Packager */ = {
498
+			isa = PBXShellScriptBuildPhase;
499
+			buildActionMask = 2147483647;
500
+			files = (
501
+			);
502
+			inputFileListPaths = (
503
+			);
504
+			inputPaths = (
505
+			);
506
+			name = "Start Packager";
507
+			outputFileListPaths = (
508
+			);
509
+			outputPaths = (
510
+			);
511
+			runOnlyForDeploymentPostprocessing = 0;
512
+			shellPath = /bin/sh;
513
+			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";
514
+			showEnvVarsInLog = 0;
515
+		};
516
+/* End PBXShellScriptBuildPhase section */
517
+
518
+/* Begin PBXSourcesBuildPhase section */
519
+		00E356EA1AD99517003FC87E /* Sources */ = {
520
+			isa = PBXSourcesBuildPhase;
521
+			buildActionMask = 2147483647;
522
+			files = (
523
+				00E356F31AD99517003FC87E /* exampleTests.m in Sources */,
524
+			);
525
+			runOnlyForDeploymentPostprocessing = 0;
526
+		};
527
+		13B07F871A680F5B00A75B9A /* Sources */ = {
528
+			isa = PBXSourcesBuildPhase;
529
+			buildActionMask = 2147483647;
530
+			files = (
531
+				13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
532
+				13B07FC11A68108700A75B9A /* main.m in Sources */,
533
+			);
534
+			runOnlyForDeploymentPostprocessing = 0;
535
+		};
536
+		2D02E4771E0B4A5D006451C7 /* Sources */ = {
537
+			isa = PBXSourcesBuildPhase;
538
+			buildActionMask = 2147483647;
539
+			files = (
540
+				2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */,
541
+				2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */,
542
+			);
543
+			runOnlyForDeploymentPostprocessing = 0;
544
+		};
545
+		2D02E48C1E0B4A5D006451C7 /* Sources */ = {
546
+			isa = PBXSourcesBuildPhase;
547
+			buildActionMask = 2147483647;
548
+			files = (
549
+				2DCD954D1E0B4F2C00145EB5 /* exampleTests.m in Sources */,
550
+			);
551
+			runOnlyForDeploymentPostprocessing = 0;
552
+		};
553
+/* End PBXSourcesBuildPhase section */
554
+
555
+/* Begin PBXTargetDependency section */
556
+		00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
557
+			isa = PBXTargetDependency;
558
+			target = 13B07F861A680F5B00A75B9A /* example */;
559
+			targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
560
+		};
561
+		2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = {
562
+			isa = PBXTargetDependency;
563
+			target = 2D02E47A1E0B4A5D006451C7 /* example-tvOS */;
564
+			targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */;
565
+		};
566
+/* End PBXTargetDependency section */
567
+
568
+/* Begin PBXVariantGroup section */
569
+		13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
570
+			isa = PBXVariantGroup;
571
+			children = (
572
+				13B07FB21A68108700A75B9A /* Base */,
573
+			);
574
+			name = LaunchScreen.xib;
575
+			path = example;
576
+			sourceTree = "<group>";
577
+		};
578
+/* End PBXVariantGroup section */
579
+
580
+/* Begin XCBuildConfiguration section */
581
+		00E356F61AD99517003FC87E /* Debug */ = {
582
+			isa = XCBuildConfiguration;
583
+			baseConfigurationReference = 8A20011E75A0AD2EC5C6EAE9 /* Pods-exampleTests.debug.xcconfig */;
584
+			buildSettings = {
585
+				BUNDLE_LOADER = "$(TEST_HOST)";
586
+				GCC_PREPROCESSOR_DEFINITIONS = (
587
+					"DEBUG=1",
588
+					"$(inherited)",
589
+				);
590
+				INFOPLIST_FILE = exampleTests/Info.plist;
591
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
592
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
593
+				OTHER_LDFLAGS = (
594
+					"-ObjC",
595
+					"-lc++",
596
+					"$(inherited)",
597
+				);
598
+				PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
599
+				PRODUCT_NAME = "$(TARGET_NAME)";
600
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/example";
601
+			};
602
+			name = Debug;
603
+		};
604
+		00E356F71AD99517003FC87E /* Release */ = {
605
+			isa = XCBuildConfiguration;
606
+			baseConfigurationReference = 41B6A4553C4F552488B69B01 /* Pods-exampleTests.release.xcconfig */;
607
+			buildSettings = {
608
+				BUNDLE_LOADER = "$(TEST_HOST)";
609
+				COPY_PHASE_STRIP = NO;
610
+				INFOPLIST_FILE = exampleTests/Info.plist;
611
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
612
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
613
+				OTHER_LDFLAGS = (
614
+					"-ObjC",
615
+					"-lc++",
616
+					"$(inherited)",
617
+				);
618
+				PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
619
+				PRODUCT_NAME = "$(TARGET_NAME)";
620
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/example";
621
+			};
622
+			name = Release;
623
+		};
624
+		13B07F941A680F5B00A75B9A /* Debug */ = {
625
+			isa = XCBuildConfiguration;
626
+			baseConfigurationReference = 4372A2FD2D749DE5C9FD8D3E /* Pods-example.debug.xcconfig */;
627
+			buildSettings = {
628
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
629
+				CURRENT_PROJECT_VERSION = 1;
630
+				DEAD_CODE_STRIPPING = NO;
631
+				INFOPLIST_FILE = example/Info.plist;
632
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
633
+				OTHER_LDFLAGS = (
634
+					"$(inherited)",
635
+					"-ObjC",
636
+					"-lc++",
637
+				);
638
+				PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
639
+				PRODUCT_NAME = example;
640
+				VERSIONING_SYSTEM = "apple-generic";
641
+			};
642
+			name = Debug;
643
+		};
644
+		13B07F951A680F5B00A75B9A /* Release */ = {
645
+			isa = XCBuildConfiguration;
646
+			baseConfigurationReference = 4FDD34C422D711AC8A7B10A7 /* Pods-example.release.xcconfig */;
647
+			buildSettings = {
648
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
649
+				CURRENT_PROJECT_VERSION = 1;
650
+				INFOPLIST_FILE = example/Info.plist;
651
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
652
+				OTHER_LDFLAGS = (
653
+					"$(inherited)",
654
+					"-ObjC",
655
+					"-lc++",
656
+				);
657
+				PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
658
+				PRODUCT_NAME = example;
659
+				VERSIONING_SYSTEM = "apple-generic";
660
+			};
661
+			name = Release;
662
+		};
663
+		2D02E4971E0B4A5E006451C7 /* Debug */ = {
664
+			isa = XCBuildConfiguration;
665
+			baseConfigurationReference = 775F6B7492793F5DB7ECE95B /* Pods-example-tvOS.debug.xcconfig */;
666
+			buildSettings = {
667
+				ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
668
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
669
+				CLANG_ANALYZER_NONNULL = YES;
670
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
671
+				CLANG_WARN_INFINITE_RECURSION = YES;
672
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
673
+				DEBUG_INFORMATION_FORMAT = dwarf;
674
+				ENABLE_TESTABILITY = YES;
675
+				GCC_NO_COMMON_BLOCKS = YES;
676
+				INFOPLIST_FILE = "example-tvOS/Info.plist";
677
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
678
+				OTHER_LDFLAGS = (
679
+					"$(inherited)",
680
+					"-ObjC",
681
+					"-lc++",
682
+				);
683
+				PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.example-tvOS";
684
+				PRODUCT_NAME = "$(TARGET_NAME)";
685
+				SDKROOT = appletvos;
686
+				TARGETED_DEVICE_FAMILY = 3;
687
+				TVOS_DEPLOYMENT_TARGET = 9.2;
688
+			};
689
+			name = Debug;
690
+		};
691
+		2D02E4981E0B4A5E006451C7 /* Release */ = {
692
+			isa = XCBuildConfiguration;
693
+			baseConfigurationReference = EDF80BE96CF92848F4E926EA /* Pods-example-tvOS.release.xcconfig */;
694
+			buildSettings = {
695
+				ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
696
+				ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
697
+				CLANG_ANALYZER_NONNULL = YES;
698
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
699
+				CLANG_WARN_INFINITE_RECURSION = YES;
700
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
701
+				COPY_PHASE_STRIP = NO;
702
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
703
+				GCC_NO_COMMON_BLOCKS = YES;
704
+				INFOPLIST_FILE = "example-tvOS/Info.plist";
705
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
706
+				OTHER_LDFLAGS = (
707
+					"$(inherited)",
708
+					"-ObjC",
709
+					"-lc++",
710
+				);
711
+				PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.example-tvOS";
712
+				PRODUCT_NAME = "$(TARGET_NAME)";
713
+				SDKROOT = appletvos;
714
+				TARGETED_DEVICE_FAMILY = 3;
715
+				TVOS_DEPLOYMENT_TARGET = 9.2;
716
+			};
717
+			name = Release;
718
+		};
719
+		2D02E4991E0B4A5E006451C7 /* Debug */ = {
720
+			isa = XCBuildConfiguration;
721
+			baseConfigurationReference = F67BC8D73DE103BA10A5488D /* Pods-example-tvOSTests.debug.xcconfig */;
722
+			buildSettings = {
723
+				BUNDLE_LOADER = "$(TEST_HOST)";
724
+				CLANG_ANALYZER_NONNULL = YES;
725
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
726
+				CLANG_WARN_INFINITE_RECURSION = YES;
727
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
728
+				DEBUG_INFORMATION_FORMAT = dwarf;
729
+				ENABLE_TESTABILITY = YES;
730
+				GCC_NO_COMMON_BLOCKS = YES;
731
+				INFOPLIST_FILE = "example-tvOSTests/Info.plist";
732
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
733
+				OTHER_LDFLAGS = (
734
+					"$(inherited)",
735
+					"-ObjC",
736
+					"-lc++",
737
+				);
738
+				PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.example-tvOSTests";
739
+				PRODUCT_NAME = "$(TARGET_NAME)";
740
+				SDKROOT = appletvos;
741
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example-tvOS.app/example-tvOS";
742
+				TVOS_DEPLOYMENT_TARGET = 10.1;
743
+			};
744
+			name = Debug;
745
+		};
746
+		2D02E49A1E0B4A5E006451C7 /* Release */ = {
747
+			isa = XCBuildConfiguration;
748
+			baseConfigurationReference = 59A4F27CAD1B7EFE80917453 /* Pods-example-tvOSTests.release.xcconfig */;
749
+			buildSettings = {
750
+				BUNDLE_LOADER = "$(TEST_HOST)";
751
+				CLANG_ANALYZER_NONNULL = YES;
752
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
753
+				CLANG_WARN_INFINITE_RECURSION = YES;
754
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
755
+				COPY_PHASE_STRIP = NO;
756
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
757
+				GCC_NO_COMMON_BLOCKS = YES;
758
+				INFOPLIST_FILE = "example-tvOSTests/Info.plist";
759
+				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
760
+				OTHER_LDFLAGS = (
761
+					"$(inherited)",
762
+					"-ObjC",
763
+					"-lc++",
764
+				);
765
+				PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.example-tvOSTests";
766
+				PRODUCT_NAME = "$(TARGET_NAME)";
767
+				SDKROOT = appletvos;
768
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example-tvOS.app/example-tvOS";
769
+				TVOS_DEPLOYMENT_TARGET = 10.1;
770
+			};
771
+			name = Release;
772
+		};
773
+		83CBBA201A601CBA00E9B192 /* Debug */ = {
774
+			isa = XCBuildConfiguration;
775
+			buildSettings = {
776
+				ALWAYS_SEARCH_USER_PATHS = NO;
777
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
778
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
779
+				CLANG_CXX_LIBRARY = "libc++";
780
+				CLANG_ENABLE_MODULES = YES;
781
+				CLANG_ENABLE_OBJC_ARC = YES;
782
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
783
+				CLANG_WARN_BOOL_CONVERSION = YES;
784
+				CLANG_WARN_COMMA = YES;
785
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
786
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
787
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
788
+				CLANG_WARN_EMPTY_BODY = YES;
789
+				CLANG_WARN_ENUM_CONVERSION = YES;
790
+				CLANG_WARN_INFINITE_RECURSION = YES;
791
+				CLANG_WARN_INT_CONVERSION = YES;
792
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
793
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
794
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
795
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
796
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
797
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
798
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
799
+				CLANG_WARN_UNREACHABLE_CODE = YES;
800
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
801
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
802
+				COPY_PHASE_STRIP = NO;
803
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
804
+				ENABLE_TESTABILITY = YES;
805
+				GCC_C_LANGUAGE_STANDARD = gnu99;
806
+				GCC_DYNAMIC_NO_PIC = NO;
807
+				GCC_NO_COMMON_BLOCKS = YES;
808
+				GCC_OPTIMIZATION_LEVEL = 0;
809
+				GCC_PREPROCESSOR_DEFINITIONS = (
810
+					"DEBUG=1",
811
+					"$(inherited)",
812
+				);
813
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
814
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
815
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
816
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
817
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
818
+				GCC_WARN_UNUSED_FUNCTION = YES;
819
+				GCC_WARN_UNUSED_VARIABLE = YES;
820
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
821
+				MTL_ENABLE_DEBUG_INFO = YES;
822
+				ONLY_ACTIVE_ARCH = YES;
823
+				SDKROOT = iphoneos;
824
+			};
825
+			name = Debug;
826
+		};
827
+		83CBBA211A601CBA00E9B192 /* Release */ = {
828
+			isa = XCBuildConfiguration;
829
+			buildSettings = {
830
+				ALWAYS_SEARCH_USER_PATHS = NO;
831
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
832
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
833
+				CLANG_CXX_LIBRARY = "libc++";
834
+				CLANG_ENABLE_MODULES = YES;
835
+				CLANG_ENABLE_OBJC_ARC = YES;
836
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
837
+				CLANG_WARN_BOOL_CONVERSION = YES;
838
+				CLANG_WARN_COMMA = YES;
839
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
840
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
841
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
842
+				CLANG_WARN_EMPTY_BODY = YES;
843
+				CLANG_WARN_ENUM_CONVERSION = YES;
844
+				CLANG_WARN_INFINITE_RECURSION = YES;
845
+				CLANG_WARN_INT_CONVERSION = YES;
846
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
847
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
848
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
849
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
850
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
851
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
852
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
853
+				CLANG_WARN_UNREACHABLE_CODE = YES;
854
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
855
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
856
+				COPY_PHASE_STRIP = YES;
857
+				ENABLE_NS_ASSERTIONS = NO;
858
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
859
+				GCC_C_LANGUAGE_STANDARD = gnu99;
860
+				GCC_NO_COMMON_BLOCKS = YES;
861
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
862
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
863
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
864
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
865
+				GCC_WARN_UNUSED_FUNCTION = YES;
866
+				GCC_WARN_UNUSED_VARIABLE = YES;
867
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
868
+				MTL_ENABLE_DEBUG_INFO = NO;
869
+				SDKROOT = iphoneos;
870
+				VALIDATE_PRODUCT = YES;
871
+			};
872
+			name = Release;
873
+		};
874
+/* End XCBuildConfiguration section */
875
+
876
+/* Begin XCConfigurationList section */
877
+		00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "exampleTests" */ = {
878
+			isa = XCConfigurationList;
879
+			buildConfigurations = (
880
+				00E356F61AD99517003FC87E /* Debug */,
881
+				00E356F71AD99517003FC87E /* Release */,
882
+			);
883
+			defaultConfigurationIsVisible = 0;
884
+			defaultConfigurationName = Release;
885
+		};
886
+		13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */ = {
887
+			isa = XCConfigurationList;
888
+			buildConfigurations = (
889
+				13B07F941A680F5B00A75B9A /* Debug */,
890
+				13B07F951A680F5B00A75B9A /* Release */,
891
+			);
892
+			defaultConfigurationIsVisible = 0;
893
+			defaultConfigurationName = Release;
894
+		};
895
+		2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "example-tvOS" */ = {
896
+			isa = XCConfigurationList;
897
+			buildConfigurations = (
898
+				2D02E4971E0B4A5E006451C7 /* Debug */,
899
+				2D02E4981E0B4A5E006451C7 /* Release */,
900
+			);
901
+			defaultConfigurationIsVisible = 0;
902
+			defaultConfigurationName = Release;
903
+		};
904
+		2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "example-tvOSTests" */ = {
905
+			isa = XCConfigurationList;
906
+			buildConfigurations = (
907
+				2D02E4991E0B4A5E006451C7 /* Debug */,
908
+				2D02E49A1E0B4A5E006451C7 /* Release */,
909
+			);
910
+			defaultConfigurationIsVisible = 0;
911
+			defaultConfigurationName = Release;
912
+		};
913
+		83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "example" */ = {
914
+			isa = XCConfigurationList;
915
+			buildConfigurations = (
916
+				83CBBA201A601CBA00E9B192 /* Debug */,
917
+				83CBBA211A601CBA00E9B192 /* Release */,
918
+			);
919
+			defaultConfigurationIsVisible = 0;
920
+			defaultConfigurationName = Release;
921
+		};
922
+/* End XCConfigurationList section */
923
+	};
924
+	rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
925
+}

+ 129
- 0
example/ios/example.xcodeproj/xcshareddata/xcschemes/example-tvOS.xcscheme View File

@@ -0,0 +1,129 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Scheme
3
+   LastUpgradeVersion = "0940"
4
+   version = "1.3">
5
+   <BuildAction
6
+      parallelizeBuildables = "NO"
7
+      buildImplicitDependencies = "YES">
8
+      <BuildActionEntries>
9
+         <BuildActionEntry
10
+            buildForTesting = "YES"
11
+            buildForRunning = "YES"
12
+            buildForProfiling = "YES"
13
+            buildForArchiving = "YES"
14
+            buildForAnalyzing = "YES">
15
+            <BuildableReference
16
+               BuildableIdentifier = "primary"
17
+               BlueprintIdentifier = "2D2A28121D9B038B00D4039D"
18
+               BuildableName = "libReact.a"
19
+               BlueprintName = "React-tvOS"
20
+               ReferencedContainer = "container:../node_modules/react-native/React/React.xcodeproj">
21
+            </BuildableReference>
22
+         </BuildActionEntry>
23
+         <BuildActionEntry
24
+            buildForTesting = "YES"
25
+            buildForRunning = "YES"
26
+            buildForProfiling = "YES"
27
+            buildForArchiving = "YES"
28
+            buildForAnalyzing = "YES">
29
+            <BuildableReference
30
+               BuildableIdentifier = "primary"
31
+               BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
32
+               BuildableName = "example-tvOS.app"
33
+               BlueprintName = "example-tvOS"
34
+               ReferencedContainer = "container:example.xcodeproj">
35
+            </BuildableReference>
36
+         </BuildActionEntry>
37
+         <BuildActionEntry
38
+            buildForTesting = "YES"
39
+            buildForRunning = "YES"
40
+            buildForProfiling = "NO"
41
+            buildForArchiving = "NO"
42
+            buildForAnalyzing = "YES">
43
+            <BuildableReference
44
+               BuildableIdentifier = "primary"
45
+               BlueprintIdentifier = "2D02E48F1E0B4A5D006451C7"
46
+               BuildableName = "example-tvOSTests.xctest"
47
+               BlueprintName = "example-tvOSTests"
48
+               ReferencedContainer = "container:example.xcodeproj">
49
+            </BuildableReference>
50
+         </BuildActionEntry>
51
+      </BuildActionEntries>
52
+   </BuildAction>
53
+   <TestAction
54
+      buildConfiguration = "Debug"
55
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
56
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
57
+      shouldUseLaunchSchemeArgsEnv = "YES">
58
+      <Testables>
59
+         <TestableReference
60
+            skipped = "NO">
61
+            <BuildableReference
62
+               BuildableIdentifier = "primary"
63
+               BlueprintIdentifier = "2D02E48F1E0B4A5D006451C7"
64
+               BuildableName = "example-tvOSTests.xctest"
65
+               BlueprintName = "example-tvOSTests"
66
+               ReferencedContainer = "container:example.xcodeproj">
67
+            </BuildableReference>
68
+         </TestableReference>
69
+      </Testables>
70
+      <MacroExpansion>
71
+         <BuildableReference
72
+            BuildableIdentifier = "primary"
73
+            BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
74
+            BuildableName = "example-tvOS.app"
75
+            BlueprintName = "example-tvOS"
76
+            ReferencedContainer = "container:example.xcodeproj">
77
+         </BuildableReference>
78
+      </MacroExpansion>
79
+      <AdditionalOptions>
80
+      </AdditionalOptions>
81
+   </TestAction>
82
+   <LaunchAction
83
+      buildConfiguration = "Debug"
84
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
85
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
86
+      launchStyle = "0"
87
+      useCustomWorkingDirectory = "NO"
88
+      ignoresPersistentStateOnLaunch = "NO"
89
+      debugDocumentVersioning = "YES"
90
+      debugServiceExtension = "internal"
91
+      allowLocationSimulation = "YES">
92
+      <BuildableProductRunnable
93
+         runnableDebuggingMode = "0">
94
+         <BuildableReference
95
+            BuildableIdentifier = "primary"
96
+            BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
97
+            BuildableName = "example-tvOS.app"
98
+            BlueprintName = "example-tvOS"
99
+            ReferencedContainer = "container:example.xcodeproj">
100
+         </BuildableReference>
101
+      </BuildableProductRunnable>
102
+      <AdditionalOptions>
103
+      </AdditionalOptions>
104
+   </LaunchAction>
105
+   <ProfileAction
106
+      buildConfiguration = "Release"
107
+      shouldUseLaunchSchemeArgsEnv = "YES"
108
+      savedToolIdentifier = ""
109
+      useCustomWorkingDirectory = "NO"
110
+      debugDocumentVersioning = "YES">
111
+      <BuildableProductRunnable
112
+         runnableDebuggingMode = "0">
113
+         <BuildableReference
114
+            BuildableIdentifier = "primary"
115
+            BlueprintIdentifier = "2D02E47A1E0B4A5D006451C7"
116
+            BuildableName = "example-tvOS.app"
117
+            BlueprintName = "example-tvOS"
118
+            ReferencedContainer = "container:example.xcodeproj">
119
+         </BuildableReference>
120
+      </BuildableProductRunnable>
121
+   </ProfileAction>
122
+   <AnalyzeAction
123
+      buildConfiguration = "Debug">
124
+   </AnalyzeAction>
125
+   <ArchiveAction
126
+      buildConfiguration = "Release"
127
+      revealArchiveInOrganizer = "YES">
128
+   </ArchiveAction>
129
+</Scheme>

+ 129
- 0
example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme View File

@@ -0,0 +1,129 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Scheme
3
+   LastUpgradeVersion = "0940"
4
+   version = "1.3">
5
+   <BuildAction
6
+      parallelizeBuildables = "NO"
7
+      buildImplicitDependencies = "YES">
8
+      <BuildActionEntries>
9
+         <BuildActionEntry
10
+            buildForTesting = "YES"
11
+            buildForRunning = "YES"
12
+            buildForProfiling = "YES"
13
+            buildForArchiving = "YES"
14
+            buildForAnalyzing = "YES">
15
+            <BuildableReference
16
+               BuildableIdentifier = "primary"
17
+               BlueprintIdentifier = "83CBBA2D1A601D0E00E9B192"
18
+               BuildableName = "libReact.a"
19
+               BlueprintName = "React"
20
+               ReferencedContainer = "container:../node_modules/react-native/React/React.xcodeproj">
21
+            </BuildableReference>
22
+         </BuildActionEntry>
23
+         <BuildActionEntry
24
+            buildForTesting = "YES"
25
+            buildForRunning = "YES"
26
+            buildForProfiling = "YES"
27
+            buildForArchiving = "YES"
28
+            buildForAnalyzing = "YES">
29
+            <BuildableReference
30
+               BuildableIdentifier = "primary"
31
+               BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
32
+               BuildableName = "example.app"
33
+               BlueprintName = "example"
34
+               ReferencedContainer = "container:example.xcodeproj">
35
+            </BuildableReference>
36
+         </BuildActionEntry>
37
+         <BuildActionEntry
38
+            buildForTesting = "YES"
39
+            buildForRunning = "YES"
40
+            buildForProfiling = "NO"
41
+            buildForArchiving = "NO"
42
+            buildForAnalyzing = "YES">
43
+            <BuildableReference
44
+               BuildableIdentifier = "primary"
45
+               BlueprintIdentifier = "00E356ED1AD99517003FC87E"
46
+               BuildableName = "exampleTests.xctest"
47
+               BlueprintName = "exampleTests"
48
+               ReferencedContainer = "container:example.xcodeproj">
49
+            </BuildableReference>
50
+         </BuildActionEntry>
51
+      </BuildActionEntries>
52
+   </BuildAction>
53
+   <TestAction
54
+      buildConfiguration = "Debug"
55
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
56
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
57
+      shouldUseLaunchSchemeArgsEnv = "YES">
58
+      <Testables>
59
+         <TestableReference
60
+            skipped = "NO">
61
+            <BuildableReference
62
+               BuildableIdentifier = "primary"
63
+               BlueprintIdentifier = "00E356ED1AD99517003FC87E"
64
+               BuildableName = "exampleTests.xctest"
65
+               BlueprintName = "exampleTests"
66
+               ReferencedContainer = "container:example.xcodeproj">
67
+            </BuildableReference>
68
+         </TestableReference>
69
+      </Testables>
70
+      <MacroExpansion>
71
+         <BuildableReference
72
+            BuildableIdentifier = "primary"
73
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
74
+            BuildableName = "example.app"
75
+            BlueprintName = "example"
76
+            ReferencedContainer = "container:example.xcodeproj">
77
+         </BuildableReference>
78
+      </MacroExpansion>
79
+      <AdditionalOptions>
80
+      </AdditionalOptions>
81
+   </TestAction>
82
+   <LaunchAction
83
+      buildConfiguration = "Debug"
84
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
85
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
86
+      launchStyle = "0"
87
+      useCustomWorkingDirectory = "NO"
88
+      ignoresPersistentStateOnLaunch = "NO"
89
+      debugDocumentVersioning = "YES"
90
+      debugServiceExtension = "internal"
91
+      allowLocationSimulation = "YES">
92
+      <BuildableProductRunnable
93
+         runnableDebuggingMode = "0">
94
+         <BuildableReference
95
+            BuildableIdentifier = "primary"
96
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
97
+            BuildableName = "example.app"
98
+            BlueprintName = "example"
99
+            ReferencedContainer = "container:example.xcodeproj">
100
+         </BuildableReference>
101
+      </BuildableProductRunnable>
102
+      <AdditionalOptions>
103
+      </AdditionalOptions>
104
+   </LaunchAction>
105
+   <ProfileAction
106
+      buildConfiguration = "Release"
107
+      shouldUseLaunchSchemeArgsEnv = "YES"
108
+      savedToolIdentifier = ""
109
+      useCustomWorkingDirectory = "NO"
110
+      debugDocumentVersioning = "YES">
111
+      <BuildableProductRunnable
112
+         runnableDebuggingMode = "0">
113
+         <BuildableReference
114
+            BuildableIdentifier = "primary"
115
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
116
+            BuildableName = "example.app"
117
+            BlueprintName = "example"
118
+            ReferencedContainer = "container:example.xcodeproj">
119
+         </BuildableReference>
120
+      </BuildableProductRunnable>
121
+   </ProfileAction>
122
+   <AnalyzeAction
123
+      buildConfiguration = "Debug">
124
+   </AnalyzeAction>
125
+   <ArchiveAction
126
+      buildConfiguration = "Release"
127
+      revealArchiveInOrganizer = "YES">
128
+   </ArchiveAction>
129
+</Scheme>

+ 10
- 0
example/ios/example.xcworkspace/contents.xcworkspacedata View File

@@ -0,0 +1,10 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Workspace
3
+   version = "1.0">
4
+   <FileRef
5
+      location = "group:example.xcodeproj">
6
+   </FileRef>
7
+   <FileRef
8
+      location = "group:Pods/Pods.xcodeproj">
9
+   </FileRef>
10
+</Workspace>

+ 8
- 0
example/ios/example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist View File

@@ -0,0 +1,8 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>IDEDidComputeMac32BitWarning</key>
6
+	<true/>
7
+</dict>
8
+</plist>

+ 15
- 0
example/ios/example/AppDelegate.h View File

@@ -0,0 +1,15 @@
1
+/**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+#import <React/RCTBridgeDelegate.h>
9
+#import <UIKit/UIKit.h>
10
+
11
+@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>
12
+
13
+@property (nonatomic, strong) UIWindow *window;
14
+
15
+@end

+ 42
- 0
example/ios/example/AppDelegate.m View File

@@ -0,0 +1,42 @@
1
+/**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+#import "AppDelegate.h"
9
+
10
+#import <React/RCTBridge.h>
11
+#import <React/RCTBundleURLProvider.h>
12
+#import <React/RCTRootView.h>
13
+
14
+@implementation AppDelegate
15
+
16
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
17
+{
18
+  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
19
+  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
20
+                                                   moduleName:@"example"
21
+                                            initialProperties:nil];
22
+
23
+  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];
24
+
25
+  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
26
+  UIViewController *rootViewController = [UIViewController new];
27
+  rootViewController.view = rootView;
28
+  self.window.rootViewController = rootViewController;
29
+  [self.window makeKeyAndVisible];
30
+  return YES;
31
+}
32
+
33
+- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
34
+{
35
+#if DEBUG
36
+  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"example/index" fallbackResource:nil];
37
+#else
38
+  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
39
+#endif
40
+}
41
+
42
+@end

+ 42
- 0
example/ios/example/Base.lproj/LaunchScreen.xib View File

@@ -0,0 +1,42 @@
1
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
3
+    <dependencies>
4
+        <deployment identifier="iOS"/>
5
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
6
+        <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
7
+    </dependencies>
8
+    <objects>
9
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
10
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
11
+        <view contentMode="scaleToFill" id="iN0-l3-epB">
12
+            <rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
13
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
14
+            <subviews>
15
+                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
16
+                    <rect key="frame" x="20" y="439" width="441" height="21"/>
17
+                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
18
+                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
19
+                    <nil key="highlightedColor"/>
20
+                </label>
21
+                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="example" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
22
+                    <rect key="frame" x="20" y="140" width="441" height="43"/>
23
+                    <fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
24
+                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
25
+                    <nil key="highlightedColor"/>
26
+                </label>
27
+            </subviews>
28
+            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
29
+            <constraints>
30
+                <constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
31
+                <constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
32
+                <constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
33
+                <constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
34
+                <constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
35
+                <constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
36
+            </constraints>
37
+            <nil key="simulatedStatusBarMetrics"/>
38
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
39
+            <point key="canvasLocation" x="548" y="455"/>
40
+        </view>
41
+    </objects>
42
+</document>

+ 38
- 0
example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json View File

@@ -0,0 +1,38 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "idiom" : "iphone",
5
+      "size" : "29x29",
6
+      "scale" : "2x"
7
+    },
8
+    {
9
+      "idiom" : "iphone",
10
+      "size" : "29x29",
11
+      "scale" : "3x"
12
+    },
13
+    {
14
+      "idiom" : "iphone",
15
+      "size" : "40x40",
16
+      "scale" : "2x"
17
+    },
18
+    {
19
+      "idiom" : "iphone",
20
+      "size" : "40x40",
21
+      "scale" : "3x"
22
+    },
23
+    {
24
+      "idiom" : "iphone",
25
+      "size" : "60x60",
26
+      "scale" : "2x"
27
+    },
28
+    {
29
+      "idiom" : "iphone",
30
+      "size" : "60x60",
31
+      "scale" : "3x"
32
+    }
33
+  ],
34
+  "info" : {
35
+    "version" : 1,
36
+    "author" : "xcode"
37
+  }
38
+}

+ 6
- 0
example/ios/example/Images.xcassets/Contents.json View File

@@ -0,0 +1,6 @@
1
+{
2
+  "info" : {
3
+    "version" : 1,
4
+    "author" : "xcode"
5
+  }
6
+}

+ 57
- 0
example/ios/example/Info.plist View File

@@ -0,0 +1,57 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleDisplayName</key>
8
+	<string>example</string>
9
+	<key>CFBundleExecutable</key>
10
+	<string>$(EXECUTABLE_NAME)</string>
11
+	<key>CFBundleIdentifier</key>
12
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
13
+	<key>CFBundleInfoDictionaryVersion</key>
14
+	<string>6.0</string>
15
+	<key>CFBundleName</key>
16
+	<string>$(PRODUCT_NAME)</string>
17
+	<key>CFBundlePackageType</key>
18
+	<string>APPL</string>
19
+	<key>CFBundleShortVersionString</key>
20
+	<string>1.0</string>
21
+	<key>CFBundleSignature</key>
22
+	<string>????</string>
23
+	<key>CFBundleVersion</key>
24
+	<string>1</string>
25
+	<key>LSRequiresIPhoneOS</key>
26
+	<true/>
27
+	<key>NSAppTransportSecurity</key>
28
+	<dict>
29
+		<key>NSAllowsArbitraryLoads</key>
30
+		<true/>
31
+		<key>NSExceptionDomains</key>
32
+		<dict>
33
+			<key>localhost</key>
34
+			<dict>
35
+				<key>NSExceptionAllowsInsecureHTTPLoads</key>
36
+				<true/>
37
+			</dict>
38
+		</dict>
39
+	</dict>
40
+	<key>NSLocationWhenInUseUsageDescription</key>
41
+	<string></string>
42
+	<key>UILaunchStoryboardName</key>
43
+	<string>LaunchScreen</string>
44
+	<key>UIRequiredDeviceCapabilities</key>
45
+	<array>
46
+		<string>armv7</string>
47
+	</array>
48
+	<key>UISupportedInterfaceOrientations</key>
49
+	<array>
50
+		<string>UIInterfaceOrientationPortrait</string>
51
+		<string>UIInterfaceOrientationLandscapeLeft</string>
52
+		<string>UIInterfaceOrientationLandscapeRight</string>
53
+	</array>
54
+	<key>UIViewControllerBasedStatusBarAppearance</key>
55
+	<false/>
56
+</dict>
57
+</plist>

+ 16
- 0
example/ios/example/main.m View File

@@ -0,0 +1,16 @@
1
+/**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+#import <UIKit/UIKit.h>
9
+
10
+#import "AppDelegate.h"
11
+
12
+int main(int argc, char * argv[]) {
13
+  @autoreleasepool {
14
+    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
15
+  }
16
+}

+ 24
- 0
example/ios/exampleTests/Info.plist View File

@@ -0,0 +1,24 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>en</string>
7
+	<key>CFBundleExecutable</key>
8
+	<string>$(EXECUTABLE_NAME)</string>
9
+	<key>CFBundleIdentifier</key>
10
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
11
+	<key>CFBundleInfoDictionaryVersion</key>
12
+	<string>6.0</string>
13
+	<key>CFBundleName</key>
14
+	<string>$(PRODUCT_NAME)</string>
15
+	<key>CFBundlePackageType</key>
16
+	<string>BNDL</string>
17
+	<key>CFBundleShortVersionString</key>
18
+	<string>1.0</string>
19
+	<key>CFBundleSignature</key>
20
+	<string>????</string>
21
+	<key>CFBundleVersion</key>
22
+	<string>1</string>
23
+</dict>
24
+</plist>

+ 72
- 0
example/ios/exampleTests/exampleTests.m View File

@@ -0,0 +1,72 @@
1
+/**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+#import <UIKit/UIKit.h>
9
+#import <XCTest/XCTest.h>
10
+
11
+#import <React/RCTLog.h>
12
+#import <React/RCTRootView.h>
13
+
14
+#define TIMEOUT_SECONDS 600
15
+#define TEXT_TO_LOOK_FOR @"Welcome to React"
16
+
17
+@interface exampleTests : XCTestCase
18
+
19
+@end
20
+
21
+@implementation exampleTests
22
+
23
+- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test
24
+{
25
+  if (test(view)) {
26
+    return YES;
27
+  }
28
+  for (UIView *subview in [view subviews]) {
29
+    if ([self findSubviewInView:subview matching:test]) {
30
+      return YES;
31
+    }
32
+  }
33
+  return NO;
34
+}
35
+
36
+- (void)testRendersWelcomeScreen
37
+{
38
+  UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController];
39
+  NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];
40
+  BOOL foundElement = NO;
41
+
42
+  __block NSString *redboxError = nil;
43
+#ifdef DEBUG
44
+  RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) {
45
+    if (level >= RCTLogLevelError) {
46
+      redboxError = message;
47
+    }
48
+  });
49
+#endif
50
+
51
+  while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {
52
+    [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
53
+    [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
54
+
55
+    foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {
56
+      if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {
57
+        return YES;
58
+      }
59
+      return NO;
60
+    }];
61
+  }
62
+  
63
+#ifdef DEBUG
64
+  RCTSetLogFunction(RCTDefaultLogFunction);
65
+#endif
66
+
67
+  XCTAssertNil(redboxError, @"RedBox error: %@", redboxError);
68
+  XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);
69
+}
70
+
71
+
72
+@end

+ 17
- 0
example/metro.config.js View File

@@ -0,0 +1,17 @@
1
+/**
2
+ * Metro configuration for React Native
3
+ * https://github.com/facebook/react-native
4
+ *
5
+ * @format
6
+ */
7
+
8
+module.exports = {
9
+  transformer: {
10
+    getTransformOptions: async () => ({
11
+      transform: {
12
+        experimentalImportSupport: false,
13
+        inlineRequires: false,
14
+      },
15
+    }),
16
+  },
17
+};

+ 62
- 0
example/tsconfig.json View File

@@ -0,0 +1,62 @@
1
+ 
2
+{
3
+  "compilerOptions": {
4
+    /* Basic Options */
5
+    "target": "esnext",                       /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
6
+    "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
7
+    "lib": ["es6"],                           /* Specify library files to be included in the compilation. */
8
+    "allowJs": true,                          /* Allow javascript files to be compiled. */
9
+    // "checkJs": true,                       /* Report errors in .js files. */
10
+    "jsx": "react-native",                    /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
11
+    // "declaration": true,                   /* Generates corresponding '.d.ts' file. */
12
+    // "sourceMap": true,                     /* Generates corresponding '.map' file. */
13
+    // "outFile": "./",                       /* Concatenate and emit output to single file. */
14
+    // "outDir": "./",                        /* Redirect output structure to the directory. */
15
+    // "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
16
+    // "removeComments": true,                /* Do not emit comments to output. */
17
+    "noEmit": true,                           /* Do not emit outputs. */
18
+    "incremental": true,                      /* Enable incremental compilation */
19
+    // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */
20
+    // "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
21
+    "isolatedModules": true,                  /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
22
+
23
+    /* Strict Type-Checking Options */
24
+    "strict": true,                           /* Enable all strict type-checking options. */
25
+    // "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */
26
+    // "strictNullChecks": true,              /* Enable strict null checks. */
27
+    // "strictFunctionTypes": true,           /* Enable strict checking of function types. */
28
+    // "strictPropertyInitialization": true,  /* Enable strict checking of property initialization in classes. */
29
+    // "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */
30
+    // "alwaysStrict": true,                  /* Parse in strict mode and emit "use strict" for each source file. */
31
+
32
+    /* Additional Checks */
33
+    // "noUnusedLocals": true,                /* Report errors on unused locals. */
34
+    // "noUnusedParameters": true,            /* Report errors on unused parameters. */
35
+    // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */
36
+    // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */
37
+
38
+    /* Module Resolution Options */
39
+    "moduleResolution": "node",               /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
40
+    "baseUrl": "./",                          /* Base directory to resolve non-absolute module names. */
41
+    // "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
42
+    // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
43
+    // "typeRoots": [],                       /* List of folders to include type definitions from. */
44
+    // "types": [],                           /* Type declaration files to be included in compilation. */
45
+    "allowSyntheticDefaultImports": true,     /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
46
+    "esModuleInterop": true                   /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
47
+    // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
48
+
49
+    /* Source Map Options */
50
+    // "sourceRoot": "./",                    /* Specify the location where debugger should locate TypeScript files instead of source locations. */
51
+    // "mapRoot": "./",                       /* Specify the location where debugger should locate map files instead of generated locations. */
52
+    // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
53
+    // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
54
+
55
+    /* Experimental Options */
56
+    // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
57
+    // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */
58
+  },
59
+  "exclude": [
60
+    "node_modules", "babel.config.js", "metro.config.js", "jest.config.js"
61
+  ]
62
+}

+ 138
- 132
ios/RNCWebView.m View File

@@ -134,157 +134,163 @@ static NSDictionary* customCertificatesForHost;
134 134
   return nil;
135 135
 }
136 136
 
137
-- (void)didMoveToWindow
137
+- (WKWebViewConfiguration *)setUpWkWebViewConfig
138 138
 {
139
-  if (self.window != nil && _webView == nil) {
140
-    WKWebViewConfiguration *wkWebViewConfig = [WKWebViewConfiguration new];
141
-    WKPreferences *prefs = [[WKPreferences alloc]init];
142
-    BOOL _prefsUsed = NO;
143
-    if (!_javaScriptEnabled) {
144
-      prefs.javaScriptEnabled = NO;
145
-      _prefsUsed = YES;
146
-    }
147
-    if (_allowFileAccessFromFileURLs) {
148
-      [prefs setValue:@TRUE forKey:@"allowFileAccessFromFileURLs"];
149
-      _prefsUsed = YES;
150
-    }
151
-    if (_prefsUsed) {
152
-      wkWebViewConfig.preferences = prefs;
153
-    }
154
-    if (_incognito) {
155
-      wkWebViewConfig.websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
156
-    } else if (_cacheEnabled) {
157
-      wkWebViewConfig.websiteDataStore = [WKWebsiteDataStore defaultDataStore];
158
-    }
159
-    if(self.useSharedProcessPool) {
160
-      wkWebViewConfig.processPool = [[RNCWKProcessPoolManager sharedManager] sharedProcessPool];
161
-    }
162
-    wkWebViewConfig.userContentController = [WKUserContentController new];
139
+  WKWebViewConfiguration *wkWebViewConfig = [WKWebViewConfiguration new];
140
+  WKPreferences *prefs = [[WKPreferences alloc]init];
141
+  BOOL _prefsUsed = NO;
142
+  if (!_javaScriptEnabled) {
143
+    prefs.javaScriptEnabled = NO;
144
+    _prefsUsed = YES;
145
+  }
146
+  if (_allowFileAccessFromFileURLs) {
147
+    [prefs setValue:@TRUE forKey:@"allowFileAccessFromFileURLs"];
148
+    _prefsUsed = YES;
149
+  }
150
+  if (_prefsUsed) {
151
+    wkWebViewConfig.preferences = prefs;
152
+  }
153
+  if (_incognito) {
154
+    wkWebViewConfig.websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
155
+  } else if (_cacheEnabled) {
156
+    wkWebViewConfig.websiteDataStore = [WKWebsiteDataStore defaultDataStore];
157
+  }
158
+  if(self.useSharedProcessPool) {
159
+    wkWebViewConfig.processPool = [[RNCWKProcessPoolManager sharedManager] sharedProcessPool];
160
+  }
161
+  wkWebViewConfig.userContentController = [WKUserContentController new];
162
+
163
+  // Shim the HTML5 history API:
164
+  [wkWebViewConfig.userContentController addScriptMessageHandler:[[RNCWeakScriptMessageDelegate alloc] initWithDelegate:self]
165
+                                                            name:HistoryShimName];
166
+  NSString *source = [NSString stringWithFormat:
167
+    @"(function(history) {\n"
168
+    "  function notify(type) {\n"
169
+    "    setTimeout(function() {\n"
170
+    "      window.webkit.messageHandlers.%@.postMessage(type)\n"
171
+    "    }, 0)\n"
172
+    "  }\n"
173
+    "  function shim(f) {\n"
174
+    "    return function pushState() {\n"
175
+    "      notify('other')\n"
176
+    "      return f.apply(history, arguments)\n"
177
+    "    }\n"
178
+    "  }\n"
179
+    "  history.pushState = shim(history.pushState)\n"
180
+    "  history.replaceState = shim(history.replaceState)\n"
181
+    "  window.addEventListener('popstate', function() {\n"
182
+    "    notify('backforward')\n"
183
+    "  })\n"
184
+    "})(window.history)\n", HistoryShimName
185
+  ];
186
+  WKUserScript *script = [[WKUserScript alloc] initWithSource:source injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
187
+  [wkWebViewConfig.userContentController addUserScript:script];
163 188
 
164
-    // Shim the HTML5 history API:
189
+  if (_messagingEnabled) {
165 190
     [wkWebViewConfig.userContentController addScriptMessageHandler:[[RNCWeakScriptMessageDelegate alloc] initWithDelegate:self]
166
-                                                              name:HistoryShimName];
191
+                                                              name:MessageHandlerName];
192
+
167 193
     NSString *source = [NSString stringWithFormat:
168
-      @"(function(history) {\n"
169
-      "  function notify(type) {\n"
170
-      "    setTimeout(function() {\n"
171
-      "      window.webkit.messageHandlers.%@.postMessage(type)\n"
172
-      "    }, 0)\n"
173
-      "  }\n"
174
-      "  function shim(f) {\n"
175
-      "    return function pushState() {\n"
176
-      "      notify('other')\n"
177
-      "      return f.apply(history, arguments)\n"
178
-      "    }\n"
179
-      "  }\n"
180
-      "  history.pushState = shim(history.pushState)\n"
181
-      "  history.replaceState = shim(history.replaceState)\n"
182
-      "  window.addEventListener('popstate', function() {\n"
183
-      "    notify('backforward')\n"
184
-      "  })\n"
185
-      "})(window.history)\n", HistoryShimName
194
+      @"window.%@ = {"
195
+       "  postMessage: function (data) {"
196
+       "    window.webkit.messageHandlers.%@.postMessage(String(data));"
197
+       "  }"
198
+       "};", MessageHandlerName, MessageHandlerName
186 199
     ];
200
+
187 201
     WKUserScript *script = [[WKUserScript alloc] initWithSource:source injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
188 202
     [wkWebViewConfig.userContentController addUserScript:script];
189
-
190
-    if (_messagingEnabled) {
191
-      [wkWebViewConfig.userContentController addScriptMessageHandler:[[RNCWeakScriptMessageDelegate alloc] initWithDelegate:self]
192
-                                                                name:MessageHandlerName];
193
-
194
-      NSString *source = [NSString stringWithFormat:
195
-        @"window.%@ = {"
196
-         "  postMessage: function (data) {"
197
-         "    window.webkit.messageHandlers.%@.postMessage(String(data));"
198
-         "  }"
199
-         "};", MessageHandlerName, MessageHandlerName
200
-      ];
201
-
202
-      WKUserScript *script = [[WKUserScript alloc] initWithSource:source injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
203
-      [wkWebViewConfig.userContentController addUserScript:script];
204
-        
205
-      if (_injectedJavaScriptBeforeContentLoaded) {
206
-        // If user has provided an injectedJavascript prop, execute it at the start of the document
207
-        WKUserScript *injectedScript = [[WKUserScript alloc] initWithSource:_injectedJavaScriptBeforeContentLoaded injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
208
-        [wkWebViewConfig.userContentController addUserScript:injectedScript];
209
-      }
203
+      
204
+    if (_injectedJavaScriptBeforeContentLoaded) {
205
+      // If user has provided an injectedJavascript prop, execute it at the start of the document
206
+      WKUserScript *injectedScript = [[WKUserScript alloc] initWithSource:_injectedJavaScriptBeforeContentLoaded injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
207
+      [wkWebViewConfig.userContentController addUserScript:injectedScript];
210 208
     }
209
+  }
211 210
 
212
-    wkWebViewConfig.allowsInlineMediaPlayback = _allowsInlineMediaPlayback;
211
+  wkWebViewConfig.allowsInlineMediaPlayback = _allowsInlineMediaPlayback;
213 212
 #if WEBKIT_IOS_10_APIS_AVAILABLE
214
-    wkWebViewConfig.mediaTypesRequiringUserActionForPlayback = _mediaPlaybackRequiresUserAction
215
-      ? WKAudiovisualMediaTypeAll
216
-      : WKAudiovisualMediaTypeNone;
217
-    wkWebViewConfig.dataDetectorTypes = _dataDetectorTypes;
213
+  wkWebViewConfig.mediaTypesRequiringUserActionForPlayback = _mediaPlaybackRequiresUserAction
214
+    ? WKAudiovisualMediaTypeAll
215
+    : WKAudiovisualMediaTypeNone;
216
+  wkWebViewConfig.dataDetectorTypes = _dataDetectorTypes;
218 217
 #else
219
-    wkWebViewConfig.mediaPlaybackRequiresUserAction = _mediaPlaybackRequiresUserAction;
218
+  wkWebViewConfig.mediaPlaybackRequiresUserAction = _mediaPlaybackRequiresUserAction;
220 219
 #endif
221 220
 
222
-    if (_applicationNameForUserAgent) {
223
-        wkWebViewConfig.applicationNameForUserAgent = [NSString stringWithFormat:@"%@ %@", wkWebViewConfig.applicationNameForUserAgent, _applicationNameForUserAgent];
224
-    }
221
+  if (_applicationNameForUserAgent) {
222
+      wkWebViewConfig.applicationNameForUserAgent = [NSString stringWithFormat:@"%@ %@", wkWebViewConfig.applicationNameForUserAgent, _applicationNameForUserAgent];
223
+  }
225 224
 
226
-    if(_sharedCookiesEnabled) {
227
-      // More info to sending cookies with WKWebView
228
-      // https://stackoverflow.com/questions/26573137/can-i-set-the-cookies-to-be-used-by-a-wkwebview/26577303#26577303
229
-      if (@available(iOS 11.0, *)) {
230
-        // Set Cookies in iOS 11 and above, initialize websiteDataStore before setting cookies
231
-        // See also https://forums.developer.apple.com/thread/97194
232
-        // check if websiteDataStore has not been initialized before
233
-        if(!_incognito && !_cacheEnabled) {
234
-          wkWebViewConfig.websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
235
-        }
236
-        for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
237
-          [wkWebViewConfig.websiteDataStore.httpCookieStore setCookie:cookie completionHandler:nil];
225
+  if(_sharedCookiesEnabled) {
226
+    // More info to sending cookies with WKWebView
227
+    // https://stackoverflow.com/questions/26573137/can-i-set-the-cookies-to-be-used-by-a-wkwebview/26577303#26577303
228
+    if (@available(iOS 11.0, *)) {
229
+      // Set Cookies in iOS 11 and above, initialize websiteDataStore before setting cookies
230
+      // See also https://forums.developer.apple.com/thread/97194
231
+      // check if websiteDataStore has not been initialized before
232
+      if(!_incognito && !_cacheEnabled) {
233
+        wkWebViewConfig.websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
234
+      }
235
+      for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
236
+        [wkWebViewConfig.websiteDataStore.httpCookieStore setCookie:cookie completionHandler:nil];
237
+      }
238
+    } else {
239
+      NSMutableString *script = [NSMutableString string];
240
+
241
+      // Clear all existing cookies in a direct called function. This ensures that no
242
+      // javascript error will break the web content javascript.
243
+      // We keep this code here, if someone requires that Cookies are also removed within the
244
+      // the WebView and want to extends the current sharedCookiesEnabled option with an
245
+      // additional property.
246
+      // Generates JS: document.cookie = "key=; Expires=Thu, 01 Jan 1970 00:00:01 GMT;"
247
+      // for each cookie which is already available in the WebView context.
248
+      /*
249
+      [script appendString:@"(function () {\n"];
250
+      [script appendString:@"  var cookies = document.cookie.split('; ');\n"];
251
+      [script appendString:@"  for (var i = 0; i < cookies.length; i++) {\n"];
252
+      [script appendString:@"    if (cookies[i].indexOf('=') !== -1) {\n"];
253
+      [script appendString:@"      document.cookie = cookies[i].split('=')[0] + '=; Expires=Thu, 01 Jan 1970 00:00:01 GMT';\n"];
254
+      [script appendString:@"    }\n"];
255
+      [script appendString:@"  }\n"];
256
+      [script appendString:@"})();\n\n"];
257
+      */
258
+
259
+      // Set cookies in a direct called function. This ensures that no
260
+      // javascript error will break the web content javascript.
261
+        // Generates JS: document.cookie = "key=value; Path=/; Expires=Thu, 01 Jan 20xx 00:00:01 GMT;"
262
+      // for each cookie which is available in the application context.
263
+      [script appendString:@"(function () {\n"];
264
+      for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
265
+        [script appendFormat:@"document.cookie = %@ + '=' + %@",
266
+          RCTJSONStringify(cookie.name, NULL),
267
+          RCTJSONStringify(cookie.value, NULL)];
268
+        if (cookie.path) {
269
+          [script appendFormat:@" + '; Path=' + %@", RCTJSONStringify(cookie.path, NULL)];
238 270
         }
239
-      } else {
240
-        NSMutableString *script = [NSMutableString string];
241
-
242
-        // Clear all existing cookies in a direct called function. This ensures that no
243
-        // javascript error will break the web content javascript.
244
-        // We keep this code here, if someone requires that Cookies are also removed within the
245
-        // the WebView and want to extends the current sharedCookiesEnabled option with an
246
-        // additional property.
247
-        // Generates JS: document.cookie = "key=; Expires=Thu, 01 Jan 1970 00:00:01 GMT;"
248
-        // for each cookie which is already available in the WebView context.
249
-        /*
250
-        [script appendString:@"(function () {\n"];
251
-        [script appendString:@"  var cookies = document.cookie.split('; ');\n"];
252
-        [script appendString:@"  for (var i = 0; i < cookies.length; i++) {\n"];
253
-        [script appendString:@"    if (cookies[i].indexOf('=') !== -1) {\n"];
254
-        [script appendString:@"      document.cookie = cookies[i].split('=')[0] + '=; Expires=Thu, 01 Jan 1970 00:00:01 GMT';\n"];
255
-        [script appendString:@"    }\n"];
256
-        [script appendString:@"  }\n"];
257
-        [script appendString:@"})();\n\n"];
258
-        */
259
-
260
-        // Set cookies in a direct called function. This ensures that no
261
-        // javascript error will break the web content javascript.
262
-          // Generates JS: document.cookie = "key=value; Path=/; Expires=Thu, 01 Jan 20xx 00:00:01 GMT;"
263
-        // for each cookie which is available in the application context.
264
-        [script appendString:@"(function () {\n"];
265
-        for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
266
-          [script appendFormat:@"document.cookie = %@ + '=' + %@",
267
-            RCTJSONStringify(cookie.name, NULL),
268
-            RCTJSONStringify(cookie.value, NULL)];
269
-          if (cookie.path) {
270
-            [script appendFormat:@" + '; Path=' + %@", RCTJSONStringify(cookie.path, NULL)];
271
-          }
272
-          if (cookie.expiresDate) {
273
-            [script appendFormat:@" + '; Expires=' + new Date(%f).toUTCString()",
274
-              cookie.expiresDate.timeIntervalSince1970 * 1000
275
-            ];
276
-          }
277
-          [script appendString:@";\n"];
271
+        if (cookie.expiresDate) {
272
+          [script appendFormat:@" + '; Expires=' + new Date(%f).toUTCString()",
273
+            cookie.expiresDate.timeIntervalSince1970 * 1000
274
+          ];
278 275
         }
279
-        [script appendString:@"})();\n"];
280
-
281
-        WKUserScript* cookieInScript = [[WKUserScript alloc] initWithSource:script
282
-                                                              injectionTime:WKUserScriptInjectionTimeAtDocumentStart
283
-                                                           forMainFrameOnly:YES];
284
-        [wkWebViewConfig.userContentController addUserScript:cookieInScript];
276
+        [script appendString:@";\n"];
285 277
       }
278
+      [script appendString:@"})();\n"];
279
+
280
+      WKUserScript* cookieInScript = [[WKUserScript alloc] initWithSource:script
281
+                                                            injectionTime:WKUserScriptInjectionTimeAtDocumentStart
282
+                                                         forMainFrameOnly:YES];
283
+      [wkWebViewConfig.userContentController addUserScript:cookieInScript];
286 284
     }
285
+  }
286
+  
287
+  return wkWebViewConfig;
288
+}
287 289
 
290
+- (void)didMoveToWindow
291
+{
292
+  if (self.window != nil && _webView == nil) {
293
+    WKWebViewConfiguration *wkWebViewConfig = [self setUpWkWebViewConfig];
288 294
     _webView = [[WKWebView alloc] initWithFrame:self.bounds configuration: wkWebViewConfig];
289 295
     [self setBackgroundColor: _savedBackgroundColor];
290 296
     _webView.scrollView.delegate = self;

+ 0
- 13
ios/RNCWebViewManager.m View File

@@ -14,19 +14,6 @@
14 14
 @interface RNCWebViewManager () <RNCWebViewDelegate>
15 15
 @end
16 16
 
17
-@implementation RCTConvert (UIScrollView)
18
-
19
-#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */
20
-RCT_ENUM_CONVERTER(UIScrollViewContentInsetAdjustmentBehavior, (@{
21
-                                                                  @"automatic": @(UIScrollViewContentInsetAdjustmentAutomatic),
22
-                                                                  @"scrollableAxes": @(UIScrollViewContentInsetAdjustmentScrollableAxes),
23
-                                                                  @"never": @(UIScrollViewContentInsetAdjustmentNever),
24
-                                                                  @"always": @(UIScrollViewContentInsetAdjustmentAlways),
25
-                                                                  }), UIScrollViewContentInsetAdjustmentNever, integerValue)
26
-#endif
27
-
28
-@end
29
-
30 17
 @implementation RNCWebViewManager
31 18
 {
32 19
   NSConditionLock *_shouldStartLoadLock;

+ 12
- 7
package.json View File

@@ -8,9 +8,12 @@
8 8
     "Thibault Malbranche <malbranche.thibault@gmail.com>"
9 9
   ],
10 10
   "license": "MIT",
11
-  "version": "8.0.2",
11
+  "version": "8.0.6",
12 12
   "homepage": "https://github.com/react-native-community/react-native-webview#readme",
13 13
   "scripts": {
14
+    "start": "node node_modules/react-native/local-cli/cli.js start",
15
+    "start:android": "react-native run-android --root example/",
16
+    "start:ios": "react-native run-ios --project-path example/ios --scheme example",
14 17
     "ci": "CI=true && yarn lint && yarn test",
15 18
     "ci:publish": "yarn semantic-release",
16 19
     "lint": "yarn tsc --noEmit && yarn eslint ./src --ext .ts,.tsx",
@@ -23,7 +26,7 @@
23 26
     "type": "Component"
24 27
   },
25 28
   "peerDependencies": {
26
-    "react": "^16.0",
29
+    "react": "^16.9",
27 30
     "react-native": ">=0.60 <0.62"
28 31
   },
29 32
   "dependencies": {
@@ -31,7 +34,8 @@
31 34
     "invariant": "2.2.4"
32 35
   },
33 36
   "devDependencies": {
34
-    "@babel/core": "7.5.5",
37
+    "@babel/core": "7.4.5",
38
+    "@babel/runtime": "7.4.5",
35 39
     "@semantic-release/git": "7.0.16",
36 40
     "@types/invariant": "^2.2.30",
37 41
     "@types/jest": "24.0.18",
@@ -40,7 +44,8 @@
40 44
     "@typescript-eslint/eslint-plugin": "2.1.0",
41 45
     "@typescript-eslint/parser": "2.1.0",
42 46
     "babel-eslint": "10.0.3",
43
-    "babel-jest": "^24.9.0",
47
+    "babel-jest": "24.8.0",
48
+    "babel-plugin-module-resolver": "3.1.3",
44 49
     "eslint": "6.3.0",
45 50
     "eslint-config-airbnb": "18.0.1",
46 51
     "eslint-config-prettier": "6.2.0",
@@ -49,9 +54,9 @@
49 54
     "eslint-plugin-react": "7.14.3",
50 55
     "eslint-plugin-react-native": "3.7.0",
51 56
     "jest": "24.9.0",
52
-    "metro-react-native-babel-preset": "0.53.1",
53
-    "react": "16.8.3",
54
-    "react-native": "0.60.5",
57
+    "metro-react-native-babel-preset": "0.54.1",
58
+    "react": "16.9.0",
59
+    "react-native": "0.61.5",
55 60
     "semantic-release": "15.13.24",
56 61
     "typescript": "3.6.2"
57 62
   },

+ 10
- 4
src/WebViewShared.tsx View File

@@ -44,11 +44,17 @@ const createOnShouldStartLoadWithRequest = (
44 44
     const { url, lockIdentifier } = nativeEvent;
45 45
 
46 46
     if (!passesWhitelist(compileWhitelist(originWhitelist), url)) {
47
-      Linking.openURL(url);
47
+      Linking.canOpenURL(url).then((supported) => {
48
+        if (supported) {
49
+          return Linking.openURL(url);
50
+        }
51
+        console.warn(`Can't open url: ${url}`);
52
+        return undefined;
53
+      }).catch(e => {
54
+        console.warn('Error opening URL: ', e);
55
+      });
48 56
       shouldStart = false;
49
-    }
50
-
51
-    if (onShouldStartLoadWithRequest) {
57
+    } else if (onShouldStartLoadWithRequest) {
52 58
       shouldStart = onShouldStartLoadWithRequest(nativeEvent);
53 59
     }
54 60
 

+ 80
- 8
src/__tests__/WebViewShared-test.js View File

@@ -5,6 +5,31 @@ import {
5 5
   createOnShouldStartLoadWithRequest,
6 6
 } from '../WebViewShared';
7 7
 
8
+Linking.openURL.mockResolvedValue(undefined);
9
+Linking.canOpenURL.mockResolvedValue(true);
10
+
11
+// The tests that call createOnShouldStartLoadWithRequest will cause a promise
12
+// to get kicked off (by calling the mocked `Linking.canOpenURL`) that the tests
13
+// _need_ to get run to completion _before_ doing any `expect`ing. The reason
14
+// is: once that promise is resolved another function should get run which will
15
+// call `Linking.openURL`, and we want to test that.
16
+//
17
+// Normally we would probably do something like `await
18
+// createShouldStartLoadWithRequest(...)` in the tests, but that doesn't work
19
+// here because the promise that gets kicked off is not returned (because
20
+// non-test code doesn't need to know about it).
21
+//
22
+// The tests thus need a way to "flush any pending promises" (to make sure
23
+// pending promises run to completion) before doing any `expect`ing. `jest`
24
+// doesn't provide a way to do this out of the box, but we can use this function
25
+// to do it.
26
+//
27
+// See this issue for more discussion: https://github.com/facebook/jest/issues/2157
28
+function flushPromises() {
29
+  return new Promise(resolve => setImmediate(resolve));
30
+}
31
+
32
+
8 33
 describe('WebViewShared', () => {
9 34
   test('exports defaultOriginWhitelist', () => {
10 35
     expect(defaultOriginWhitelist).toMatchSnapshot();
@@ -21,29 +46,35 @@ describe('WebViewShared', () => {
21 46
 
22 47
     const loadRequest = jest.fn();
23 48
 
24
-    test('loadRequest is called without onShouldStartLoadWithRequest override', () => {
49
+    test('loadRequest is called without onShouldStartLoadWithRequest override', async () => {
25 50
       const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest(
26 51
         loadRequest,
27 52
         defaultOriginWhitelist,
28 53
       );
29 54
 
30 55
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'https://www.example.com/', lockIdentifier: 1 } });
56
+      
57
+      await flushPromises();
58
+
31 59
       expect(Linking.openURL).toHaveBeenCalledTimes(0);
32 60
       expect(loadRequest).toHaveBeenCalledWith(true, 'https://www.example.com/', 1);
33 61
     });
34 62
 
35
-    test('Linking.openURL is called without onShouldStartLoadWithRequest override', () => {
63
+    test('Linking.openURL is called without onShouldStartLoadWithRequest override', async () => {
36 64
       const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest(
37 65
         loadRequest,
38 66
         defaultOriginWhitelist,
39 67
       );
40 68
 
41 69
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'invalid://example.com/', lockIdentifier: 2 } });
70
+      
71
+      await flushPromises();
72
+
42 73
       expect(Linking.openURL).toHaveBeenCalledWith('invalid://example.com/');
43 74
       expect(loadRequest).toHaveBeenCalledWith(false, 'invalid://example.com/', 2);
44 75
     });
45 76
 
46
-    test('loadRequest with true onShouldStartLoadWithRequest override is called', () => {
77
+    test('loadRequest with true onShouldStartLoadWithRequest override is called', async () => {
47 78
       const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest(
48 79
         loadRequest,
49 80
         defaultOriginWhitelist,
@@ -51,23 +82,32 @@ describe('WebViewShared', () => {
51 82
       );
52 83
 
53 84
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'https://www.example.com/', lockIdentifier: 1 } });
85
+
86
+      await flushPromises();
87
+
54 88
       expect(Linking.openURL).toHaveBeenCalledTimes(0);
55 89
       expect(loadRequest).toHaveBeenLastCalledWith(true, 'https://www.example.com/', 1);
56 90
     });
57 91
 
58
-    test('Linking.openURL with true onShouldStartLoadWithRequest override is called for links not passing the whitelist', () => {
92
+    test('Linking.openURL with true onShouldStartLoadWithRequest override is called for links not passing the whitelist', async () => {
59 93
       const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest(
60 94
         loadRequest,
61 95
         defaultOriginWhitelist,
62 96
         alwaysTrueOnShouldStartLoadWithRequest,
63 97
       );
64 98
 
99
+      var a = 10;
65 100
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'invalid://example.com/', lockIdentifier: 1 } });
101
+
102
+      await flushPromises();
103
+
66 104
       expect(Linking.openURL).toHaveBeenLastCalledWith('invalid://example.com/');
67
-      expect(loadRequest).toHaveBeenLastCalledWith(true, 'invalid://example.com/', 1);
105
+      // We don't expect the URL to have been loaded in the WebView because it
106
+      // is not in the origin whitelist
107
+      expect(loadRequest).toHaveBeenLastCalledWith(false, 'invalid://example.com/', 1);
68 108
     });
69 109
 
70
-    test('loadRequest with false onShouldStartLoadWithRequest override is called', () => {
110
+    test('loadRequest with false onShouldStartLoadWithRequest override is called', async () => {
71 111
       const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest(
72 112
         loadRequest,
73 113
         defaultOriginWhitelist,
@@ -75,60 +115,92 @@ describe('WebViewShared', () => {
75 115
       );
76 116
 
77 117
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'https://www.example.com/', lockIdentifier: 1 } });
118
+
119
+      await flushPromises();
120
+
78 121
       expect(Linking.openURL).toHaveBeenCalledTimes(0);
79 122
       expect(loadRequest).toHaveBeenLastCalledWith(false, 'https://www.example.com/', 1);
80 123
     });
81 124
 
82
-    test('loadRequest with limited whitelist', () => {
125
+    test('loadRequest with limited whitelist', async () => {
83 126
       const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest(
84 127
         loadRequest,
85 128
         ['https://*'],
86 129
       );
87 130
 
88 131
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'https://www.example.com/', lockIdentifier: 1 } });
132
+      
133
+      await flushPromises();
134
+
89 135
       expect(Linking.openURL).toHaveBeenCalledTimes(0);
90 136
       expect(loadRequest).toHaveBeenLastCalledWith(true, 'https://www.example.com/', 1);
91 137
 
92 138
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'http://insecure.com/', lockIdentifier: 2 } });
139
+
140
+      await flushPromises();
141
+
93 142
       expect(Linking.openURL).toHaveBeenLastCalledWith('http://insecure.com/');
94 143
       expect(loadRequest).toHaveBeenLastCalledWith(false, 'http://insecure.com/', 2);
95 144
 
96 145
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'git+https://insecure.com/', lockIdentifier: 3 } });
146
+      
147
+      await flushPromises();
148
+
97 149
       expect(Linking.openURL).toHaveBeenLastCalledWith('git+https://insecure.com/');
98 150
       expect(loadRequest).toHaveBeenLastCalledWith(false, 'git+https://insecure.com/', 3);
99 151
 
100 152
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'fakehttps://insecure.com/', lockIdentifier: 4 } });
153
+      
154
+      await flushPromises();
155
+
101 156
       expect(Linking.openURL).toHaveBeenLastCalledWith('fakehttps://insecure.com/');
102 157
       expect(loadRequest).toHaveBeenLastCalledWith(false, 'fakehttps://insecure.com/', 4);
103 158
     });
104 159
 
105
-    test('loadRequest allows for valid URIs', () => {
160
+    test('loadRequest allows for valid URIs', async () => {
106 161
       const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest(
107 162
           loadRequest,
108 163
           ['plus+https://*', 'DOT.https://*', 'dash-https://*', '0invalid://*', '+invalid://*'],
109 164
       );
110 165
 
111 166
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'plus+https://www.example.com/', lockIdentifier: 1 } });
167
+      
168
+      await flushPromises();
112 169
       expect(Linking.openURL).toHaveBeenCalledTimes(0);
113 170
       expect(loadRequest).toHaveBeenLastCalledWith(true, 'plus+https://www.example.com/', 1);
114 171
 
115 172
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'DOT.https://www.example.com/', lockIdentifier: 2 } });
173
+
174
+      await flushPromises();
175
+
116 176
       expect(Linking.openURL).toHaveBeenCalledTimes(0);
117 177
       expect(loadRequest).toHaveBeenLastCalledWith(true, 'DOT.https://www.example.com/', 2);
118 178
 
119 179
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'dash-https://www.example.com/', lockIdentifier: 3 } });
180
+      
181
+      await flushPromises();
182
+
120 183
       expect(Linking.openURL).toHaveBeenCalledTimes(0);
121 184
       expect(loadRequest).toHaveBeenLastCalledWith(true, 'dash-https://www.example.com/', 3);
122 185
 
123 186
       onShouldStartLoadWithRequest({ nativeEvent: { url: '0invalid://www.example.com/', lockIdentifier: 4 } });
187
+
188
+      await flushPromises();
189
+
124 190
       expect(Linking.openURL).toHaveBeenLastCalledWith('0invalid://www.example.com/');
125 191
       expect(loadRequest).toHaveBeenLastCalledWith(false, '0invalid://www.example.com/', 4);
126 192
 
127 193
       onShouldStartLoadWithRequest({ nativeEvent: { url: '+invalid://www.example.com/', lockIdentifier: 5 } });
194
+      
195
+      await flushPromises();
196
+
128 197
       expect(Linking.openURL).toHaveBeenLastCalledWith('+invalid://www.example.com/');
129 198
       expect(loadRequest).toHaveBeenLastCalledWith(false, '+invalid://www.example.com/', 5);
130 199
 
131 200
       onShouldStartLoadWithRequest({ nativeEvent: { url: 'FAKE+plus+https://www.example.com/', lockIdentifier: 6 } });
201
+
202
+      await flushPromises();
203
+
132 204
       expect(Linking.openURL).toHaveBeenLastCalledWith('FAKE+plus+https://www.example.com/');
133 205
       expect(loadRequest).toHaveBeenLastCalledWith(false, 'FAKE+plus+https://www.example.com/', 6);
134 206
     });

+ 361
- 211
yarn.lock
File diff suppressed because it is too large
View File