Browse Source

Merge commit '118663287a' into shirakaba/updatable-user-scripts

* commit '118663287a':
  chore(release): 8.1.1 [skip ci]
  fix(Android): Don't show camera options for a file upload when they can not be used (#1210)
  chore(docs): Fix Getting Started Guide link in Breaking History (#1213)
  chore(docs): Update Android assets path (#1173)
  chore(docs): Update cookie links (#1149)
  chore(Android): Convert RNCWebViewPackage to Kotlin (#1194)
  chore(release): 8.1.0 [skip ci]
  feat(macOS): macOS Support (#1164)
  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

# Conflicts:
#	ios/RNCWebView.m
Jamie Birch 4 years ago
parent
commit
a517aaaf8f
100 changed files with 7513 additions and 142 deletions
  1. 5
    1
      README.md
  2. 1
    1
      android/build.gradle
  3. 25
    5
      android/src/main/java/com/reactnativecommunity/webview/RNCWebViewModule.java
  4. 0
    27
      android/src/main/java/com/reactnativecommunity/webview/RNCWebViewPackage.java
  5. 15
    0
      android/src/main/java/com/reactnativecommunity/webview/RNCWebViewPackage.kt
  6. 1
    0
      babel.config.js
  7. 38
    0
      docs/Contributing.md
  8. 15
    7
      docs/Getting-Started.md
  9. 10
    4
      docs/Guide.md
  10. 1
    1
      docs/README.portuguese.md
  11. 18
    18
      docs/Reference.md
  12. 1
    0
      example/.gitattributes
  13. 67
    0
      example/.gitignore
  14. 6
    0
      example/.prettierrc.js
  15. 1
    0
      example/.watchmanconfig
  16. 174
    0
      example/App.tsx
  17. 55
    0
      example/android/app/_BUCK
  18. 204
    0
      example/android/app/build.gradle
  19. 19
    0
      example/android/app/build_defs.bzl
  20. BIN
      example/android/app/debug.keystore
  21. 10
    0
      example/android/app/proguard-rules.pro
  22. 8
    0
      example/android/app/src/debug/AndroidManifest.xml
  23. 27
    0
      example/android/app/src/main/AndroidManifest.xml
  24. 15
    0
      example/android/app/src/main/java/com/example/MainActivity.java
  25. 76
    0
      example/android/app/src/main/java/com/example/MainApplication.java
  26. BIN
      example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  27. BIN
      example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
  28. BIN
      example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  29. BIN
      example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
  30. BIN
      example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  31. BIN
      example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
  32. BIN
      example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  33. BIN
      example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
  34. BIN
      example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  35. BIN
      example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
  36. 3
    0
      example/android/app/src/main/res/values/strings.xml
  37. 9
    0
      example/android/app/src/main/res/values/styles.xml
  38. 38
    0
      example/android/build.gradle
  39. 21
    0
      example/android/gradle.properties
  40. BIN
      example/android/gradle/wrapper/gradle-wrapper.jar
  41. 5
    0
      example/android/gradle/wrapper/gradle-wrapper.properties
  42. 188
    0
      example/android/gradlew
  43. 100
    0
      example/android/gradlew.bat
  44. 5
    0
      example/android/settings.gradle
  45. 4
    0
      example/app.json
  46. 3
    0
      example/babel.config.js
  47. 72
    0
      example/examples/Alerts.tsx
  48. 54
    0
      example/examples/Background.tsx
  49. 68
    0
      example/examples/Scrolling.tsx
  50. 69
    0
      example/examples/Uploads.tsx
  51. 9
    0
      example/index.js
  52. 56
    0
      example/ios/Podfile
  53. 344
    0
      example/ios/Podfile.lock
  54. 53
    0
      example/ios/example-tvOS/Info.plist
  55. 24
    0
      example/ios/example-tvOSTests/Info.plist
  56. 925
    0
      example/ios/example.xcodeproj/project.pbxproj
  57. 129
    0
      example/ios/example.xcodeproj/xcshareddata/xcschemes/example-tvOS.xcscheme
  58. 129
    0
      example/ios/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme
  59. 10
    0
      example/ios/example.xcworkspace/contents.xcworkspacedata
  60. 8
    0
      example/ios/example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  61. 15
    0
      example/ios/example/AppDelegate.h
  62. 42
    0
      example/ios/example/AppDelegate.m
  63. 42
    0
      example/ios/example/Base.lproj/LaunchScreen.xib
  64. 38
    0
      example/ios/example/Images.xcassets/AppIcon.appiconset/Contents.json
  65. 6
    0
      example/ios/example/Images.xcassets/Contents.json
  66. 57
    0
      example/ios/example/Info.plist
  67. 16
    0
      example/ios/example/main.m
  68. 24
    0
      example/ios/exampleTests/Info.plist
  69. 72
    0
      example/ios/exampleTests/exampleTests.m
  70. 16
    0
      example/macos/example-macOS/AppDelegate.h
  71. 39
    0
      example/macos/example-macOS/AppDelegate.m
  72. 45
    0
      example/macos/example-macOS/Info.plist
  73. 713
    0
      example/macos/example-macOS/Main.storyboard
  74. 12
    0
      example/macos/example-macOS/ViewController.h
  75. 29
    0
      example/macos/example-macOS/ViewController.m
  76. 12
    0
      example/macos/example-macOS/main.m
  77. 1569
    0
      example/macos/example.xcodeproj/project.pbxproj
  78. 10
    0
      example/macos/example.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  79. 92
    0
      example/macos/example.xcodeproj/xcshareddata/xcschemes/example-macOS.xcscheme
  80. 92
    0
      example/macos/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme
  81. 15
    0
      example/macos/example/AppDelegate.h
  82. 42
    0
      example/macos/example/AppDelegate.m
  83. 42
    0
      example/macos/example/Base.lproj/LaunchScreen.xib
  84. 53
    0
      example/macos/example/Images.xcassets/AppIcon.appiconset/Contents.json
  85. 6
    0
      example/macos/example/Images.xcassets/Contents.json
  86. 57
    0
      example/macos/example/Info.plist
  87. 16
    0
      example/macos/example/main.m
  88. 17
    0
      example/metro.config.js
  89. 62
    0
      example/tsconfig.json
  90. 168
    39
      ios/RNCWebView.m
  91. 6
    13
      ios/RNCWebViewManager.m
  92. 363
    0
      macos/RNCWebView.xcodeproj/project.pbxproj
  93. 12
    0
      metro.config.js
  94. 19
    0
      metro.config.macos.js
  95. 18
    8
      package.json
  96. 26
    0
      react-native.config.js
  97. 347
    0
      src/WebView.macos.tsx
  98. 10
    4
      src/WebViewShared.tsx
  99. 175
    14
      src/WebViewTypes.ts
  100. 0
    0
      src/__tests__/WebViewShared-test.js

+ 5
- 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
 
@@ -19,6 +20,7 @@ _This project is maintained for free by these people using both their free time
19 20
 
20 21
 - [x] iOS
21 22
 - [x] Android
23
+- [x] macOS
22 24
 
23 25
 _Note: Expo support for React Native WebView started with [Expo SDK v33.0.0](https://blog.expo.io/expo-sdk-v33-0-0-is-now-available-52d1c99dfe4c)._
24 26
 
@@ -101,3 +103,5 @@ MIT
101 103
 This readme is available in:
102 104
 
103 105
 - [Brazilian portuguese](docs/README.portuguese.md)
106
+
107
+[lean-core-issue]: https://github.com/facebook/react-native/issues/23313

+ 1
- 1
android/build.gradle View File

@@ -123,6 +123,6 @@ def kotlin_version = getExtOrDefault('kotlinVersion')
123 123
 
124 124
 dependencies {
125 125
   //noinspection GradleDynamicVersion
126
-  api 'com.facebook.react:react-native:+'
126
+  implementation 'com.facebook.react:react-native:+'
127 127
   implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
128 128
 }

+ 25
- 5
android/src/main/java/com/reactnativecommunity/webview/RNCWebViewModule.java View File

@@ -32,6 +32,7 @@ import com.facebook.react.modules.core.PermissionListener;
32 32
 import java.io.File;
33 33
 import java.io.IOException;
34 34
 import java.util.ArrayList;
35
+import java.util.Arrays;
35 36
 
36 37
 import static android.app.Activity.RESULT_OK;
37 38
 
@@ -180,11 +181,13 @@ public class RNCWebViewModule extends ReactContextBaseJavaModule implements Acti
180 181
     filePathCallback = callback;
181 182
 
182 183
     ArrayList<Parcelable> extraIntents = new ArrayList<>();
183
-    if (acceptsImages(acceptTypes)) {
184
-      extraIntents.add(getPhotoIntent());
185
-    }
186
-    if (acceptsVideo(acceptTypes)) {
187
-      extraIntents.add(getVideoIntent());
184
+    if (! needsCameraPermission()) {
185
+      if (acceptsImages(acceptTypes)) {
186
+        extraIntents.add(getPhotoIntent());
187
+      }
188
+      if (acceptsVideo(acceptTypes)) {
189
+        extraIntents.add(getVideoIntent());
190
+      }
188 191
     }
189 192
 
190 193
     Intent fileSelectionIntent = getFileChooserIntent(acceptTypes, allowMultiple);
@@ -233,6 +236,23 @@ public class RNCWebViewModule extends ReactContextBaseJavaModule implements Acti
233 236
     return result;
234 237
   }
235 238
 
239
+  protected boolean needsCameraPermission() {
240
+    boolean needed = false;
241
+
242
+    PackageManager packageManager = getCurrentActivity().getPackageManager();
243
+    try {
244
+      String[] requestedPermissions = packageManager.getPackageInfo(getReactApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS).requestedPermissions;
245
+      if (Arrays.asList(requestedPermissions).contains(Manifest.permission.CAMERA)
246
+        && ContextCompat.checkSelfPermission(getCurrentActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
247
+        needed = true;
248
+      }
249
+    } catch (PackageManager.NameNotFoundException e) {
250
+      needed = true;
251
+    }
252
+
253
+    return needed;
254
+  }
255
+
236 256
   private Intent getPhotoIntent() {
237 257
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
238 258
     outputFileUri = getOutputUri(MediaStore.ACTION_IMAGE_CAPTURE);

+ 0
- 27
android/src/main/java/com/reactnativecommunity/webview/RNCWebViewPackage.java View File

@@ -1,27 +0,0 @@
1
-package com.reactnativecommunity.webview;
2
-
3
-import com.facebook.react.ReactPackage;
4
-import com.facebook.react.bridge.JavaScriptModule;
5
-import com.facebook.react.bridge.NativeModule;
6
-import com.facebook.react.bridge.ReactApplicationContext;
7
-import com.facebook.react.uimanager.ViewManager;
8
-
9
-import java.util.Collections;
10
-import java.util.List;
11
-
12
-public class RNCWebViewPackage implements ReactPackage {
13
-  @Override
14
-  public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
15
-    return Collections.singletonList(new RNCWebViewModule(reactContext));
16
-  }
17
-
18
-  // Deprecated from RN 0.47
19
-  public List<Class<? extends JavaScriptModule>> createJSModules() {
20
-    return Collections.emptyList();
21
-  }
22
-
23
-  @Override
24
-  public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
25
-    return Collections.singletonList(new RNCWebViewManager());
26
-  }
27
-}

+ 15
- 0
android/src/main/java/com/reactnativecommunity/webview/RNCWebViewPackage.kt View File

@@ -0,0 +1,15 @@
1
+package com.reactnativecommunity.webview
2
+
3
+import com.facebook.react.ReactPackage
4
+import com.facebook.react.bridge.ReactApplicationContext
5
+
6
+
7
+class RNCWebViewPackage: ReactPackage {
8
+  override fun createNativeModules(reactContext: ReactApplicationContext) = listOf(
9
+    RNCWebViewModule(reactContext)
10
+  )
11
+
12
+  override fun createViewManagers(reactContext: ReactApplicationContext) = listOf(
13
+    RNCWebViewManager()
14
+  )
15
+}

+ 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
 };

+ 38
- 0
docs/Contributing.md View File

@@ -8,6 +8,44 @@ Secondly, we'd like the contribution experience to be as good as possible. While
8 8
 
9 9
 After you fork the repo, clone it to your machine, and make your changes, you'll want to test them in an app.
10 10
 
11
+There are two methods of testing:
12
+1) Testing within a clone of react-native-webview
13
+2) Testing in a new `react-native init` project
14
+
15
+### Testing within react-native-webview
16
+
17
+#### For all platforms:
18
+```
19
+$ yarn install
20
+```
21
+
22
+#### For Android:
23
+```
24
+$ yarn start:android
25
+```
26
+
27
+The Android example app will built, the Metro Bundler will launch, and the example app will be installed and started in the Android emulator.
28
+
29
+#### For iOS:
30
+```
31
+$ cd example/ios
32
+$ pod install
33
+$ cd ../..
34
+$ yarn start:ios
35
+```
36
+
37
+The iOS example app will be built, the Metro bundler will launch, and the example app will be install and started in the Simulator.
38
+
39
+#### for macOS:
40
+```
41
+$ open example/macos/example.xcodeproj
42
+$ yarn start:macos
43
+```
44
+
45
+The Metro Bundler will now be running in the Terminal for react-native-macos.  In XCode select the `example-macos` target and Run.
46
+
47
+### Testing in a new `react-native init` project
48
+
11 49
 In a new `react-native init` project, do this:
12 50
 
13 51
 ```

+ 15
- 7
docs/Getting-Started.md View File

@@ -2,7 +2,7 @@
2 2
 
3 3
 Here's how to get started quickly with the React Native WebView.
4 4
 
5
-#### 1. Add react-native-webview to your dependencies
5
+## 1. Add react-native-webview to your dependencies
6 6
 
7 7
 ```
8 8
 $ yarn add react-native-webview
@@ -14,7 +14,7 @@ $ yarn add react-native-webview
14 14
 $ npm install --save react-native-webview
15 15
 ```
16 16
 
17
-#### 2. Link native dependencies
17
+## 2. Link native dependencies
18 18
 
19 19
 From react-native 0.60 autolinking will take care of the link step but don't forget to run `pod install`
20 20
 
@@ -24,13 +24,20 @@ React Native modules that include native Objective-C, Swift, Java, or Kotlin cod
24 24
 $ react-native link react-native-webview
25 25
 ```
26 26
 
27
-iOS:
27
+_NOTE: If you ever need to uninstall React Native WebView, run `react-native unlink react-native-webview` to unlink it._
28
+
29
+### iOS:
28 30
 
29 31
 If using cocoapods in the `ios/` directory run
30 32
 ```
31 33
 $ pod install
32 34
 ```
33 35
 
36
+For iOS, while you can manually link the old way using [react-native own tutorial](https://facebook.github.io/react-native/docs/linking-libraries-ios), we find it easier to use cocoapods.
37
+If you wish to use cocoapods and haven't set it up yet, please instead refer to [that article](https://engineering.brigad.co/demystifying-react-native-modules-linking-ae6c017a6b4a).
38
+
39
+### Android:
40
+
34 41
 Android - react-native-webview version <6:
35 42
 This module does not require any extra step after running the link command 🎉
36 43
 
@@ -44,12 +51,13 @@ android.enableJetifier=true
44 51
 
45 52
 For Android manual installation, please refer to [this article](https://engineering.brigad.co/demystifying-react-native-modules-linking-964399ec731b) where you can find detailed step on how to link any react-native project.
46 53
 
47
-For iOS, while you can manually link the old way using [react-native own tutorial](https://facebook.github.io/react-native/docs/linking-libraries-ios), we find it easier to use cocoapods.
48
-If you wish to use cocoapods and haven't set it up yet, please instead refer to [that article](https://engineering.brigad.co/demystifying-react-native-modules-linking-ae6c017a6b4a).
54
+### macOS:
49 55
 
50
-_NOTE: If you ever need to uninstall React Native WebView, run `react-native unlink react-native-webview` to unlink it._
56
+Cocoapod and autolinking is not yet support for react-native macOS but is coming soon.  In the meantime you must manually link.
57
+
58
+The method is nearly identical to the [manual linking method for iOS](https://facebook.github.io/react-native/docs/linking-libraries-ios#manual-linking) except that you will include the `node_modules/react-native-webview/macos/RNCWebView.xcodeproj` project in your main project and link the `RNCWebView-macOS.a` library. 
51 59
 
52
-#### 3. Import the webview into your component
60
+## 3. Import the webview into your component
53 61
 
54 62
 ```js
55 63
 import React, { Component } from 'react';

+ 10
- 4
docs/Guide.md View File

@@ -74,7 +74,7 @@ class MyWeb extends Component {
74 74
 }
75 75
 ```
76 76
 
77
-However on Android, you need to place the HTML file inside your android project's asset directory. For example, if `local-site.html` is your HTML file and you'd like to load it into the webview, you should move the file to your project's android asset directory which is `your-project/android/src/main/assets/`. Then you can load the html file as shown in the following code block
77
+However on Android, you need to place the HTML file inside your android project's asset directory. For example, if `local-site.html` is your HTML file and you'd like to load it into the webview, you should move the file to your project's android asset directory which is `your-project/android/app/src/main/assets/`. Then you can load the html file as shown in the following code block
78 78
 
79 79
 ```js
80 80
 import React, { Component } from 'react';
@@ -191,6 +191,12 @@ Add permission in AndroidManifest.xml:
191 191
 </manifest>
192 192
 ```
193 193
 
194
+###### Camera option availability in uploading for Android
195
+
196
+If the file input indicates that images or video is desired with [`accept`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#accept), then the WebView will attempt to provide options to the user to use their camera to take a picture or video.
197
+
198
+Normally, apps that do not have permission to use the camera can prompt the user to use an external app so that the requesting app has no need for permission. However, Android has made a special exception for this around the camera to reduce confusion for users. If an app *can* request the camera permission because it has been declared, and the user has not granted the permission, it may not fire an intent that would use the camera (`MediaStore.ACTION_IMAGE_CAPTURE` or `MediaStore.ACTION_VIDEO_CAPTURE`). In this scenario, it is up to the developer to request camera permission before a file upload directly using the camera is necessary.
199
+
194 200
 ##### Check for File Upload support, with `static isFileUploadSupported()`
195 201
 
196 202
 File Upload using `<input type="file" />` is not supported for Android 4.4 KitKat (see [details](https://github.com/delight-im/Android-AdvancedWebView/issues/4#issuecomment-70372146)):
@@ -301,7 +307,7 @@ _Under the hood_
301 307
 
302 308
 #### The `injectedJavaScriptBeforeContentLoaded` prop
303 309
 
304
-This is a script that runs **before** the web page loads for the first time. It only runs once, even if the page is reloaded or navigated away. This is useful if you want to inject anything into the window, localstorage, or document prior to the web code executing. 
310
+This is a script that runs **before** the web page loads for the first time. It only runs once, even if the page is reloaded or navigated away. This is useful if you want to inject anything into the window, localstorage, or document prior to the web code executing.
305 311
 
306 312
 ```jsx
307 313
 import React, { Component } from 'react';
@@ -329,7 +335,7 @@ export default class App extends Component {
329 335
 }
330 336
 ```
331 337
 
332
-This runs the JavaScript in the `runFirst` string before the page is loaded. In this case, the value of `window.isNativeApp` will be set to true before the web code executes. 
338
+This runs the JavaScript in the `runFirst` string before the page is loaded. In this case, the value of `window.isNativeApp` will be set to true before the web code executes.
333 339
 
334 340
 #### The `injectJavaScript` method
335 341
 
@@ -475,7 +481,7 @@ const CustomHeaderWebView = props => {
475 481
 
476 482
 #### Managing Cookies
477 483
 
478
-You can set cookies on the React Native side using the [react-native-cookies](https://github.com/joeferraro/react-native-cookies) package.
484
+You can set cookies on the React Native side using the [@react-native-community/cookies](https://github.com/react-native-community/cookies) package.
479 485
 
480 486
 When you do, you'll likely want to enable the [sharedCookiesEnabled](Reference#sharedCookiesEnabled) prop as well.
481 487
 

+ 1
- 1
docs/README.portuguese.md View File

@@ -36,7 +36,7 @@ Versão atual: ![version](https://img.shields.io/npm/v/react-native-webview.svg)
36 36
 
37 37
 - [7.0.1](https://github.com/react-native-community/react-native-webview/releases/tag/v7.0.1) - UIWebView removido
38 38
 
39
-- [6.0.**2**](https://github.com/react-native-community/react-native-webview/releases/tag/v6.0.2) - Update para AndroidX. Tenha certeza de habilitar no `android/gradle.properties` do seu projeto. Veja o [Getting Started Guide](docs/Getting-Started.md).
39
+- [6.0.**2**](https://github.com/react-native-community/react-native-webview/releases/tag/v6.0.2) - Update para AndroidX. Tenha certeza de habilitar no `android/gradle.properties` do seu projeto. Veja o [Getting Started Guide](https://github.com/react-native-community/react-native-webview/blob/master/docs/Getting-Started.md).
40 40
 
41 41
 - [5.0.**1**](https://github.com/react-native-community/react-native-webview/releases/tag/v5.0.0) - Refatorou a antiga implementação postMessage para comunicação da visualização da webview para nativa.
42 42
 - [4.0.0](https://github.com/react-native-community/react-native-webview/releases/tag/v4.0.0) - Cache adicionada(habilitada por padrão).

+ 18
- 18
docs/Reference.md View File

@@ -500,9 +500,9 @@ Note that this method will not be invoked on hash URL changes (e.g. from `https:
500 500
 
501 501
 Function that is invoked when the `WebView` content process is terminated.
502 502
 
503
-| Type     | Required | Platform      |
504
-| -------- | -------- | ------------- |
505
-| function | No       | iOS WKWebView |
503
+| Type     | Required | Platform                |
504
+| -------- | -------- | ----------------------- |
505
+| function | No       | iOS and macOS WKWebView |
506 506
 
507 507
 Example:
508 508
 
@@ -889,9 +889,9 @@ Possible values for `dataDetectorTypes` are:
889 889
 
890 890
 Boolean value that determines whether scrolling is enabled in the `WebView`. The default value is `true`. Setting this to `false` will prevent the webview from moving the document body when the keyboard appears over an input.
891 891
 
892
-| Type | Required | Platform |
893
-| ---- | -------- | -------- |
894
-| bool | No       | iOS      |
892
+| Type | Required | Platform      |
893
+| ---- | -------- | ------------- |
894
+| bool | No       | iOS and macOS |
895 895
 
896 896
 ---
897 897
 
@@ -960,9 +960,9 @@ Boolean that sets whether JavaScript running in the context of a file scheme URL
960 960
 
961 961
 A String value that indicates which URLs the WebView's file can then reference in scripts, AJAX requests, and CSS imports. This is only used in for WebViews that are loaded with a source.uri set to a `'file://'` URL. If not provided, the default is to only allow read access to the URL provided in source.uri itself.
962 962
 
963
-| Type   | Required | Platform |
964
-| ------ | -------- | -------- |
965
-| string | No       | iOS      |
963
+| Type   | Required | Platform      |
964
+| ------ | -------- | ------------- |
965
+| string | No       | iOS and macOS |
966 966
 
967 967
 ---
968 968
 
@@ -1010,9 +1010,9 @@ If true, this will hide the keyboard accessory view (< > and Done).
1010 1010
 
1011 1011
 If true, this will be able horizontal swipe gestures. The default value is `false`.
1012 1012
 
1013
-| Type    | Required | Platform |
1014
-| ------- | -------- | -------- |
1015
-| boolean | No       | iOS      |
1013
+| Type    | Required | Platform          |
1014
+| ------- | -------- | ----------------- |
1015
+| boolean | No       | iOS and macOS     |
1016 1016
 
1017 1017
 ---
1018 1018
 
@@ -1087,9 +1087,9 @@ If the value of this property is true, the scroll view stops on multiples of the
1087 1087
 
1088 1088
 A Boolean value that determines whether pressing on a link displays a preview of the destination for the link. In iOS this property is available on devices that support 3D Touch. In iOS 10 and later, the default value is true; before that, the default value is false.
1089 1089
 
1090
-| Type    | Required | Platform |
1091
-| ------- | -------- | -------- |
1092
-| boolean | No       | iOS      |
1090
+| Type    | Required | Platform          |
1091
+| ------- | -------- | ----------------- |
1092
+| boolean | No       | iOS and macOS     |
1093 1093
 
1094 1094
 ---
1095 1095
 
@@ -1097,9 +1097,9 @@ A Boolean value that determines whether pressing on a link displays a preview of
1097 1097
 
1098 1098
 Set `true` if shared cookies from `[NSHTTPCookieStorage sharedHTTPCookieStorage]` should used for every load request in the WebView. The default value is `false`. For more on cookies, read the [Guide](Guide.md#Managing-Cookies)
1099 1099
 
1100
-| Type    | Required | Platform |
1101
-| ------- | -------- | -------- |
1102
-| boolean | No       | iOS      |
1100
+| Type    | Required | Platform          |
1101
+| ------- | -------- | ----------------- |
1102
+| boolean | No       | iOS and macOS     |
1103 1103
 
1104 1104
 ---
1105 1105
 

+ 1
- 0
example/.gitattributes View File

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

+ 67
- 0
example/.gitignore View File

@@ -0,0 +1,67 @@
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
+# exclude project.xcworkspace except for xcshareddata/WorkspaceSettings.xcsettings
24
+project.xcworkspace/*
25
+**/project.xcworkspace/contents.xcworkspacedata
26
+**/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
27
+
28
+# Android/IntelliJ
29
+#
30
+build/
31
+.idea
32
+.gradle
33
+local.properties
34
+*.iml
35
+
36
+# Visual Studio Code
37
+#
38
+.vscode/
39
+
40
+# node.js
41
+#
42
+node_modules/
43
+npm-debug.log
44
+yarn-error.log
45
+
46
+# BUCK
47
+buck-out/
48
+\.buckd/
49
+*.keystore
50
+!debug.keystore
51
+
52
+# fastlane
53
+#
54
+# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
55
+# screenshots whenever they are needed.
56
+# For more information about the recommended setup visit:
57
+# https://docs.fastlane.tools/best-practices/source-control/
58
+
59
+*/fastlane/report.xml
60
+*/fastlane/Preview.html
61
+*/fastlane/screenshots
62
+
63
+# Bundle artifact
64
+*.jsbundle
65
+
66
+# CocoaPods
67
+/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
+{}

+ 174
- 0
example/App.tsx View File

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

+ 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>

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

@@ -0,0 +1,27 @@
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
+    <uses-permission android:name="android.permission.CAMERA" />
6
+
7
+    <application
8
+      android:name=".MainApplication"
9
+      android:label="@string/app_name"
10
+      android:icon="@mipmap/ic_launcher"
11
+      android:roundIcon="@mipmap/ic_launcher_round"
12
+      android:allowBackup="false"
13
+      android:theme="@style/AppTheme">
14
+      <activity
15
+        android:name=".MainActivity"
16
+        android:label="@string/app_name"
17
+        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
18
+        android:windowSoftInputMode="adjustResize">
19
+        <intent-filter>
20
+            <action android:name="android.intent.action.MAIN" />
21
+            <category android:name="android.intent.category.LAUNCHER" />
22
+        </intent-filter>
23
+      </activity>
24
+      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
25
+    </application>
26
+
27
+</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
+}

+ 69
- 0
example/examples/Uploads.tsx View File

@@ -0,0 +1,69 @@
1
+import React, {Component} from 'react';
2
+import {Button, Linking, 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>Uploads</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>
24
+      <label for="images-only">Images only file upload</label>
25
+      <input name="images-only" type="file" accept="image/*">
26
+    </p>
27
+    <p>
28
+      <label for="video-only">Video only file upload</label>
29
+      <input name="video-only" type="file" accept="video/*">
30
+    </p>
31
+    <p>
32
+      <label for="any-file">Any file upload</label>
33
+      <input name="any-file" type="file">
34
+    </p>
35
+  </body>
36
+</html>
37
+`;
38
+
39
+type Props = {};
40
+type State = {};
41
+
42
+export default class Uploads extends Component<Props, State> {
43
+  state = {};
44
+
45
+  render() {
46
+    return (
47
+      <View>
48
+        <View style={{ height: 120 }}>
49
+          <WebView
50
+            source={{html: HTML}}
51
+            automaticallyAdjustContentInsets={false}
52
+          />
53
+        </View>
54
+        <Text>
55
+            Android limitation: If the file input should show camera options for the user,
56
+            and the app has the ability to request the camera permission, then the user must
57
+            grant permission first in order to see the options. Since this example app does
58
+            have the permission declared, you must allow it in settings to be able to see
59
+            camera options. If your app does not have the camera permission declared, then
60
+            there is no restriction to showing the camera options.
61
+        </Text>
62
+        <Button
63
+          title="Open settings"
64
+          onPress={() => Linking.openSettings()}
65
+        />
66
+      </View>
67
+    );
68
+  }
69
+}

+ 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.6):
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: 222d83c9c489e09b5d3541519110a637490ad4fa
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

+ 16
- 0
example/macos/example-macOS/AppDelegate.h 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 <Cocoa/Cocoa.h>
9
+
10
+@class RCTBridge;
11
+
12
+@interface AppDelegate : NSObject <NSApplicationDelegate>
13
+
14
+@property (nonatomic, readonly) RCTBridge *bridge;
15
+
16
+@end

+ 39
- 0
example/macos/example-macOS/AppDelegate.m View File

@@ -0,0 +1,39 @@
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
+
13
+@interface AppDelegate () <RCTBridgeDelegate>
14
+
15
+@end
16
+
17
+@implementation AppDelegate
18
+
19
+- (void)awakeFromNib {
20
+  [super awakeFromNib];
21
+
22
+  _bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:nil];
23
+}
24
+
25
+- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
26
+  // Insert code here to initialize your application
27
+}
28
+
29
+- (void)applicationWillTerminate:(NSNotification *)aNotification {
30
+  // Insert code here to tear down your application
31
+}
32
+
33
+#pragma mark - RCTBridgeDelegate Methods
34
+
35
+- (NSURL *)sourceURLForBridge:(__unused RCTBridge *)bridge {
36
+  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"example/index" fallbackResource:@"main"]; // .jsbundle;
37
+}
38
+
39
+@end

+ 45
- 0
example/macos/example-macOS/Info.plist View File

@@ -0,0 +1,45 @@
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>$(DEVELOPMENT_LANGUAGE)</string>
7
+	<key>CFBundleExecutable</key>
8
+	<string>$(EXECUTABLE_NAME)</string>
9
+	<key>CFBundleIconFile</key>
10
+	<string></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>CFBundleVersion</key>
22
+	<string>1</string>
23
+	<key>LSMinimumSystemVersion</key>
24
+	<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
25
+	<key>NSAppTransportSecurity</key>
26
+	<dict>
27
+		<key>NSAllowsArbitraryLoads</key>
28
+		<true/>
29
+		<key>NSExceptionDomains</key>
30
+		<dict>
31
+			<key>localhost</key>
32
+			<dict>
33
+				<key>NSExceptionAllowsInsecureHTTPLoads</key>
34
+				<true/>
35
+			</dict>
36
+		</dict>
37
+	</dict>
38
+	<key>NSHumanReadableCopyright</key>
39
+	<string>Copyright © 2017 Facebook. All rights reserved.</string>
40
+	<key>NSMainStoryboardFile</key>
41
+	<string>Main</string>
42
+	<key>NSPrincipalClass</key>
43
+	<string>NSApplication</string>
44
+</dict>
45
+</plist>

+ 713
- 0
example/macos/example-macOS/Main.storyboard View File

@@ -0,0 +1,713 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="15505" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
3
+    <dependencies>
4
+        <deployment identifier="macosx"/>
5
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15505"/>
6
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
7
+    </dependencies>
8
+    <scenes>
9
+        <!--Application-->
10
+        <scene sceneID="JPo-4y-FX3">
11
+            <objects>
12
+                <application id="hnw-xV-0zn" sceneMemberID="viewController">
13
+                    <menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
14
+                        <items>
15
+                            <menuItem title="rncTesterApp-macOS" id="1Xt-HY-uBw">
16
+                                <modifierMask key="keyEquivalentModifierMask"/>
17
+                                <menu key="submenu" title="rncTesterApp-macOS" systemMenu="apple" id="uQy-DD-JDr">
18
+                                    <items>
19
+                                        <menuItem title="About rncTesterApp-macOS" id="5kV-Vb-QxS">
20
+                                            <modifierMask key="keyEquivalentModifierMask"/>
21
+                                            <connections>
22
+                                                <action selector="orderFrontStandardAboutPanel:" target="Ady-hI-5gd" id="Exp-CZ-Vem"/>
23
+                                            </connections>
24
+                                        </menuItem>
25
+                                        <menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
26
+                                        <menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
27
+                                        <menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
28
+                                        <menuItem title="Services" id="NMo-om-nkz">
29
+                                            <modifierMask key="keyEquivalentModifierMask"/>
30
+                                            <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
31
+                                        </menuItem>
32
+                                        <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
33
+                                        <menuItem title="Hide rncTesterApp-macOS" keyEquivalent="h" id="Olw-nP-bQN">
34
+                                            <connections>
35
+                                                <action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/>
36
+                                            </connections>
37
+                                        </menuItem>
38
+                                        <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
39
+                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
40
+                                            <connections>
41
+                                                <action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/>
42
+                                            </connections>
43
+                                        </menuItem>
44
+                                        <menuItem title="Show All" id="Kd2-mp-pUS">
45
+                                            <modifierMask key="keyEquivalentModifierMask"/>
46
+                                            <connections>
47
+                                                <action selector="unhideAllApplications:" target="Ady-hI-5gd" id="Dhg-Le-xox"/>
48
+                                            </connections>
49
+                                        </menuItem>
50
+                                        <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
51
+                                        <menuItem title="Quit rncTesterApp-macOS" keyEquivalent="q" id="4sb-4s-VLi">
52
+                                            <connections>
53
+                                                <action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/>
54
+                                            </connections>
55
+                                        </menuItem>
56
+                                    </items>
57
+                                </menu>
58
+                            </menuItem>
59
+                            <menuItem title="File" id="dMs-cI-mzQ">
60
+                                <modifierMask key="keyEquivalentModifierMask"/>
61
+                                <menu key="submenu" title="File" id="bib-Uj-vzu">
62
+                                    <items>
63
+                                        <menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
64
+                                            <connections>
65
+                                                <action selector="newDocument:" target="Ady-hI-5gd" id="4Si-XN-c54"/>
66
+                                            </connections>
67
+                                        </menuItem>
68
+                                        <menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
69
+                                            <connections>
70
+                                                <action selector="openDocument:" target="Ady-hI-5gd" id="bVn-NM-KNZ"/>
71
+                                            </connections>
72
+                                        </menuItem>
73
+                                        <menuItem title="Open Recent" id="tXI-mr-wws">
74
+                                            <modifierMask key="keyEquivalentModifierMask"/>
75
+                                            <menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
76
+                                                <items>
77
+                                                    <menuItem title="Clear Menu" id="vNY-rz-j42">
78
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
79
+                                                        <connections>
80
+                                                            <action selector="clearRecentDocuments:" target="Ady-hI-5gd" id="Daa-9d-B3U"/>
81
+                                                        </connections>
82
+                                                    </menuItem>
83
+                                                </items>
84
+                                            </menu>
85
+                                        </menuItem>
86
+                                        <menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
87
+                                        <menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
88
+                                            <connections>
89
+                                                <action selector="performClose:" target="Ady-hI-5gd" id="HmO-Ls-i7Q"/>
90
+                                            </connections>
91
+                                        </menuItem>
92
+                                        <menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
93
+                                            <connections>
94
+                                                <action selector="saveDocument:" target="Ady-hI-5gd" id="teZ-XB-qJY"/>
95
+                                            </connections>
96
+                                        </menuItem>
97
+                                        <menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
98
+                                            <connections>
99
+                                                <action selector="saveDocumentAs:" target="Ady-hI-5gd" id="mDf-zr-I0C"/>
100
+                                            </connections>
101
+                                        </menuItem>
102
+                                        <menuItem title="Revert to Saved" keyEquivalent="r" id="KaW-ft-85H">
103
+                                            <connections>
104
+                                                <action selector="revertDocumentToSaved:" target="Ady-hI-5gd" id="iJ3-Pv-kwq"/>
105
+                                            </connections>
106
+                                        </menuItem>
107
+                                        <menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
108
+                                        <menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
109
+                                            <modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
110
+                                            <connections>
111
+                                                <action selector="runPageLayout:" target="Ady-hI-5gd" id="Din-rz-gC5"/>
112
+                                            </connections>
113
+                                        </menuItem>
114
+                                        <menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
115
+                                            <connections>
116
+                                                <action selector="print:" target="Ady-hI-5gd" id="qaZ-4w-aoO"/>
117
+                                            </connections>
118
+                                        </menuItem>
119
+                                    </items>
120
+                                </menu>
121
+                            </menuItem>
122
+                            <menuItem title="Edit" id="5QF-Oa-p0T">
123
+                                <modifierMask key="keyEquivalentModifierMask"/>
124
+                                <menu key="submenu" title="Edit" id="W48-6f-4Dl">
125
+                                    <items>
126
+                                        <menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
127
+                                            <connections>
128
+                                                <action selector="undo:" target="Ady-hI-5gd" id="M6e-cu-g7V"/>
129
+                                            </connections>
130
+                                        </menuItem>
131
+                                        <menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
132
+                                            <connections>
133
+                                                <action selector="redo:" target="Ady-hI-5gd" id="oIA-Rs-6OD"/>
134
+                                            </connections>
135
+                                        </menuItem>
136
+                                        <menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
137
+                                        <menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
138
+                                            <connections>
139
+                                                <action selector="cut:" target="Ady-hI-5gd" id="YJe-68-I9s"/>
140
+                                            </connections>
141
+                                        </menuItem>
142
+                                        <menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
143
+                                            <connections>
144
+                                                <action selector="copy:" target="Ady-hI-5gd" id="G1f-GL-Joy"/>
145
+                                            </connections>
146
+                                        </menuItem>
147
+                                        <menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
148
+                                            <connections>
149
+                                                <action selector="paste:" target="Ady-hI-5gd" id="UvS-8e-Qdg"/>
150
+                                            </connections>
151
+                                        </menuItem>
152
+                                        <menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
153
+                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
154
+                                            <connections>
155
+                                                <action selector="pasteAsPlainText:" target="Ady-hI-5gd" id="cEh-KX-wJQ"/>
156
+                                            </connections>
157
+                                        </menuItem>
158
+                                        <menuItem title="Delete" id="pa3-QI-u2k">
159
+                                            <modifierMask key="keyEquivalentModifierMask"/>
160
+                                            <connections>
161
+                                                <action selector="delete:" target="Ady-hI-5gd" id="0Mk-Ml-PaM"/>
162
+                                            </connections>
163
+                                        </menuItem>
164
+                                        <menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
165
+                                            <connections>
166
+                                                <action selector="selectAll:" target="Ady-hI-5gd" id="VNm-Mi-diN"/>
167
+                                            </connections>
168
+                                        </menuItem>
169
+                                        <menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
170
+                                        <menuItem title="Find" id="4EN-yA-p0u">
171
+                                            <modifierMask key="keyEquivalentModifierMask"/>
172
+                                            <menu key="submenu" title="Find" id="1b7-l0-nxx">
173
+                                                <items>
174
+                                                    <menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
175
+                                                        <connections>
176
+                                                            <action selector="performFindPanelAction:" target="Ady-hI-5gd" id="cD7-Qs-BN4"/>
177
+                                                        </connections>
178
+                                                    </menuItem>
179
+                                                    <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
180
+                                                        <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
181
+                                                        <connections>
182
+                                                            <action selector="performFindPanelAction:" target="Ady-hI-5gd" id="WD3-Gg-5AJ"/>
183
+                                                        </connections>
184
+                                                    </menuItem>
185
+                                                    <menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
186
+                                                        <connections>
187
+                                                            <action selector="performFindPanelAction:" target="Ady-hI-5gd" id="NDo-RZ-v9R"/>
188
+                                                        </connections>
189
+                                                    </menuItem>
190
+                                                    <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
191
+                                                        <connections>
192
+                                                            <action selector="performFindPanelAction:" target="Ady-hI-5gd" id="HOh-sY-3ay"/>
193
+                                                        </connections>
194
+                                                    </menuItem>
195
+                                                    <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
196
+                                                        <connections>
197
+                                                            <action selector="performFindPanelAction:" target="Ady-hI-5gd" id="U76-nv-p5D"/>
198
+                                                        </connections>
199
+                                                    </menuItem>
200
+                                                    <menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
201
+                                                        <connections>
202
+                                                            <action selector="centerSelectionInVisibleArea:" target="Ady-hI-5gd" id="IOG-6D-g5B"/>
203
+                                                        </connections>
204
+                                                    </menuItem>
205
+                                                </items>
206
+                                            </menu>
207
+                                        </menuItem>
208
+                                        <menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
209
+                                            <modifierMask key="keyEquivalentModifierMask"/>
210
+                                            <menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
211
+                                                <items>
212
+                                                    <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
213
+                                                        <connections>
214
+                                                            <action selector="showGuessPanel:" target="Ady-hI-5gd" id="vFj-Ks-hy3"/>
215
+                                                        </connections>
216
+                                                    </menuItem>
217
+                                                    <menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
218
+                                                        <connections>
219
+                                                            <action selector="checkSpelling:" target="Ady-hI-5gd" id="fz7-VC-reM"/>
220
+                                                        </connections>
221
+                                                    </menuItem>
222
+                                                    <menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
223
+                                                    <menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
224
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
225
+                                                        <connections>
226
+                                                            <action selector="toggleContinuousSpellChecking:" target="Ady-hI-5gd" id="7w6-Qz-0kB"/>
227
+                                                        </connections>
228
+                                                    </menuItem>
229
+                                                    <menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
230
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
231
+                                                        <connections>
232
+                                                            <action selector="toggleGrammarChecking:" target="Ady-hI-5gd" id="muD-Qn-j4w"/>
233
+                                                        </connections>
234
+                                                    </menuItem>
235
+                                                    <menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
236
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
237
+                                                        <connections>
238
+                                                            <action selector="toggleAutomaticSpellingCorrection:" target="Ady-hI-5gd" id="2lM-Qi-WAP"/>
239
+                                                        </connections>
240
+                                                    </menuItem>
241
+                                                </items>
242
+                                            </menu>
243
+                                        </menuItem>
244
+                                        <menuItem title="Substitutions" id="9ic-FL-obx">
245
+                                            <modifierMask key="keyEquivalentModifierMask"/>
246
+                                            <menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
247
+                                                <items>
248
+                                                    <menuItem title="Show Substitutions" id="z6F-FW-3nz">
249
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
250
+                                                        <connections>
251
+                                                            <action selector="orderFrontSubstitutionsPanel:" target="Ady-hI-5gd" id="oku-mr-iSq"/>
252
+                                                        </connections>
253
+                                                    </menuItem>
254
+                                                    <menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
255
+                                                    <menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
256
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
257
+                                                        <connections>
258
+                                                            <action selector="toggleSmartInsertDelete:" target="Ady-hI-5gd" id="3IJ-Se-DZD"/>
259
+                                                        </connections>
260
+                                                    </menuItem>
261
+                                                    <menuItem title="Smart Quotes" id="hQb-2v-fYv">
262
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
263
+                                                        <connections>
264
+                                                            <action selector="toggleAutomaticQuoteSubstitution:" target="Ady-hI-5gd" id="ptq-xd-QOA"/>
265
+                                                        </connections>
266
+                                                    </menuItem>
267
+                                                    <menuItem title="Smart Dashes" id="rgM-f4-ycn">
268
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
269
+                                                        <connections>
270
+                                                            <action selector="toggleAutomaticDashSubstitution:" target="Ady-hI-5gd" id="oCt-pO-9gS"/>
271
+                                                        </connections>
272
+                                                    </menuItem>
273
+                                                    <menuItem title="Smart Links" id="cwL-P1-jid">
274
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
275
+                                                        <connections>
276
+                                                            <action selector="toggleAutomaticLinkDetection:" target="Ady-hI-5gd" id="Gip-E3-Fov"/>
277
+                                                        </connections>
278
+                                                    </menuItem>
279
+                                                    <menuItem title="Data Detectors" id="tRr-pd-1PS">
280
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
281
+                                                        <connections>
282
+                                                            <action selector="toggleAutomaticDataDetection:" target="Ady-hI-5gd" id="R1I-Nq-Kbl"/>
283
+                                                        </connections>
284
+                                                    </menuItem>
285
+                                                    <menuItem title="Text Replacement" id="HFQ-gK-NFA">
286
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
287
+                                                        <connections>
288
+                                                            <action selector="toggleAutomaticTextReplacement:" target="Ady-hI-5gd" id="DvP-Fe-Py6"/>
289
+                                                        </connections>
290
+                                                    </menuItem>
291
+                                                </items>
292
+                                            </menu>
293
+                                        </menuItem>
294
+                                        <menuItem title="Transformations" id="2oI-Rn-ZJC">
295
+                                            <modifierMask key="keyEquivalentModifierMask"/>
296
+                                            <menu key="submenu" title="Transformations" id="c8a-y6-VQd">
297
+                                                <items>
298
+                                                    <menuItem title="Make Upper Case" id="vmV-6d-7jI">
299
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
300
+                                                        <connections>
301
+                                                            <action selector="uppercaseWord:" target="Ady-hI-5gd" id="sPh-Tk-edu"/>
302
+                                                        </connections>
303
+                                                    </menuItem>
304
+                                                    <menuItem title="Make Lower Case" id="d9M-CD-aMd">
305
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
306
+                                                        <connections>
307
+                                                            <action selector="lowercaseWord:" target="Ady-hI-5gd" id="iUZ-b5-hil"/>
308
+                                                        </connections>
309
+                                                    </menuItem>
310
+                                                    <menuItem title="Capitalize" id="UEZ-Bs-lqG">
311
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
312
+                                                        <connections>
313
+                                                            <action selector="capitalizeWord:" target="Ady-hI-5gd" id="26H-TL-nsh"/>
314
+                                                        </connections>
315
+                                                    </menuItem>
316
+                                                </items>
317
+                                            </menu>
318
+                                        </menuItem>
319
+                                        <menuItem title="Speech" id="xrE-MZ-jX0">
320
+                                            <modifierMask key="keyEquivalentModifierMask"/>
321
+                                            <menu key="submenu" title="Speech" id="3rS-ZA-NoH">
322
+                                                <items>
323
+                                                    <menuItem title="Start Speaking" id="Ynk-f8-cLZ">
324
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
325
+                                                        <connections>
326
+                                                            <action selector="startSpeaking:" target="Ady-hI-5gd" id="654-Ng-kyl"/>
327
+                                                        </connections>
328
+                                                    </menuItem>
329
+                                                    <menuItem title="Stop Speaking" id="Oyz-dy-DGm">
330
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
331
+                                                        <connections>
332
+                                                            <action selector="stopSpeaking:" target="Ady-hI-5gd" id="dX8-6p-jy9"/>
333
+                                                        </connections>
334
+                                                    </menuItem>
335
+                                                </items>
336
+                                            </menu>
337
+                                        </menuItem>
338
+                                    </items>
339
+                                </menu>
340
+                            </menuItem>
341
+                            <menuItem title="Format" id="jxT-CU-nIS">
342
+                                <modifierMask key="keyEquivalentModifierMask"/>
343
+                                <menu key="submenu" title="Format" id="GEO-Iw-cKr">
344
+                                    <items>
345
+                                        <menuItem title="Font" id="Gi5-1S-RQB">
346
+                                            <modifierMask key="keyEquivalentModifierMask"/>
347
+                                            <menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
348
+                                                <items>
349
+                                                    <menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
350
+                                                        <connections>
351
+                                                            <action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
352
+                                                        </connections>
353
+                                                    </menuItem>
354
+                                                    <menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
355
+                                                        <connections>
356
+                                                            <action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
357
+                                                        </connections>
358
+                                                    </menuItem>
359
+                                                    <menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
360
+                                                        <connections>
361
+                                                            <action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
362
+                                                        </connections>
363
+                                                    </menuItem>
364
+                                                    <menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
365
+                                                        <connections>
366
+                                                            <action selector="underline:" target="Ady-hI-5gd" id="FYS-2b-JAY"/>
367
+                                                        </connections>
368
+                                                    </menuItem>
369
+                                                    <menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
370
+                                                    <menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
371
+                                                        <connections>
372
+                                                            <action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
373
+                                                        </connections>
374
+                                                    </menuItem>
375
+                                                    <menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
376
+                                                        <connections>
377
+                                                            <action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
378
+                                                        </connections>
379
+                                                    </menuItem>
380
+                                                    <menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
381
+                                                    <menuItem title="Kern" id="jBQ-r6-VK2">
382
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
383
+                                                        <menu key="submenu" title="Kern" id="tlD-Oa-oAM">
384
+                                                            <items>
385
+                                                                <menuItem title="Use Default" id="GUa-eO-cwY">
386
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
387
+                                                                    <connections>
388
+                                                                        <action selector="useStandardKerning:" target="Ady-hI-5gd" id="6dk-9l-Ckg"/>
389
+                                                                    </connections>
390
+                                                                </menuItem>
391
+                                                                <menuItem title="Use None" id="cDB-IK-hbR">
392
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
393
+                                                                    <connections>
394
+                                                                        <action selector="turnOffKerning:" target="Ady-hI-5gd" id="U8a-gz-Maa"/>
395
+                                                                    </connections>
396
+                                                                </menuItem>
397
+                                                                <menuItem title="Tighten" id="46P-cB-AYj">
398
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
399
+                                                                    <connections>
400
+                                                                        <action selector="tightenKerning:" target="Ady-hI-5gd" id="hr7-Nz-8ro"/>
401
+                                                                    </connections>
402
+                                                                </menuItem>
403
+                                                                <menuItem title="Loosen" id="ogc-rX-tC1">
404
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
405
+                                                                    <connections>
406
+                                                                        <action selector="loosenKerning:" target="Ady-hI-5gd" id="8i4-f9-FKE"/>
407
+                                                                    </connections>
408
+                                                                </menuItem>
409
+                                                            </items>
410
+                                                        </menu>
411
+                                                    </menuItem>
412
+                                                    <menuItem title="Ligatures" id="o6e-r0-MWq">
413
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
414
+                                                        <menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
415
+                                                            <items>
416
+                                                                <menuItem title="Use Default" id="agt-UL-0e3">
417
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
418
+                                                                    <connections>
419
+                                                                        <action selector="useStandardLigatures:" target="Ady-hI-5gd" id="7uR-wd-Dx6"/>
420
+                                                                    </connections>
421
+                                                                </menuItem>
422
+                                                                <menuItem title="Use None" id="J7y-lM-qPV">
423
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
424
+                                                                    <connections>
425
+                                                                        <action selector="turnOffLigatures:" target="Ady-hI-5gd" id="iX2-gA-Ilz"/>
426
+                                                                    </connections>
427
+                                                                </menuItem>
428
+                                                                <menuItem title="Use All" id="xQD-1f-W4t">
429
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
430
+                                                                    <connections>
431
+                                                                        <action selector="useAllLigatures:" target="Ady-hI-5gd" id="KcB-kA-TuK"/>
432
+                                                                    </connections>
433
+                                                                </menuItem>
434
+                                                            </items>
435
+                                                        </menu>
436
+                                                    </menuItem>
437
+                                                    <menuItem title="Baseline" id="OaQ-X3-Vso">
438
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
439
+                                                        <menu key="submenu" title="Baseline" id="ijk-EB-dga">
440
+                                                            <items>
441
+                                                                <menuItem title="Use Default" id="3Om-Ey-2VK">
442
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
443
+                                                                    <connections>
444
+                                                                        <action selector="unscript:" target="Ady-hI-5gd" id="0vZ-95-Ywn"/>
445
+                                                                    </connections>
446
+                                                                </menuItem>
447
+                                                                <menuItem title="Superscript" id="Rqc-34-cIF">
448
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
449
+                                                                    <connections>
450
+                                                                        <action selector="superscript:" target="Ady-hI-5gd" id="3qV-fo-wpU"/>
451
+                                                                    </connections>
452
+                                                                </menuItem>
453
+                                                                <menuItem title="Subscript" id="I0S-gh-46l">
454
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
455
+                                                                    <connections>
456
+                                                                        <action selector="subscript:" target="Ady-hI-5gd" id="Q6W-4W-IGz"/>
457
+                                                                    </connections>
458
+                                                                </menuItem>
459
+                                                                <menuItem title="Raise" id="2h7-ER-AoG">
460
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
461
+                                                                    <connections>
462
+                                                                        <action selector="raiseBaseline:" target="Ady-hI-5gd" id="4sk-31-7Q9"/>
463
+                                                                    </connections>
464
+                                                                </menuItem>
465
+                                                                <menuItem title="Lower" id="1tx-W0-xDw">
466
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
467
+                                                                    <connections>
468
+                                                                        <action selector="lowerBaseline:" target="Ady-hI-5gd" id="OF1-bc-KW4"/>
469
+                                                                    </connections>
470
+                                                                </menuItem>
471
+                                                            </items>
472
+                                                        </menu>
473
+                                                    </menuItem>
474
+                                                    <menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
475
+                                                    <menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
476
+                                                        <connections>
477
+                                                            <action selector="orderFrontColorPanel:" target="Ady-hI-5gd" id="mSX-Xz-DV3"/>
478
+                                                        </connections>
479
+                                                    </menuItem>
480
+                                                    <menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
481
+                                                    <menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
482
+                                                        <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
483
+                                                        <connections>
484
+                                                            <action selector="copyFont:" target="Ady-hI-5gd" id="GJO-xA-L4q"/>
485
+                                                        </connections>
486
+                                                    </menuItem>
487
+                                                    <menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
488
+                                                        <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
489
+                                                        <connections>
490
+                                                            <action selector="pasteFont:" target="Ady-hI-5gd" id="JfD-CL-leO"/>
491
+                                                        </connections>
492
+                                                    </menuItem>
493
+                                                </items>
494
+                                            </menu>
495
+                                        </menuItem>
496
+                                        <menuItem title="Text" id="Fal-I4-PZk">
497
+                                            <modifierMask key="keyEquivalentModifierMask"/>
498
+                                            <menu key="submenu" title="Text" id="d9c-me-L2H">
499
+                                                <items>
500
+                                                    <menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
501
+                                                        <connections>
502
+                                                            <action selector="alignLeft:" target="Ady-hI-5gd" id="zUv-R1-uAa"/>
503
+                                                        </connections>
504
+                                                    </menuItem>
505
+                                                    <menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
506
+                                                        <connections>
507
+                                                            <action selector="alignCenter:" target="Ady-hI-5gd" id="spX-mk-kcS"/>
508
+                                                        </connections>
509
+                                                    </menuItem>
510
+                                                    <menuItem title="Justify" id="J5U-5w-g23">
511
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
512
+                                                        <connections>
513
+                                                            <action selector="alignJustified:" target="Ady-hI-5gd" id="ljL-7U-jND"/>
514
+                                                        </connections>
515
+                                                    </menuItem>
516
+                                                    <menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
517
+                                                        <connections>
518
+                                                            <action selector="alignRight:" target="Ady-hI-5gd" id="r48-bG-YeY"/>
519
+                                                        </connections>
520
+                                                    </menuItem>
521
+                                                    <menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
522
+                                                    <menuItem title="Writing Direction" id="H1b-Si-o9J">
523
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
524
+                                                        <menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
525
+                                                            <items>
526
+                                                                <menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
527
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
528
+                                                                </menuItem>
529
+                                                                <menuItem title="  Default" id="YGs-j5-SAR">
530
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
531
+                                                                    <connections>
532
+                                                                        <action selector="makeBaseWritingDirectionNatural:" target="Ady-hI-5gd" id="qtV-5e-UBP"/>
533
+                                                                    </connections>
534
+                                                                </menuItem>
535
+                                                                <menuItem title="  Left to Right" id="Lbh-J2-qVU">
536
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
537
+                                                                    <connections>
538
+                                                                        <action selector="makeBaseWritingDirectionLeftToRight:" target="Ady-hI-5gd" id="S0X-9S-QSf"/>
539
+                                                                    </connections>
540
+                                                                </menuItem>
541
+                                                                <menuItem title="  Right to Left" id="jFq-tB-4Kx">
542
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
543
+                                                                    <connections>
544
+                                                                        <action selector="makeBaseWritingDirectionRightToLeft:" target="Ady-hI-5gd" id="5fk-qB-AqJ"/>
545
+                                                                    </connections>
546
+                                                                </menuItem>
547
+                                                                <menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
548
+                                                                <menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
549
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
550
+                                                                </menuItem>
551
+                                                                <menuItem title="  Default" id="Nop-cj-93Q">
552
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
553
+                                                                    <connections>
554
+                                                                        <action selector="makeTextWritingDirectionNatural:" target="Ady-hI-5gd" id="lPI-Se-ZHp"/>
555
+                                                                    </connections>
556
+                                                                </menuItem>
557
+                                                                <menuItem title="  Left to Right" id="BgM-ve-c93">
558
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
559
+                                                                    <connections>
560
+                                                                        <action selector="makeTextWritingDirectionLeftToRight:" target="Ady-hI-5gd" id="caW-Bv-w94"/>
561
+                                                                    </connections>
562
+                                                                </menuItem>
563
+                                                                <menuItem title="  Right to Left" id="RB4-Sm-HuC">
564
+                                                                    <modifierMask key="keyEquivalentModifierMask"/>
565
+                                                                    <connections>
566
+                                                                        <action selector="makeTextWritingDirectionRightToLeft:" target="Ady-hI-5gd" id="EXD-6r-ZUu"/>
567
+                                                                    </connections>
568
+                                                                </menuItem>
569
+                                                            </items>
570
+                                                        </menu>
571
+                                                    </menuItem>
572
+                                                    <menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
573
+                                                    <menuItem title="Show Ruler" id="vLm-3I-IUL">
574
+                                                        <modifierMask key="keyEquivalentModifierMask"/>
575
+                                                        <connections>
576
+                                                            <action selector="toggleRuler:" target="Ady-hI-5gd" id="FOx-HJ-KwY"/>
577
+                                                        </connections>
578
+                                                    </menuItem>
579
+                                                    <menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
580
+                                                        <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
581
+                                                        <connections>
582
+                                                            <action selector="copyRuler:" target="Ady-hI-5gd" id="71i-fW-3W2"/>
583
+                                                        </connections>
584
+                                                    </menuItem>
585
+                                                    <menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
586
+                                                        <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
587
+                                                        <connections>
588
+                                                            <action selector="pasteRuler:" target="Ady-hI-5gd" id="cSh-wd-qM2"/>
589
+                                                        </connections>
590
+                                                    </menuItem>
591
+                                                </items>
592
+                                            </menu>
593
+                                        </menuItem>
594
+                                    </items>
595
+                                </menu>
596
+                            </menuItem>
597
+                            <menuItem title="View" id="H8h-7b-M4v">
598
+                                <modifierMask key="keyEquivalentModifierMask"/>
599
+                                <menu key="submenu" title="View" id="HyV-fh-RgO">
600
+                                    <items>
601
+                                        <menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
602
+                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
603
+                                            <connections>
604
+                                                <action selector="toggleToolbarShown:" target="Ady-hI-5gd" id="BXY-wc-z0C"/>
605
+                                            </connections>
606
+                                        </menuItem>
607
+                                        <menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
608
+                                            <modifierMask key="keyEquivalentModifierMask"/>
609
+                                            <connections>
610
+                                                <action selector="runToolbarCustomizationPalette:" target="Ady-hI-5gd" id="pQI-g3-MTW"/>
611
+                                            </connections>
612
+                                        </menuItem>
613
+                                        <menuItem isSeparatorItem="YES" id="hB3-LF-h0Y"/>
614
+                                        <menuItem title="Show Sidebar" keyEquivalent="s" id="kIP-vf-haE">
615
+                                            <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
616
+                                            <connections>
617
+                                                <action selector="toggleSidebar:" target="Ady-hI-5gd" id="iwa-gc-5KM"/>
618
+                                            </connections>
619
+                                        </menuItem>
620
+                                        <menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
621
+                                            <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
622
+                                            <connections>
623
+                                                <action selector="toggleFullScreen:" target="Ady-hI-5gd" id="dU3-MA-1Rq"/>
624
+                                            </connections>
625
+                                        </menuItem>
626
+                                    </items>
627
+                                </menu>
628
+                            </menuItem>
629
+                            <menuItem title="Window" id="aUF-d1-5bR">
630
+                                <modifierMask key="keyEquivalentModifierMask"/>
631
+                                <menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
632
+                                    <items>
633
+                                        <menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
634
+                                            <connections>
635
+                                                <action selector="performMiniaturize:" target="Ady-hI-5gd" id="VwT-WD-YPe"/>
636
+                                            </connections>
637
+                                        </menuItem>
638
+                                        <menuItem title="Zoom" id="R4o-n2-Eq4">
639
+                                            <modifierMask key="keyEquivalentModifierMask"/>
640
+                                            <connections>
641
+                                                <action selector="performZoom:" target="Ady-hI-5gd" id="DIl-cC-cCs"/>
642
+                                            </connections>
643
+                                        </menuItem>
644
+                                        <menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
645
+                                        <menuItem title="Bring All to Front" id="LE2-aR-0XJ">
646
+                                            <modifierMask key="keyEquivalentModifierMask"/>
647
+                                            <connections>
648
+                                                <action selector="arrangeInFront:" target="Ady-hI-5gd" id="DRN-fu-gQh"/>
649
+                                            </connections>
650
+                                        </menuItem>
651
+                                    </items>
652
+                                </menu>
653
+                            </menuItem>
654
+                            <menuItem title="Help" id="wpr-3q-Mcd">
655
+                                <modifierMask key="keyEquivalentModifierMask"/>
656
+                                <menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
657
+                                    <items>
658
+                                        <menuItem title="rncTesterApp-macOS Help" keyEquivalent="?" id="FKE-Sm-Kum">
659
+                                            <connections>
660
+                                                <action selector="showHelp:" target="Ady-hI-5gd" id="y7X-2Q-9no"/>
661
+                                            </connections>
662
+                                        </menuItem>
663
+                                    </items>
664
+                                </menu>
665
+                            </menuItem>
666
+                        </items>
667
+                    </menu>
668
+                    <connections>
669
+                        <outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
670
+                    </connections>
671
+                </application>
672
+                <customObject id="Voe-Tx-rLC" customClass="AppDelegate"/>
673
+                <customObject id="YLy-65-1bz" customClass="NSFontManager"/>
674
+                <customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
675
+            </objects>
676
+            <point key="canvasLocation" x="75" y="0.0"/>
677
+        </scene>
678
+        <!--Window Controller-->
679
+        <scene sceneID="R2V-B0-nI4">
680
+            <objects>
681
+                <windowController id="B8D-0N-5wS" sceneMemberID="viewController">
682
+                    <window key="window" title="example macOS" allowsToolTipsWhenApplicationIsInactive="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="IQv-IB-iLA">
683
+                        <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
684
+                        <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
685
+                        <rect key="contentRect" x="196" y="240" width="480" height="270"/>
686
+                        <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
687
+                        <connections>
688
+                            <outlet property="delegate" destination="B8D-0N-5wS" id="98r-iN-zZc"/>
689
+                        </connections>
690
+                    </window>
691
+                    <connections>
692
+                        <segue destination="XfG-lQ-9wD" kind="relationship" relationship="window.shadowedContentViewController" id="cq2-FE-JQM"/>
693
+                    </connections>
694
+                </windowController>
695
+                <customObject id="Oky-zY-oP4" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
696
+            </objects>
697
+            <point key="canvasLocation" x="75" y="250"/>
698
+        </scene>
699
+        <!--View Controller-->
700
+        <scene sceneID="hIz-AP-VOD">
701
+            <objects>
702
+                <viewController id="XfG-lQ-9wD" customClass="ViewController" sceneMemberID="viewController">
703
+                    <view key="view" wantsLayer="YES" id="m2S-Jp-Qdl">
704
+                        <rect key="frame" x="0.0" y="0.0" width="480" height="270"/>
705
+                        <autoresizingMask key="autoresizingMask"/>
706
+                    </view>
707
+                </viewController>
708
+                <customObject id="rPt-NT-nkU" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
709
+            </objects>
710
+            <point key="canvasLocation" x="75" y="655"/>
711
+        </scene>
712
+    </scenes>
713
+</document>

+ 12
- 0
example/macos/example-macOS/ViewController.h View File

@@ -0,0 +1,12 @@
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 <Cocoa/Cocoa.h>
9
+
10
+@interface ViewController : NSViewController
11
+
12
+@end

+ 29
- 0
example/macos/example-macOS/ViewController.m View File

@@ -0,0 +1,29 @@
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 "ViewController.h"
9
+#import "AppDelegate.h"
10
+
11
+#import <React/RCTRootView.h>
12
+
13
+@implementation ViewController
14
+
15
+- (void)viewDidLoad {
16
+  [super viewDidLoad];
17
+
18
+  RCTBridge *bridge = [((AppDelegate *)[NSApp delegate])bridge];
19
+  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"example" initialProperties:nil];
20
+
21
+  NSView *view = [self view];
22
+
23
+  [view addSubview:rootView];
24
+  [rootView setBackgroundColor:[NSColor windowBackgroundColor]];
25
+  [rootView setFrame:[view bounds]];
26
+  [rootView setAutoresizingMask:(NSViewMinXMargin | NSViewMinXMargin | NSViewMinYMargin | NSViewMaxYMargin | NSViewWidthSizable | NSViewHeightSizable)];
27
+}
28
+
29
+@end

+ 12
- 0
example/macos/example-macOS/main.m View File

@@ -0,0 +1,12 @@
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 <Cocoa/Cocoa.h>
9
+
10
+int main(int argc, const char *argv[]) {
11
+  return NSApplicationMain(argc, argv);
12
+}

+ 1569
- 0
example/macos/example.xcodeproj/project.pbxproj
File diff suppressed because it is too large
View File


+ 10
- 0
example/macos/example.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings View File

@@ -0,0 +1,10 @@
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>BuildSystemType</key>
6
+	<string>Original</string>
7
+	<key>PreviewsEnabled</key>
8
+	<false/>
9
+</dict>
10
+</plist>

+ 92
- 0
example/macos/example.xcodeproj/xcshareddata/xcschemes/example-macOS.xcscheme View File

@@ -0,0 +1,92 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Scheme
3
+   LastUpgradeVersion = "1120"
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 = "6B857DA21EC51FC600A9D063"
18
+               BuildableName = "libReact.a"
19
+               BlueprintName = "React-macOS"
20
+               ReferencedContainer = "container:../../node_modules/react-native-macos/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 = "38C1415723BBE33000902604"
32
+               BuildableName = "example-macOS.app"
33
+               BlueprintName = "example-macOS"
34
+               ReferencedContainer = "container:example.xcodeproj">
35
+            </BuildableReference>
36
+         </BuildActionEntry>
37
+      </BuildActionEntries>
38
+   </BuildAction>
39
+   <TestAction
40
+      buildConfiguration = "Debug"
41
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
42
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
43
+      shouldUseLaunchSchemeArgsEnv = "YES">
44
+      <Testables>
45
+      </Testables>
46
+   </TestAction>
47
+   <LaunchAction
48
+      buildConfiguration = "Debug"
49
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
50
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
51
+      launchStyle = "0"
52
+      useCustomWorkingDirectory = "NO"
53
+      ignoresPersistentStateOnLaunch = "NO"
54
+      debugDocumentVersioning = "YES"
55
+      debugServiceExtension = "internal"
56
+      allowLocationSimulation = "YES">
57
+      <BuildableProductRunnable
58
+         runnableDebuggingMode = "0">
59
+         <BuildableReference
60
+            BuildableIdentifier = "primary"
61
+            BlueprintIdentifier = "38C1415723BBE33000902604"
62
+            BuildableName = "example-macOS.app"
63
+            BlueprintName = "example-macOS"
64
+            ReferencedContainer = "container:example.xcodeproj">
65
+         </BuildableReference>
66
+      </BuildableProductRunnable>
67
+   </LaunchAction>
68
+   <ProfileAction
69
+      buildConfiguration = "Release"
70
+      shouldUseLaunchSchemeArgsEnv = "YES"
71
+      savedToolIdentifier = ""
72
+      useCustomWorkingDirectory = "NO"
73
+      debugDocumentVersioning = "YES">
74
+      <BuildableProductRunnable
75
+         runnableDebuggingMode = "0">
76
+         <BuildableReference
77
+            BuildableIdentifier = "primary"
78
+            BlueprintIdentifier = "38C1415723BBE33000902604"
79
+            BuildableName = "example-macOS.app"
80
+            BlueprintName = "example-macOS"
81
+            ReferencedContainer = "container:example.xcodeproj">
82
+         </BuildableReference>
83
+      </BuildableProductRunnable>
84
+   </ProfileAction>
85
+   <AnalyzeAction
86
+      buildConfiguration = "Debug">
87
+   </AnalyzeAction>
88
+   <ArchiveAction
89
+      buildConfiguration = "Release"
90
+      revealArchiveInOrganizer = "YES">
91
+   </ArchiveAction>
92
+</Scheme>

+ 92
- 0
example/macos/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme View File

@@ -0,0 +1,92 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Scheme
3
+   LastUpgradeVersion = "1120"
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-macos/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
+      </BuildActionEntries>
38
+   </BuildAction>
39
+   <TestAction
40
+      buildConfiguration = "Debug"
41
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
42
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
43
+      shouldUseLaunchSchemeArgsEnv = "YES">
44
+      <Testables>
45
+      </Testables>
46
+   </TestAction>
47
+   <LaunchAction
48
+      buildConfiguration = "Debug"
49
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
50
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
51
+      launchStyle = "0"
52
+      useCustomWorkingDirectory = "NO"
53
+      ignoresPersistentStateOnLaunch = "NO"
54
+      debugDocumentVersioning = "YES"
55
+      debugServiceExtension = "internal"
56
+      allowLocationSimulation = "YES">
57
+      <BuildableProductRunnable
58
+         runnableDebuggingMode = "0">
59
+         <BuildableReference
60
+            BuildableIdentifier = "primary"
61
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
62
+            BuildableName = "example.app"
63
+            BlueprintName = "example"
64
+            ReferencedContainer = "container:example.xcodeproj">
65
+         </BuildableReference>
66
+      </BuildableProductRunnable>
67
+   </LaunchAction>
68
+   <ProfileAction
69
+      buildConfiguration = "Release"
70
+      shouldUseLaunchSchemeArgsEnv = "YES"
71
+      savedToolIdentifier = ""
72
+      useCustomWorkingDirectory = "NO"
73
+      debugDocumentVersioning = "YES">
74
+      <BuildableProductRunnable
75
+         runnableDebuggingMode = "0">
76
+         <BuildableReference
77
+            BuildableIdentifier = "primary"
78
+            BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
79
+            BuildableName = "example.app"
80
+            BlueprintName = "example"
81
+            ReferencedContainer = "container:example.xcodeproj">
82
+         </BuildableReference>
83
+      </BuildableProductRunnable>
84
+   </ProfileAction>
85
+   <AnalyzeAction
86
+      buildConfiguration = "Debug">
87
+   </AnalyzeAction>
88
+   <ArchiveAction
89
+      buildConfiguration = "Release"
90
+      revealArchiveInOrganizer = "YES">
91
+   </ArchiveAction>
92
+</Scheme>

+ 15
- 0
example/macos/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/macos/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/macos/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>

+ 53
- 0
example/macos/example/Images.xcassets/AppIcon.appiconset/Contents.json View File

@@ -0,0 +1,53 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "idiom" : "iphone",
5
+      "size" : "20x20",
6
+      "scale" : "2x"
7
+    },
8
+    {
9
+      "idiom" : "iphone",
10
+      "size" : "20x20",
11
+      "scale" : "3x"
12
+    },
13
+    {
14
+      "idiom" : "iphone",
15
+      "size" : "29x29",
16
+      "scale" : "2x"
17
+    },
18
+    {
19
+      "idiom" : "iphone",
20
+      "size" : "29x29",
21
+      "scale" : "3x"
22
+    },
23
+    {
24
+      "idiom" : "iphone",
25
+      "size" : "40x40",
26
+      "scale" : "2x"
27
+    },
28
+    {
29
+      "idiom" : "iphone",
30
+      "size" : "40x40",
31
+      "scale" : "3x"
32
+    },
33
+    {
34
+      "idiom" : "iphone",
35
+      "size" : "60x60",
36
+      "scale" : "2x"
37
+    },
38
+    {
39
+      "idiom" : "iphone",
40
+      "size" : "60x60",
41
+      "scale" : "3x"
42
+    },
43
+    {
44
+      "idiom" : "ios-marketing",
45
+      "size" : "1024x1024",
46
+      "scale" : "1x"
47
+    }
48
+  ],
49
+  "info" : {
50
+    "version" : 1,
51
+    "author" : "xcode"
52
+  }
53
+}

+ 6
- 0
example/macos/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/macos/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/macos/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
+}

+ 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
+}

+ 168
- 39
ios/RNCWebView.m View File

@@ -9,7 +9,11 @@
9 9
 #import <React/RCTConvert.h>
10 10
 #import <React/RCTAutoInsetsProtocol.h>
11 11
 #import "RNCWKProcessPoolManager.h"
12
+#if !TARGET_OS_OSX
12 13
 #import <UIKit/UIKit.h>
14
+#else
15
+#import <React/RCTUIKit.h>
16
+#endif // !TARGET_OS_OSX
13 17
 
14 18
 #import "objc/runtime.h"
15 19
 
@@ -19,6 +23,7 @@ static NSString *const MessageHandlerName = @"ReactNativeWebView";
19 23
 static NSURLCredential* clientAuthenticationCredential;
20 24
 static NSDictionary* customCertificatesForHost;
21 25
 
26
+#if !TARGET_OS_OSX
22 27
 // runtime trick to remove WKWebView keyboard default toolbar
23 28
 // see: http://stackoverflow.com/questions/19033292/ios-7-uiwebview-keyboard-issue/19042279#19042279
24 29
 @interface _SwizzleHelperWK : UIView
@@ -39,8 +44,29 @@ static NSDictionary* customCertificatesForHost;
39 44
     return nil;
40 45
 }
41 46
 @end
47
+#endif // !TARGET_OS_OSX
48
+
49
+#if TARGET_OS_OSX
50
+@interface RNCWKWebView : WKWebView
51
+@end
52
+@implementation RNCWKWebView
53
+- (void)scrollWheel:(NSEvent *)theEvent {
54
+  RNCWebView *rncWebView = (RNCWebView *)[self superview];
55
+  RCTAssert([rncWebView isKindOfClass:[rncWebView class]], @"superview must be an RNCWebView");
56
+  if (![rncWebView scrollEnabled]) {
57
+    [[self nextResponder] scrollWheel:theEvent];
58
+    return;
59
+  }
60
+  [super scrollWheel:theEvent];
61
+}
62
+@end
63
+#endif // TARGET_OS_OSX
42 64
 
43
-@interface RNCWebView () <WKUIDelegate, WKNavigationDelegate, WKScriptMessageHandler, UIScrollViewDelegate, RCTAutoInsetsProtocol>
65
+@interface RNCWebView () <WKUIDelegate, WKNavigationDelegate, WKScriptMessageHandler,
66
+#if !TARGET_OS_OSX
67
+    UIScrollViewDelegate,
68
+#endif // !TARGET_OS_OSX
69
+    RCTAutoInsetsProtocol>
44 70
 @property (nonatomic, copy) RCTDirectEventBlock onLoadingStart;
45 71
 @property (nonatomic, copy) RCTDirectEventBlock onLoadingFinish;
46 72
 @property (nonatomic, copy) RCTDirectEventBlock onLoadingError;
@@ -50,7 +76,11 @@ static NSDictionary* customCertificatesForHost;
50 76
 @property (nonatomic, copy) RCTDirectEventBlock onMessage;
51 77
 @property (nonatomic, copy) RCTDirectEventBlock onScroll;
52 78
 @property (nonatomic, copy) RCTDirectEventBlock onContentProcessDidTerminate;
79
+#if !TARGET_OS_OSX
53 80
 @property (nonatomic, copy) WKWebView *webView;
81
+#else
82
+@property (nonatomic, copy) RNCWKWebView *webView;
83
+#endif // !TARGET_OS_OSX
54 84
 @property (nonatomic, strong) WKUserScript *postMessageScript;
55 85
 @property (nonatomic, strong) WKUserScript *atStartScript;
56 86
 @property (nonatomic, strong) WKUserScript *atEndScript;
@@ -58,14 +88,20 @@ static NSDictionary* customCertificatesForHost;
58 88
 
59 89
 @implementation RNCWebView
60 90
 {
91
+#if !TARGET_OS_OSX
61 92
   UIColor * _savedBackgroundColor;
93
+#else
94
+  RCTUIColor * _savedBackgroundColor;
95
+#endif // !TARGET_OS_OSX
62 96
   BOOL _savedHideKeyboardAccessoryView;
63 97
   BOOL _savedKeyboardDisplayRequiresUserAction;
64 98
 
65 99
   // Workaround for StatusBar appearance bug for iOS 12
66 100
   // https://github.com/react-native-community/react-native-webview/issues/62
67 101
   BOOL _isFullScreenVideoOpen;
102
+#if !TARGET_OS_OSX
68 103
   UIStatusBarStyle _savedStatusBarStyle;
104
+#endif // !TARGET_OS_OSX
69 105
   BOOL _savedStatusBarHidden;
70 106
 
71 107
 #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */
@@ -76,7 +112,11 @@ static NSDictionary* customCertificatesForHost;
76 112
 - (instancetype)initWithFrame:(CGRect)frame
77 113
 {
78 114
   if ((self = [super initWithFrame:frame])) {
115
+    #if !TARGET_OS_OSX
79 116
     super.backgroundColor = [UIColor clearColor];
117
+    #else
118
+    super.backgroundColor = [RCTUIColor clearColor];
119
+    #endif // !TARGET_OS_OSX
80 120
     _bounces = YES;
81 121
     _scrollEnabled = YES;
82 122
     _showsHorizontalScrollIndicator = YES;
@@ -85,8 +125,10 @@ static NSDictionary* customCertificatesForHost;
85 125
     _automaticallyAdjustContentInsets = YES;
86 126
     _contentInset = UIEdgeInsetsZero;
87 127
     _savedKeyboardDisplayRequiresUserAction = YES;
128
+    #if !TARGET_OS_OSX
88 129
     _savedStatusBarStyle = RCTSharedApplication().statusBarStyle;
89 130
     _savedStatusBarHidden = RCTSharedApplication().statusBarHidden;
131
+    #endif // !TARGET_OS_OSX
90 132
     _injectedJavaScript = nil;
91 133
     _injectedJavaScriptForMainFrameOnly = YES;
92 134
     _injectedJavaScriptBeforeContentLoaded = nil;
@@ -97,6 +139,7 @@ static NSDictionary* customCertificatesForHost;
97 139
 #endif
98 140
   }
99 141
 
142
+#if !TARGET_OS_OSX
100 143
   if (@available(iOS 12.0, *)) {
101 144
     // Workaround for a keyboard dismissal bug present in iOS 12
102 145
     // https://openradar.appspot.com/radar?id=5018321736957952
@@ -121,7 +164,7 @@ static NSDictionary* customCertificatesForHost;
121 164
                                                    name:UIWindowDidBecomeHiddenNotification
122 165
                                                  object:nil];
123 166
   }
124
-
167
+#endif // !TARGET_OS_OSX
125 168
   return self;
126 169
 }
127 170
 
@@ -170,9 +213,9 @@ static NSDictionary* customCertificatesForHost;
170 213
   // Shim the HTML5 history API:
171 214
   [wkWebViewConfig.userContentController addScriptMessageHandler:[[RNCWeakScriptMessageDelegate alloc] initWithDelegate:self]
172 215
                                                             name:HistoryShimName];
173
-
174 216
   [self resetupScripts:wkWebViewConfig];
175 217
 
218
+#if !TARGET_OS_OSX
176 219
   wkWebViewConfig.allowsInlineMediaPlayback = _allowsInlineMediaPlayback;
177 220
 #if WEBKIT_IOS_10_APIS_AVAILABLE
178 221
   wkWebViewConfig.mediaTypesRequiringUserActionForPlayback = _mediaPlaybackRequiresUserAction
@@ -182,6 +225,7 @@ static NSDictionary* customCertificatesForHost;
182 225
 #else
183 226
   wkWebViewConfig.mediaPlaybackRequiresUserAction = _mediaPlaybackRequiresUserAction;
184 227
 #endif
228
+#endif // !TARGET_OS_OSX
185 229
 
186 230
   if (_applicationNameForUserAgent) {
187 231
       wkWebViewConfig.applicationNameForUserAgent = [NSString stringWithFormat:@"%@ %@", wkWebViewConfig.applicationNameForUserAgent, _applicationNameForUserAgent];
@@ -194,17 +238,26 @@ static NSDictionary* customCertificatesForHost;
194 238
 {
195 239
   if (self.window != nil && _webView == nil) {
196 240
     WKWebViewConfiguration *wkWebViewConfig = [self setUpWkWebViewConfig];
241
+#if !TARGET_OS_OSX
197 242
     _webView = [[WKWebView alloc] initWithFrame:self.bounds configuration: wkWebViewConfig];
243
+#else
244
+    _webView = [[RNCWKWebView alloc] initWithFrame:self.bounds configuration: wkWebViewConfig];
245
+#endif // !TARGET_OS_OSX
246
+
198 247
     [self setBackgroundColor: _savedBackgroundColor];
248
+#if !TARGET_OS_OSX
199 249
     _webView.scrollView.delegate = self;
250
+#endif // !TARGET_OS_OSX
200 251
     _webView.UIDelegate = self;
201 252
     _webView.navigationDelegate = self;
253
+#if !TARGET_OS_OSX
202 254
     _webView.scrollView.scrollEnabled = _scrollEnabled;
203 255
     _webView.scrollView.pagingEnabled = _pagingEnabled;
204 256
     _webView.scrollView.bounces = _bounces;
205 257
     _webView.scrollView.showsHorizontalScrollIndicator = _showsHorizontalScrollIndicator;
206 258
     _webView.scrollView.showsVerticalScrollIndicator = _showsVerticalScrollIndicator;
207 259
     _webView.scrollView.directionalLockEnabled = _directionalLockEnabled;
260
+#endif // !TARGET_OS_OSX
208 261
     _webView.allowsLinkPreview = _allowsLinkPreview;
209 262
     [_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
210 263
     _webView.allowsBackForwardNavigationGestures = _allowsBackForwardNavigationGestures;
@@ -238,13 +291,16 @@ static NSDictionary* customCertificatesForHost;
238 291
         [_webView.configuration.userContentController removeScriptMessageHandlerForName:MessageHandlerName];
239 292
         [_webView removeObserver:self forKeyPath:@"estimatedProgress"];
240 293
         [_webView removeFromSuperview];
294
+#if !TARGET_OS_OSX
241 295
         _webView.scrollView.delegate = nil;
296
+#endif // !TARGET_OS_OSX
242 297
         _webView = nil;
243 298
     }
244 299
 
245 300
     [super removeFromSuperview];
246 301
 }
247 302
 
303
+#if !TARGET_OS_OSX
248 304
 -(void)showFullScreenVideoStatusBars
249 305
 {
250 306
 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
@@ -292,6 +348,7 @@ static NSDictionary* customCertificatesForHost;
292 348
       }];
293 349
     }
294 350
 }
351
+#endif // !TARGET_OS_OSX
295 352
 
296 353
 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
297 354
     if ([keyPath isEqual:@"estimatedProgress"] && object == self.webView) {
@@ -305,7 +362,11 @@ static NSDictionary* customCertificatesForHost;
305 362
     }
306 363
 }
307 364
 
365
+#if !TARGET_OS_OSX
308 366
 - (void)setBackgroundColor:(UIColor *)backgroundColor
367
+#else
368
+- (void)setBackgroundColor:(RCTUIColor *)backgroundColor
369
+#endif // !TARGET_OS_OSX
309 370
 {
310 371
   _savedBackgroundColor = backgroundColor;
311 372
   if (_webView == nil) {
@@ -313,9 +374,20 @@ static NSDictionary* customCertificatesForHost;
313 374
   }
314 375
 
315 376
   CGFloat alpha = CGColorGetAlpha(backgroundColor.CGColor);
316
-  self.opaque = _webView.opaque = (alpha == 1.0);
377
+  BOOL opaque = (alpha == 1.0);
378
+#if !TARGET_OS_OSX
379
+  self.opaque = _webView.opaque = opaque;
317 380
   _webView.scrollView.backgroundColor = backgroundColor;
318 381
   _webView.backgroundColor = backgroundColor;
382
+#else
383
+  // https://stackoverflow.com/questions/40007753/macos-wkwebview-background-transparency
384
+  NSOperatingSystemVersion version = { 10, 12, 0 };
385
+  if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:version]) {
386
+    [_webView setValue:@(opaque) forKey: @"drawsBackground"];
387
+  } else {
388
+    [_webView setValue:@(!opaque) forKey: @"drawsTransparentBackground"];
389
+  }
390
+#endif // !TARGET_OS_OSX
319 391
 }
320 392
 
321 393
 #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */
@@ -378,6 +450,7 @@ static NSDictionary* customCertificatesForHost;
378 450
   }
379 451
 }
380 452
 
453
+#if !TARGET_OS_OSX
381 454
 - (void)setContentInset:(UIEdgeInsets)contentInset
382 455
 {
383 456
   _contentInset = contentInset;
@@ -392,6 +465,7 @@ static NSDictionary* customCertificatesForHost;
392 465
                     withScrollView:_webView.scrollView
393 466
                       updateOffset:YES];
394 467
 }
468
+#endif // !TARGET_OS_OSX
395 469
 
396 470
 - (void)visitSource
397 471
 {
@@ -428,6 +502,7 @@ static NSDictionary* customCertificatesForHost;
428 502
     }
429 503
 }
430 504
 
505
+#if !TARGET_OS_OSX
431 506
 -(void)setKeyboardDisplayRequiresUserAction:(BOOL)keyboardDisplayRequiresUserAction
432 507
 {
433 508
     if (_webView == nil) {
@@ -533,17 +608,23 @@ static NSDictionary* customCertificatesForHost;
533 608
     object_setClass(subview, newClass);
534 609
 }
535 610
 
611
+// UIScrollViewDelegate method
536 612
 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
537 613
 {
538 614
   scrollView.decelerationRate = _decelerationRate;
539 615
 }
616
+#endif // !TARGET_OS_OSX
540 617
 
541 618
 - (void)setScrollEnabled:(BOOL)scrollEnabled
542 619
 {
543 620
   _scrollEnabled = scrollEnabled;
621
+#if !TARGET_OS_OSX
544 622
   _webView.scrollView.scrollEnabled = scrollEnabled;
623
+#endif // !TARGET_OS_OSX
545 624
 }
546 625
 
626
+#if !TARGET_OS_OSX
627
+// UIScrollViewDelegate method
547 628
 - (void)scrollViewDidScroll:(UIScrollView *)scrollView
548 629
 {
549 630
   // Don't allow scrolling the scrollView.
@@ -593,6 +674,7 @@ static NSDictionary* customCertificatesForHost;
593 674
     _showsVerticalScrollIndicator = showsVerticalScrollIndicator;
594 675
     _webView.scrollView.showsVerticalScrollIndicator = showsVerticalScrollIndicator;
595 676
 }
677
+#endif // !TARGET_OS_OSX
596 678
 
597 679
 - (void)postMessage:(NSString *)message
598 680
 {
@@ -610,7 +692,9 @@ static NSDictionary* customCertificatesForHost;
610 692
 
611 693
   // Ensure webview takes the position and dimensions of RNCWebView
612 694
   _webView.frame = self.bounds;
695
+#if !TARGET_OS_OSX
613 696
   _webView.scrollView.contentInset = _contentInset;
697
+#endif // !TARGET_OS_OSX
614 698
 }
615 699
 
616 700
 - (NSMutableDictionary<NSString *, id> *)baseEvent
@@ -672,52 +756,95 @@ static NSDictionary* customCertificatesForHost;
672 756
 #pragma mark - WKNavigationDelegate methods
673 757
 
674 758
 /**
675
-* alert
676
-*/
759
+ * alert
760
+ */
677 761
 - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
678 762
 {
679
-    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:message preferredStyle:UIAlertControllerStyleAlert];
680
-    [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
681
-        completionHandler();
682
-    }]];
683
-    [[self topViewController] presentViewController:alert animated:YES completion:NULL];
684
-
763
+#if !TARGET_OS_OSX
764
+  UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:message preferredStyle:UIAlertControllerStyleAlert];
765
+  [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
766
+    completionHandler();
767
+  }]];
768
+  [[self topViewController] presentViewController:alert animated:YES completion:NULL];
769
+#else
770
+  NSAlert *alert = [[NSAlert alloc] init];
771
+  [alert setMessageText:message];
772
+  [alert beginSheetModalForWindow:[NSApp keyWindow] completionHandler:^(__unused NSModalResponse response){
773
+    completionHandler();
774
+  }];
775
+#endif // !TARGET_OS_OSX
685 776
 }
686 777
 
687 778
 /**
688
-* confirm
689
-*/
779
+ * confirm
780
+ */
690 781
 - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{
691
-    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:message preferredStyle:UIAlertControllerStyleAlert];
692
-    [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
693
-        completionHandler(YES);
694
-    }]];
695
-    [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
696
-        completionHandler(NO);
697
-    }]];
698
-    [[self topViewController] presentViewController:alert animated:YES completion:NULL];
782
+#if !TARGET_OS_OSX
783
+  UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:message preferredStyle:UIAlertControllerStyleAlert];
784
+  [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
785
+    completionHandler(YES);
786
+  }]];
787
+  [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
788
+    completionHandler(NO);
789
+  }]];
790
+  [[self topViewController] presentViewController:alert animated:YES completion:NULL];
791
+#else
792
+  NSAlert *alert = [[NSAlert alloc] init];
793
+  [alert setMessageText:message];
794
+  [alert addButtonWithTitle:NSLocalizedString(@"OK", @"OK button")];
795
+  [alert addButtonWithTitle:NSLocalizedString(@"Cancel", @"Cancel button")];
796
+  void (^callbacksHandlers)(NSModalResponse response) = ^void(NSModalResponse response) {
797
+    completionHandler(response == NSAlertFirstButtonReturn);
798
+  };
799
+  [alert beginSheetModalForWindow:[NSApp keyWindow] completionHandler:callbacksHandlers];
800
+#endif // !TARGET_OS_OSX
699 801
 }
700 802
 
701 803
 /**
702
-* prompt
703
-*/
804
+ * prompt
805
+ */
704 806
 - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *))completionHandler{
705
-    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:prompt preferredStyle:UIAlertControllerStyleAlert];
706
-    [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
707
-        textField.text = defaultText;
708
-    }];
709
-    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
710
-        completionHandler([[alert.textFields lastObject] text]);
711
-    }];
712
-    [alert addAction:okAction];
713
-    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
714
-        completionHandler(nil);
715
-    }];
716
-    [alert addAction:cancelAction];
717
-    alert.preferredAction = okAction;
718
-    [[self topViewController] presentViewController:alert animated:YES completion:NULL];
807
+#if !TARGET_OS_OSX
808
+  UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:prompt preferredStyle:UIAlertControllerStyleAlert];
809
+  [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) {
810
+    textField.text = defaultText;
811
+  }];
812
+  UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
813
+    completionHandler([[alert.textFields lastObject] text]);
814
+  }];
815
+  [alert addAction:okAction];
816
+  UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
817
+    completionHandler(nil);
818
+  }];
819
+  [alert addAction:cancelAction];
820
+  alert.preferredAction = okAction;
821
+  [[self topViewController] presentViewController:alert animated:YES completion:NULL];
822
+#else
823
+  NSAlert *alert = [[NSAlert alloc] init];
824
+  [alert setMessageText:prompt];
825
+
826
+  const NSRect RCTSingleTextFieldFrame = NSMakeRect(0.0, 0.0, 275.0, 22.0);
827
+  NSTextField *textField = [[NSTextField alloc] initWithFrame:RCTSingleTextFieldFrame];
828
+  textField.cell.scrollable = YES;
829
+  if (@available(macOS 10.11, *)) {
830
+    textField.maximumNumberOfLines = 1;
831
+  }
832
+  textField.stringValue = defaultText;
833
+  [alert setAccessoryView:textField];
834
+
835
+  [alert addButtonWithTitle:NSLocalizedString(@"OK", @"OK button")];
836
+  [alert addButtonWithTitle:NSLocalizedString(@"Cancel", @"Cancel button")];
837
+  [alert beginSheetModalForWindow:[NSApp keyWindow] completionHandler:^(NSModalResponse response) {
838
+    if (response == NSAlertFirstButtonReturn) {
839
+      completionHandler([textField stringValue]);
840
+    } else {
841
+      completionHandler(nil);
842
+    }
843
+  }];
844
+#endif // !TARGET_OS_OSX
719 845
 }
720 846
 
847
+#if !TARGET_OS_OSX
721 848
 /**
722 849
  * topViewController
723 850
  */
@@ -756,7 +883,7 @@ static NSDictionary* customCertificatesForHost;
756 883
   }
757 884
   return window;
758 885
 }
759
-
886
+#endif // !TARGET_OS_OSX
760 887
 
761 888
 /**
762 889
  * Decides whether to allow or cancel a navigation.
@@ -952,11 +1079,13 @@ static NSDictionary* customCertificatesForHost;
952 1079
   [_webView stopLoading];
953 1080
 }
954 1081
 
1082
+#if !TARGET_OS_OSX
955 1083
 - (void)setBounces:(BOOL)bounces
956 1084
 {
957 1085
   _bounces = bounces;
958 1086
   _webView.scrollView.bounces = bounces;
959 1087
 }
1088
+#endif // !TARGET_OS_OSX
960 1089
 
961 1090
 
962 1091
 - (void)setInjectedJavaScript:(NSString *)source {

+ 6
- 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;
@@ -35,7 +22,11 @@ RCT_ENUM_CONVERTER(UIScrollViewContentInsetAdjustmentBehavior, (@{
35 22
 
36 23
 RCT_EXPORT_MODULE()
37 24
 
25
+#if !TARGET_OS_OSX
38 26
 - (UIView *)view
27
+#else
28
+- (RCTUIView *)view
29
+#endif // !TARGET_OS_OSX
39 30
 {
40 31
   RNCWebView *webView = [RNCWebView new];
41 32
   webView.delegate = self;
@@ -112,9 +103,11 @@ RCT_CUSTOM_VIEW_PROPERTY(sharedCookiesEnabled, BOOL, RNCWebView) {
112 103
     view.sharedCookiesEnabled = json == nil ? false : [RCTConvert BOOL: json];
113 104
 }
114 105
 
106
+#if !TARGET_OS_OSX
115 107
 RCT_CUSTOM_VIEW_PROPERTY(decelerationRate, CGFloat, RNCWebView) {
116 108
   view.decelerationRate = json == nil ? UIScrollViewDecelerationRateNormal : [RCTConvert CGFloat: json];
117 109
 }
110
+#endif // !TARGET_OS_OSX
118 111
 
119 112
 RCT_CUSTOM_VIEW_PROPERTY(directionalLockEnabled, BOOL, RNCWebView) {
120 113
     view.directionalLockEnabled = json == nil ? true : [RCTConvert BOOL: json];

+ 363
- 0
macos/RNCWebView.xcodeproj/project.pbxproj View File

@@ -0,0 +1,363 @@
1
+// !$*UTF8*$!
2
+{
3
+	archiveVersion = 1;
4
+	classes = {
5
+	};
6
+	objectVersion = 46;
7
+	objects = {
8
+
9
+/* Begin PBXBuildFile section */
10
+		3515965E21A3C86000623BFA /* ../ios/RNCWKProcessPoolManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3515965D21A3C86000623BFA /* ../ios/RNCWKProcessPoolManager.m */; };
11
+		38116A2B23BBECB700ACE311 /* ../ios/RNCWebViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E91B351B21446E6C00F9801F /* ../ios/RNCWebViewManager.m */; };
12
+		38116A2C23BBECB700ACE311 /* ../ios/RNCWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = E91B351C21446E6C00F9801F /* ../ios/RNCWebView.m */; };
13
+		38116A2D23BBECB700ACE311 /* ../ios/RNCWKProcessPoolManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3515965D21A3C86000623BFA /* ../ios/RNCWKProcessPoolManager.m */; };
14
+		E91B351D21446E6C00F9801F /* ../ios/RNCWebViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E91B351B21446E6C00F9801F /* ../ios/RNCWebViewManager.m */; };
15
+		E91B351E21446E6C00F9801F /* ../ios/RNCWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = E91B351C21446E6C00F9801F /* ../ios/RNCWebView.m */; };
16
+/* End PBXBuildFile section */
17
+
18
+/* Begin PBXCopyFilesBuildPhase section */
19
+		38116A2F23BBECB700ACE311 /* CopyFiles */ = {
20
+			isa = PBXCopyFilesBuildPhase;
21
+			buildActionMask = 2147483647;
22
+			dstPath = "include/$(PRODUCT_NAME)";
23
+			dstSubfolderSpec = 16;
24
+			files = (
25
+			);
26
+			runOnlyForDeploymentPostprocessing = 0;
27
+		};
28
+		58B511D91A9E6C8500147676 /* CopyFiles */ = {
29
+			isa = PBXCopyFilesBuildPhase;
30
+			buildActionMask = 2147483647;
31
+			dstPath = "include/$(PRODUCT_NAME)";
32
+			dstSubfolderSpec = 16;
33
+			files = (
34
+			);
35
+			runOnlyForDeploymentPostprocessing = 0;
36
+		};
37
+/* End PBXCopyFilesBuildPhase section */
38
+
39
+/* Begin PBXFileReference section */
40
+		134814201AA4EA6300B7C361 /* libRNCWebView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNCWebView.a; sourceTree = BUILT_PRODUCTS_DIR; };
41
+		3515965D21A3C86000623BFA /* ../ios/RNCWKProcessPoolManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ../ios/RNCWKProcessPoolManager.m; sourceTree = "<group>"; };
42
+		3515965F21A3C87E00623BFA /* ../ios/RNCWKProcessPoolManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ../ios/RNCWKProcessPoolManager.h; sourceTree = "<group>"; };
43
+		38116A3323BBECB700ACE311 /* libRNCWebView-macOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libRNCWebView-macOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
44
+		E91B351921446E6C00F9801F /* ../ios/RNCWebViewManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ../ios/RNCWebViewManager.h; sourceTree = "<group>"; };
45
+		E91B351A21446E6C00F9801F /* ../ios/RNCWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ../ios/RNCWebView.h; sourceTree = "<group>"; };
46
+		E91B351B21446E6C00F9801F /* ../ios/RNCWebViewManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ../ios/RNCWebViewManager.m; sourceTree = "<group>"; };
47
+		E91B351C21446E6C00F9801F /* ../ios/RNCWebView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ../ios/RNCWebView.m; sourceTree = "<group>"; };
48
+/* End PBXFileReference section */
49
+
50
+/* Begin PBXFrameworksBuildPhase section */
51
+		38116A2E23BBECB700ACE311 /* Frameworks */ = {
52
+			isa = PBXFrameworksBuildPhase;
53
+			buildActionMask = 2147483647;
54
+			files = (
55
+			);
56
+			runOnlyForDeploymentPostprocessing = 0;
57
+		};
58
+		58B511D81A9E6C8500147676 /* Frameworks */ = {
59
+			isa = PBXFrameworksBuildPhase;
60
+			buildActionMask = 2147483647;
61
+			files = (
62
+			);
63
+			runOnlyForDeploymentPostprocessing = 0;
64
+		};
65
+/* End PBXFrameworksBuildPhase section */
66
+
67
+/* Begin PBXGroup section */
68
+		134814211AA4EA7D00B7C361 /* Products */ = {
69
+			isa = PBXGroup;
70
+			children = (
71
+				134814201AA4EA6300B7C361 /* libRNCWebView.a */,
72
+			);
73
+			name = Products;
74
+			sourceTree = "<group>";
75
+		};
76
+		58B511D21A9E6C8500147676 = {
77
+			isa = PBXGroup;
78
+			children = (
79
+				E91B351A21446E6C00F9801F /* ../ios/RNCWebView.h */,
80
+				E91B351C21446E6C00F9801F /* ../ios/RNCWebView.m */,
81
+				E91B351921446E6C00F9801F /* ../ios/RNCWebViewManager.h */,
82
+				E91B351B21446E6C00F9801F /* ../ios/RNCWebViewManager.m */,
83
+				3515965D21A3C86000623BFA /* ../ios/RNCWKProcessPoolManager.m */,
84
+				3515965F21A3C87E00623BFA /* ../ios/RNCWKProcessPoolManager.h */,
85
+				134814211AA4EA7D00B7C361 /* Products */,
86
+				38116A3323BBECB700ACE311 /* libRNCWebView-macOS.a */,
87
+			);
88
+			sourceTree = "<group>";
89
+		};
90
+/* End PBXGroup section */
91
+
92
+/* Begin PBXNativeTarget section */
93
+		38116A2923BBECB700ACE311 /* RNCWebView-macOS */ = {
94
+			isa = PBXNativeTarget;
95
+			buildConfigurationList = 38116A3023BBECB700ACE311 /* Build configuration list for PBXNativeTarget "RNCWebView-macOS" */;
96
+			buildPhases = (
97
+				38116A2A23BBECB700ACE311 /* Sources */,
98
+				38116A2E23BBECB700ACE311 /* Frameworks */,
99
+				38116A2F23BBECB700ACE311 /* CopyFiles */,
100
+			);
101
+			buildRules = (
102
+			);
103
+			dependencies = (
104
+			);
105
+			name = "RNCWebView-macOS";
106
+			productName = RCTDataManager;
107
+			productReference = 38116A3323BBECB700ACE311 /* libRNCWebView-macOS.a */;
108
+			productType = "com.apple.product-type.library.static";
109
+		};
110
+		58B511DA1A9E6C8500147676 /* RNCWebView */ = {
111
+			isa = PBXNativeTarget;
112
+			buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "RNCWebView" */;
113
+			buildPhases = (
114
+				58B511D71A9E6C8500147676 /* Sources */,
115
+				58B511D81A9E6C8500147676 /* Frameworks */,
116
+				58B511D91A9E6C8500147676 /* CopyFiles */,
117
+			);
118
+			buildRules = (
119
+			);
120
+			dependencies = (
121
+			);
122
+			name = RNCWebView;
123
+			productName = RCTDataManager;
124
+			productReference = 134814201AA4EA6300B7C361 /* libRNCWebView.a */;
125
+			productType = "com.apple.product-type.library.static";
126
+		};
127
+/* End PBXNativeTarget section */
128
+
129
+/* Begin PBXProject section */
130
+		58B511D31A9E6C8500147676 /* Project object */ = {
131
+			isa = PBXProject;
132
+			attributes = {
133
+				LastUpgradeCheck = 0830;
134
+				ORGANIZATIONNAME = Facebook;
135
+				TargetAttributes = {
136
+					58B511DA1A9E6C8500147676 = {
137
+						CreatedOnToolsVersion = 6.1.1;
138
+					};
139
+				};
140
+			};
141
+			buildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "RNCWebView" */;
142
+			compatibilityVersion = "Xcode 3.2";
143
+			developmentRegion = en;
144
+			hasScannedForEncodings = 0;
145
+			knownRegions = (
146
+				en,
147
+			);
148
+			mainGroup = 58B511D21A9E6C8500147676;
149
+			productRefGroup = 58B511D21A9E6C8500147676;
150
+			projectDirPath = "";
151
+			projectRoot = "";
152
+			targets = (
153
+				58B511DA1A9E6C8500147676 /* RNCWebView */,
154
+				38116A2923BBECB700ACE311 /* RNCWebView-macOS */,
155
+			);
156
+		};
157
+/* End PBXProject section */
158
+
159
+/* Begin PBXSourcesBuildPhase section */
160
+		38116A2A23BBECB700ACE311 /* Sources */ = {
161
+			isa = PBXSourcesBuildPhase;
162
+			buildActionMask = 2147483647;
163
+			files = (
164
+				38116A2B23BBECB700ACE311 /* ../ios/RNCWebViewManager.m in Sources */,
165
+				38116A2C23BBECB700ACE311 /* ../ios/RNCWebView.m in Sources */,
166
+				38116A2D23BBECB700ACE311 /* ../ios/RNCWKProcessPoolManager.m in Sources */,
167
+			);
168
+			runOnlyForDeploymentPostprocessing = 0;
169
+		};
170
+		58B511D71A9E6C8500147676 /* Sources */ = {
171
+			isa = PBXSourcesBuildPhase;
172
+			buildActionMask = 2147483647;
173
+			files = (
174
+				E91B351D21446E6C00F9801F /* ../ios/RNCWebViewManager.m in Sources */,
175
+				E91B351E21446E6C00F9801F /* ../ios/RNCWebView.m in Sources */,
176
+				3515965E21A3C86000623BFA /* ../ios/RNCWKProcessPoolManager.m in Sources */,
177
+			);
178
+			runOnlyForDeploymentPostprocessing = 0;
179
+		};
180
+/* End PBXSourcesBuildPhase section */
181
+
182
+/* Begin XCBuildConfiguration section */
183
+		38116A3123BBECB700ACE311 /* Debug */ = {
184
+			isa = XCBuildConfiguration;
185
+			buildSettings = {
186
+				FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../node_modules/react-native-macos/React/**";
187
+				HEADER_SEARCH_PATHS = (
188
+					"$(inherited)",
189
+					"$(SRCROOT)/../node_modules/react-native-macos/React/**",
190
+				);
191
+				LIBRARY_SEARCH_PATHS = "$(inherited)";
192
+				MACOSX_DEPLOYMENT_TARGET = 10.14;
193
+				OTHER_LDFLAGS = "-ObjC";
194
+				PRODUCT_NAME = "$(TARGET_NAME)";
195
+				SDKROOT = macosx;
196
+				SKIP_INSTALL = YES;
197
+			};
198
+			name = Debug;
199
+		};
200
+		38116A3223BBECB700ACE311 /* Release */ = {
201
+			isa = XCBuildConfiguration;
202
+			buildSettings = {
203
+				FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../node_modules/react-native-macos/React/**";
204
+				HEADER_SEARCH_PATHS = (
205
+					"$(inherited)",
206
+					"$(SRCROOT)/../node_modules/react-native-macos/React/**",
207
+				);
208
+				LIBRARY_SEARCH_PATHS = "$(inherited)";
209
+				MACOSX_DEPLOYMENT_TARGET = 10.14;
210
+				OTHER_LDFLAGS = "-ObjC";
211
+				PRODUCT_NAME = "$(TARGET_NAME)";
212
+				SDKROOT = macosx;
213
+				SKIP_INSTALL = YES;
214
+			};
215
+			name = Release;
216
+		};
217
+		58B511ED1A9E6C8500147676 /* Debug */ = {
218
+			isa = XCBuildConfiguration;
219
+			buildSettings = {
220
+				ALWAYS_SEARCH_USER_PATHS = NO;
221
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
222
+				CLANG_CXX_LIBRARY = "libc++";
223
+				CLANG_ENABLE_MODULES = YES;
224
+				CLANG_ENABLE_OBJC_ARC = YES;
225
+				CLANG_WARN_BOOL_CONVERSION = YES;
226
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
227
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
228
+				CLANG_WARN_EMPTY_BODY = YES;
229
+				CLANG_WARN_ENUM_CONVERSION = YES;
230
+				CLANG_WARN_INFINITE_RECURSION = YES;
231
+				CLANG_WARN_INT_CONVERSION = YES;
232
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
233
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
234
+				CLANG_WARN_UNREACHABLE_CODE = YES;
235
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
236
+				COPY_PHASE_STRIP = NO;
237
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
238
+				ENABLE_TESTABILITY = YES;
239
+				GCC_C_LANGUAGE_STANDARD = gnu99;
240
+				GCC_DYNAMIC_NO_PIC = NO;
241
+				GCC_NO_COMMON_BLOCKS = YES;
242
+				GCC_OPTIMIZATION_LEVEL = 0;
243
+				GCC_PREPROCESSOR_DEFINITIONS = (
244
+					"DEBUG=1",
245
+					"$(inherited)",
246
+				);
247
+				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
248
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
249
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
250
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
251
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
252
+				GCC_WARN_UNUSED_FUNCTION = YES;
253
+				GCC_WARN_UNUSED_VARIABLE = YES;
254
+				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
255
+				MTL_ENABLE_DEBUG_INFO = YES;
256
+				ONLY_ACTIVE_ARCH = YES;
257
+				SDKROOT = iphoneos;
258
+			};
259
+			name = Debug;
260
+		};
261
+		58B511EE1A9E6C8500147676 /* Release */ = {
262
+			isa = XCBuildConfiguration;
263
+			buildSettings = {
264
+				ALWAYS_SEARCH_USER_PATHS = NO;
265
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
266
+				CLANG_CXX_LIBRARY = "libc++";
267
+				CLANG_ENABLE_MODULES = YES;
268
+				CLANG_ENABLE_OBJC_ARC = YES;
269
+				CLANG_WARN_BOOL_CONVERSION = YES;
270
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
271
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
272
+				CLANG_WARN_EMPTY_BODY = YES;
273
+				CLANG_WARN_ENUM_CONVERSION = YES;
274
+				CLANG_WARN_INFINITE_RECURSION = YES;
275
+				CLANG_WARN_INT_CONVERSION = YES;
276
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
277
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
278
+				CLANG_WARN_UNREACHABLE_CODE = YES;
279
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
280
+				COPY_PHASE_STRIP = YES;
281
+				ENABLE_NS_ASSERTIONS = NO;
282
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
283
+				GCC_C_LANGUAGE_STANDARD = gnu99;
284
+				GCC_NO_COMMON_BLOCKS = YES;
285
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
286
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
287
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
288
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
289
+				GCC_WARN_UNUSED_FUNCTION = YES;
290
+				GCC_WARN_UNUSED_VARIABLE = YES;
291
+				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
292
+				MTL_ENABLE_DEBUG_INFO = NO;
293
+				SDKROOT = iphoneos;
294
+				VALIDATE_PRODUCT = YES;
295
+			};
296
+			name = Release;
297
+		};
298
+		58B511F01A9E6C8500147676 /* Debug */ = {
299
+			isa = XCBuildConfiguration;
300
+			buildSettings = {
301
+				FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../node_modules/react-native-macos/React/**";
302
+				HEADER_SEARCH_PATHS = (
303
+					"$(inherited)",
304
+					"$(SRCROOT)/../node_modules/react-native-macos/React/**",
305
+					"$(SRCROOT)/../../react-native-macos/React/**",
306
+				);
307
+				LIBRARY_SEARCH_PATHS = "$(inherited)";
308
+				OTHER_LDFLAGS = "-ObjC";
309
+				PRODUCT_NAME = RNCWebView;
310
+				SKIP_INSTALL = YES;
311
+			};
312
+			name = Debug;
313
+		};
314
+		58B511F11A9E6C8500147676 /* Release */ = {
315
+			isa = XCBuildConfiguration;
316
+			buildSettings = {
317
+				FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../node_modules/react-native-macos/React/**";
318
+				HEADER_SEARCH_PATHS = (
319
+					"$(inherited)",
320
+					"$(SRCROOT)/../node_modules/react-native-macos/React/**",
321
+					"$(SRCROOT)/../../react-native-macos/React/**",
322
+				);
323
+				LIBRARY_SEARCH_PATHS = "$(inherited)";
324
+				OTHER_LDFLAGS = "-ObjC";
325
+				PRODUCT_NAME = RNCWebView;
326
+				SKIP_INSTALL = YES;
327
+			};
328
+			name = Release;
329
+		};
330
+/* End XCBuildConfiguration section */
331
+
332
+/* Begin XCConfigurationList section */
333
+		38116A3023BBECB700ACE311 /* Build configuration list for PBXNativeTarget "RNCWebView-macOS" */ = {
334
+			isa = XCConfigurationList;
335
+			buildConfigurations = (
336
+				38116A3123BBECB700ACE311 /* Debug */,
337
+				38116A3223BBECB700ACE311 /* Release */,
338
+			);
339
+			defaultConfigurationIsVisible = 0;
340
+			defaultConfigurationName = Release;
341
+		};
342
+		58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "RNCWebView" */ = {
343
+			isa = XCConfigurationList;
344
+			buildConfigurations = (
345
+				58B511ED1A9E6C8500147676 /* Debug */,
346
+				58B511EE1A9E6C8500147676 /* Release */,
347
+			);
348
+			defaultConfigurationIsVisible = 0;
349
+			defaultConfigurationName = Release;
350
+		};
351
+		58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "RNCWebView" */ = {
352
+			isa = XCConfigurationList;
353
+			buildConfigurations = (
354
+				58B511F01A9E6C8500147676 /* Debug */,
355
+				58B511F11A9E6C8500147676 /* Release */,
356
+			);
357
+			defaultConfigurationIsVisible = 0;
358
+			defaultConfigurationName = Release;
359
+		};
360
+/* End XCConfigurationList section */
361
+	};
362
+	rootObject = 58B511D31A9E6C8500147676 /* Project object */;
363
+}

+ 12
- 0
metro.config.js View File

@@ -0,0 +1,12 @@
1
+/**
2
+ * This cli config is needed for development purposes, e.g. for running
3
+ * integration tests during local development or on CI services.
4
+ */
5
+
6
+const blacklist = require('metro-config/src/defaults/blacklist');
7
+
8
+module.exports = {
9
+  resolver: {
10
+    blacklistRE: blacklist([/node_modules\/react-native-macos\/.*/])
11
+  },
12
+};

+ 19
- 0
metro.config.macos.js View File

@@ -0,0 +1,19 @@
1
+/**
2
+ * This cli config is needed for development purposes, e.g. for running
3
+ * integration tests during local development or on CI services.
4
+ */
5
+
6
+const path = require('path');
7
+const blacklist = require('metro-config/src/defaults/blacklist');
8
+
9
+const rnmPath = path.resolve(__dirname, 'node_modules/react-native-macos');
10
+
11
+module.exports = {
12
+  resolver: {
13
+    extraNodeModules: {
14
+      'react-native': rnmPath,
15
+    },
16
+    platforms: ['macos', 'ios', 'android'],
17
+    blacklistRE: blacklist([/node_modules\/react-native\/.*/])
18
+  },
19
+};

+ 18
- 8
package.json View File

@@ -1,6 +1,6 @@
1 1
 {
2 2
   "name": "react-native-webview",
3
-  "description": "React Native WebView component for iOS, Android, and Windows 10 (coming soon)",
3
+  "description": "React Native WebView component for iOS, Android, and macOS",
4 4
   "main": "index.js",
5 5
   "typings": "index.d.ts",
6 6
   "author": "Jamon Holmgren <jamon@infinite.red>",
@@ -8,9 +8,13 @@
8 8
     "Thibault Malbranche <malbranche.thibault@gmail.com>"
9 9
   ],
10 10
   "license": "MIT",
11
-  "version": "8.0.2",
11
+  "version": "8.1.1",
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",
17
+    "start:macos": "node node_modules/react-native-macos/local-cli/cli.js start --use-react-native-macos",
14 18
     "ci": "CI=true && yarn lint && yarn test",
15 19
     "ci:publish": "yarn semantic-release",
16 20
     "lint": "yarn tsc --noEmit && yarn eslint ./src --ext .ts,.tsx",
@@ -23,7 +27,7 @@
23 27
     "type": "Component"
24 28
   },
25 29
   "peerDependencies": {
26
-    "react": "^16.0",
30
+    "react": "^16.9",
27 31
     "react-native": ">=0.60 <0.62"
28 32
   },
29 33
   "dependencies": {
@@ -31,7 +35,10 @@
31 35
     "invariant": "2.2.4"
32 36
   },
33 37
   "devDependencies": {
34
-    "@babel/core": "7.5.5",
38
+    "@babel/core": "7.4.5",
39
+    "@babel/runtime": "7.4.5",
40
+    "@react-native-community/cli-platform-ios": "^3.0.0",
41
+    "@react-native-community/cli-platform-android": "^3.0.0",
35 42
     "@semantic-release/git": "7.0.16",
36 43
     "@types/invariant": "^2.2.30",
37 44
     "@types/jest": "24.0.18",
@@ -40,7 +47,8 @@
40 47
     "@typescript-eslint/eslint-plugin": "2.1.0",
41 48
     "@typescript-eslint/parser": "2.1.0",
42 49
     "babel-eslint": "10.0.3",
43
-    "babel-jest": "^24.9.0",
50
+    "babel-jest": "24.8.0",
51
+    "babel-plugin-module-resolver": "3.1.3",
44 52
     "eslint": "6.3.0",
45 53
     "eslint-config-airbnb": "18.0.1",
46 54
     "eslint-config-prettier": "6.2.0",
@@ -49,9 +57,10 @@
49 57
     "eslint-plugin-react": "7.14.3",
50 58
     "eslint-plugin-react-native": "3.7.0",
51 59
     "jest": "24.9.0",
52
-    "metro-react-native-babel-preset": "0.53.1",
53
-    "react": "16.8.3",
54
-    "react-native": "0.60.5",
60
+    "metro-react-native-babel-preset": "0.54.1",
61
+    "react": "16.9.0",
62
+    "react-native": "0.61.5",
63
+    "react-native-macos": "0.60.0-microsoft.49",
55 64
     "semantic-release": "15.13.24",
56 65
     "typescript": "3.6.2"
57 66
   },
@@ -62,6 +71,7 @@
62 71
   "files": [
63 72
     "android",
64 73
     "ios",
74
+    "macos",
65 75
     "lib",
66 76
     "index.js",
67 77
     "index.d.ts",

+ 26
- 0
react-native.config.js View File

@@ -0,0 +1,26 @@
1
+/**
2
+ * This cli config is needed for the coexistance of react-native and other
3
+ * out-of-tree implementations such react-native-macos.
4
+ * The following issue is tracked by
5
+ * https://github.com/react-native-community/discussions-and-proposals/issues/182
6
+ *
7
+ * The work-around involves having a metro.config.js for each out-of-tree
8
+ * platform, i.e. metro.config.js for react-native and 
9
+ * metro.config.macos.js for react-native-macos.
10
+ * This react-native.config.js looks for a --use-react-native-macos
11
+ * switch and when present pushes --config=metro.config.macos.js 
12
+ * and specifies reactNativePath: 'node_modules/react-native-macos'.
13
+ * The metro.config.js has to blacklist 'node_modules/react-native-macos', 
14
+ * and conversely metro.config.macos.js has to blacklist 'node_modules/react-native'.
15
+ */
16
+'use strict';
17
+
18
+const macSwitch = '--use-react-native-macos';
19
+
20
+if (process.argv.includes(macSwitch)) {
21
+  process.argv = process.argv.filter(arg => arg !== macSwitch);
22
+  process.argv.push('--config=metro.config.macos.js');
23
+  module.exports = {
24
+    reactNativePath: 'node_modules/react-native-macos',
25
+  };
26
+}

+ 347
- 0
src/WebView.macos.tsx View File

@@ -0,0 +1,347 @@
1
+import React from 'react';
2
+import {
3
+  UIManager as NotTypedUIManager,
4
+  View,
5
+  requireNativeComponent,
6
+  NativeModules,
7
+  Image,
8
+  findNodeHandle,
9
+  ImageSourcePropType,
10
+} from 'react-native';
11
+import invariant from 'invariant';
12
+
13
+import {
14
+  defaultOriginWhitelist,
15
+  createOnShouldStartLoadWithRequest,
16
+  defaultRenderError,
17
+  defaultRenderLoading,
18
+} from './WebViewShared';
19
+import {
20
+  WebViewErrorEvent,
21
+  WebViewHttpErrorEvent,
22
+  WebViewMessageEvent,
23
+  WebViewNavigationEvent,
24
+  WebViewProgressEvent,
25
+  WebViewTerminatedEvent,
26
+  MacOSWebViewProps,
27
+  NativeWebViewMacOS,
28
+  ViewManager,
29
+  State,
30
+  RNCWebViewUIManagerMacOS,
31
+} from './WebViewTypes';
32
+
33
+import styles from './WebView.styles';
34
+
35
+const UIManager = NotTypedUIManager as RNCWebViewUIManagerMacOS;
36
+
37
+const { resolveAssetSource } = Image;
38
+
39
+const RNCWebViewManager = NativeModules.RNCWebViewManager as ViewManager;
40
+
41
+const RNCWebView: typeof NativeWebViewMacOS = requireNativeComponent(
42
+  'RNCWebView',
43
+);
44
+
45
+class WebView extends React.Component<MacOSWebViewProps, State> {
46
+  static defaultProps = {
47
+    javaScriptEnabled: true,
48
+    cacheEnabled: true,
49
+    originWhitelist: defaultOriginWhitelist,
50
+    useSharedProcessPool: true,
51
+  };
52
+
53
+  static isFileUploadSupported = async () => {
54
+    // no native implementation for macOS, depends only on permissions
55
+    return true;
56
+  };
57
+
58
+  state: State = {
59
+    viewState: this.props.startInLoadingState ? 'LOADING' : 'IDLE',
60
+    lastErrorEvent: null,
61
+  };
62
+
63
+  webViewRef = React.createRef<NativeWebViewMacOS>();
64
+
65
+  // eslint-disable-next-line react/sort-comp
66
+  getCommands = () => UIManager.getViewManagerConfig('RNCWebView').Commands;
67
+
68
+  /**
69
+   * Go forward one page in the web view's history.
70
+   */
71
+  goForward = () => {
72
+    UIManager.dispatchViewManagerCommand(
73
+      this.getWebViewHandle(),
74
+      this.getCommands().goForward,
75
+      undefined,
76
+    );
77
+  };
78
+
79
+  /**
80
+   * Go back one page in the web view's history.
81
+   */
82
+  goBack = () => {
83
+    UIManager.dispatchViewManagerCommand(
84
+      this.getWebViewHandle(),
85
+      this.getCommands().goBack,
86
+      undefined,
87
+    );
88
+  };
89
+
90
+  /**
91
+   * Reloads the current page.
92
+   */
93
+  reload = () => {
94
+    this.setState({ viewState: 'LOADING' });
95
+    UIManager.dispatchViewManagerCommand(
96
+      this.getWebViewHandle(),
97
+      this.getCommands().reload,
98
+      undefined,
99
+    );
100
+  };
101
+
102
+  /**
103
+   * Stop loading the current page.
104
+   */
105
+  stopLoading = () => {
106
+    UIManager.dispatchViewManagerCommand(
107
+      this.getWebViewHandle(),
108
+      this.getCommands().stopLoading,
109
+      undefined,
110
+    );
111
+  };
112
+
113
+  /**
114
+   * Request focus on WebView rendered page.
115
+   */
116
+  requestFocus = () => {
117
+    UIManager.dispatchViewManagerCommand(
118
+      this.getWebViewHandle(),
119
+      this.getCommands().requestFocus,
120
+      undefined,
121
+    );
122
+  };
123
+
124
+  /**
125
+   * Posts a message to the web view, which will emit a `message` event.
126
+   * Accepts one argument, `data`, which must be a string.
127
+   *
128
+   * In your webview, you'll need to something like the following.
129
+   *
130
+   * ```js
131
+   * document.addEventListener('message', e => { document.title = e.data; });
132
+   * ```
133
+   */
134
+  postMessage = (data: string) => {
135
+    UIManager.dispatchViewManagerCommand(
136
+      this.getWebViewHandle(),
137
+      this.getCommands().postMessage,
138
+      [String(data)],
139
+    );
140
+  };
141
+
142
+  /**
143
+   * Injects a javascript string into the referenced WebView. Deliberately does not
144
+   * return a response because using eval() to return a response breaks this method
145
+   * on pages with a Content Security Policy that disallows eval(). If you need that
146
+   * functionality, look into postMessage/onMessage.
147
+   */
148
+  injectJavaScript = (data: string) => {
149
+    UIManager.dispatchViewManagerCommand(
150
+      this.getWebViewHandle(),
151
+      this.getCommands().injectJavaScript,
152
+      [data],
153
+    );
154
+  };
155
+
156
+  /**
157
+   * We return an event with a bunch of fields including:
158
+   *  url, title, loading, canGoBack, canGoForward
159
+   */
160
+  updateNavigationState = (event: WebViewNavigationEvent) => {
161
+    if (this.props.onNavigationStateChange) {
162
+      this.props.onNavigationStateChange(event.nativeEvent);
163
+    }
164
+  };
165
+
166
+  /**
167
+   * Returns the native `WebView` node.
168
+   */
169
+  getWebViewHandle = () => {
170
+    const nodeHandle = findNodeHandle(this.webViewRef.current);
171
+    invariant(nodeHandle != null, 'nodeHandle expected to be non-null');
172
+    return nodeHandle as number;
173
+  };
174
+
175
+  onLoadingStart = (event: WebViewNavigationEvent) => {
176
+    const { onLoadStart } = this.props;
177
+    if (onLoadStart) {
178
+      onLoadStart(event);
179
+    }
180
+    this.updateNavigationState(event);
181
+  };
182
+
183
+  onLoadingError = (event: WebViewErrorEvent) => {
184
+    event.persist(); // persist this event because we need to store it
185
+    const { onError, onLoadEnd } = this.props;
186
+    if (onLoadEnd) {
187
+      onLoadEnd(event);
188
+    }
189
+    if (onError) {
190
+      onError(event);
191
+    }
192
+    console.warn('Encountered an error loading page', event.nativeEvent);
193
+
194
+    this.setState({
195
+      lastErrorEvent: event.nativeEvent,
196
+      viewState: 'ERROR',
197
+    });
198
+  };
199
+
200
+  onHttpError = (event: WebViewHttpErrorEvent) => {
201
+    const { onHttpError } = this.props;
202
+    if (onHttpError) {
203
+      onHttpError(event);
204
+    }
205
+  }
206
+
207
+  onLoadingFinish = (event: WebViewNavigationEvent) => {
208
+    const { onLoad, onLoadEnd } = this.props;
209
+    if (onLoad) {
210
+      onLoad(event);
211
+    }
212
+    if (onLoadEnd) {
213
+      onLoadEnd(event);
214
+    }
215
+    this.setState({
216
+      viewState: 'IDLE',
217
+    });
218
+    this.updateNavigationState(event);
219
+  };
220
+
221
+  onMessage = (event: WebViewMessageEvent) => {
222
+    const { onMessage } = this.props;
223
+    if (onMessage) {
224
+      onMessage(event);
225
+    }
226
+  };
227
+
228
+  onLoadingProgress = (event: WebViewProgressEvent) => {
229
+    const { onLoadProgress } = this.props;
230
+    if (onLoadProgress) {
231
+      onLoadProgress(event);
232
+    }
233
+  };
234
+
235
+  onShouldStartLoadWithRequestCallback = (
236
+    shouldStart: boolean,
237
+    _url: string,
238
+    lockIdentifier: number,
239
+  ) => {
240
+    const viewManager
241
+      = (this.props.nativeConfig && this.props.nativeConfig.viewManager)
242
+      || RNCWebViewManager;
243
+
244
+    viewManager.startLoadWithResult(!!shouldStart, lockIdentifier);
245
+  };
246
+
247
+  onContentProcessDidTerminate = (event: WebViewTerminatedEvent) => {
248
+    const { onContentProcessDidTerminate } = this.props;
249
+    if (onContentProcessDidTerminate) {
250
+      onContentProcessDidTerminate(event);
251
+    }
252
+  };
253
+
254
+  componentDidUpdate(prevProps: MacOSWebViewProps) {
255
+    this.showRedboxOnPropChanges(prevProps, 'allowsInlineMediaPlayback');
256
+    this.showRedboxOnPropChanges(prevProps, 'incognito');
257
+    this.showRedboxOnPropChanges(prevProps, 'mediaPlaybackRequiresUserAction');
258
+  }
259
+
260
+  showRedboxOnPropChanges(
261
+    prevProps: MacOSWebViewProps,
262
+    propName: keyof MacOSWebViewProps,
263
+  ) {
264
+    if (this.props[propName] !== prevProps[propName]) {
265
+      console.error(
266
+        `Changes to property ${propName} do nothing after the initial render.`,
267
+      );
268
+    }
269
+  }
270
+
271
+  render() {
272
+    const {
273
+      nativeConfig = {},
274
+      onMessage,
275
+      onShouldStartLoadWithRequest: onShouldStartLoadWithRequestProp,
276
+      originWhitelist,
277
+      renderError,
278
+      renderLoading,
279
+      style,
280
+      containerStyle,
281
+      ...otherProps
282
+    } = this.props;
283
+
284
+    let otherView = null;
285
+
286
+    if (this.state.viewState === 'LOADING') {
287
+      otherView = (renderLoading || defaultRenderLoading)();
288
+    } else if (this.state.viewState === 'ERROR') {
289
+      const errorEvent = this.state.lastErrorEvent;
290
+      invariant(errorEvent != null, 'lastErrorEvent expected to be non-null');
291
+      otherView = (renderError || defaultRenderError)(
292
+        errorEvent.domain,
293
+        errorEvent.code,
294
+        errorEvent.description,
295
+      );
296
+    } else if (this.state.viewState !== 'IDLE') {
297
+      console.error(
298
+        `RNCWebView invalid state encountered: ${this.state.viewState}`,
299
+      );
300
+    }
301
+
302
+    const webViewStyles = [styles.container, styles.webView, style];
303
+    const webViewContainerStyle = [styles.container, containerStyle];
304
+
305
+    const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest(
306
+      this.onShouldStartLoadWithRequestCallback,
307
+      // casting cause it's in the default props
308
+      originWhitelist as readonly string[],
309
+      onShouldStartLoadWithRequestProp,
310
+    );
311
+
312
+    const NativeWebView
313
+      = (nativeConfig.component as typeof NativeWebViewMacOS | undefined)
314
+      || RNCWebView;
315
+
316
+    const webView = (
317
+      <NativeWebView
318
+        key="webViewKey"
319
+        {...otherProps}
320
+        messagingEnabled={typeof onMessage === 'function'}
321
+        onLoadingError={this.onLoadingError}
322
+        onLoadingFinish={this.onLoadingFinish}
323
+        onLoadingProgress={this.onLoadingProgress}
324
+        onLoadingStart={this.onLoadingStart}
325
+        onHttpError={this.onHttpError}
326
+        onMessage={this.onMessage}
327
+        onScroll={this.props.onScroll}
328
+        onShouldStartLoadWithRequest={onShouldStartLoadWithRequest}
329
+        onContentProcessDidTerminate={this.onContentProcessDidTerminate}
330
+        ref={this.webViewRef}
331
+        // TODO: find a better way to type this.
332
+        source={resolveAssetSource(this.props.source as ImageSourcePropType)}
333
+        style={webViewStyles}
334
+        {...nativeConfig.props}
335
+      />
336
+    );
337
+
338
+    return (
339
+      <View style={webViewContainerStyle}>
340
+        {webView}
341
+        {otherView}
342
+      </View>
343
+    );
344
+  }
345
+}
346
+
347
+export default WebView;

+ 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
 

+ 175
- 14
src/WebViewTypes.ts View File

@@ -28,7 +28,7 @@ interface RNCWebViewUIManager<Commands extends string> extends UIManagerStatic {
28 28
 
29 29
 export type RNCWebViewUIManagerAndroid = RNCWebViewUIManager<WebViewCommands | AndroidWebViewCommands>
30 30
 export type RNCWebViewUIManagerIOS = RNCWebViewUIManager<WebViewCommands>
31
-
31
+export type RNCWebViewUIManagerMacOS = RNCWebViewUIManager<WebViewCommands>
32 32
 
33 33
 
34 34
 type WebViewState = 'IDLE' | 'LOADING' | 'ERROR';
@@ -57,6 +57,14 @@ declare const NativeWebViewIOSBase: Constructor<NativeMethodsMixin> &
57 57
   typeof NativeWebViewIOSComponent;
58 58
 export class NativeWebViewIOS extends NativeWebViewIOSBase {}
59 59
 
60
+// eslint-disable-next-line react/prefer-stateless-function
61
+declare class NativeWebViewMacOSComponent extends Component<
62
+  MacOSNativeWebViewProps
63
+> {}
64
+declare const NativeWebViewMacOSBase: Constructor<NativeMethodsMixin> &
65
+  typeof NativeWebViewMacOSComponent;
66
+export class NativeWebViewMacOS extends NativeWebViewMacOSBase {}
67
+
60 68
 // eslint-disable-next-line react/prefer-stateless-function
61 69
 declare class NativeWebViewAndroidComponent extends Component<
62 70
   AndroidNativeWebViewProps
@@ -104,7 +112,7 @@ export interface WebViewMessage extends WebViewNativeEvent {
104 112
 
105 113
 export interface WebViewError extends WebViewNativeEvent {
106 114
   /**
107
-   * `domain` is only used on iOS
115
+   * `domain` is only used on iOS and macOS
108 116
    */
109 117
   domain?: string;
110 118
   code: number;
@@ -195,7 +203,7 @@ export interface WebViewNativeConfig {
195 203
   /**
196 204
    * The native component used to render the WebView.
197 205
    */
198
-  component?: typeof NativeWebViewIOS | typeof NativeWebViewAndroid;
206
+  component?: typeof NativeWebViewIOS | typeof NativeWebViewMacOS | typeof NativeWebViewAndroid;
199 207
   /**
200 208
    * Set props directly on the native component WebView. Enables custom props which the
201 209
    * original WebView doesn't pass through.
@@ -203,7 +211,7 @@ export interface WebViewNativeConfig {
203 211
   props?: Object;
204 212
   /**
205 213
    * Set the ViewManager to use for communication with the native side.
206
-   * @platform ios
214
+   * @platform ios, macos
207 215
    */
208 216
   viewManager?: ViewManager;
209 217
 }
@@ -258,6 +266,13 @@ export interface AndroidNativeWebViewProps extends CommonNativeWebViewProps {
258 266
   urlPrefixesForDefaultIntent?: readonly string[];
259 267
 }
260 268
 
269
+export enum ContentInsetAdjustmentBehavior {
270
+  automatic = 'automatic',
271
+  scrollableAxes = 'scrollableAxes',
272
+  never = 'never',
273
+  always = 'always'
274
+};
275
+
261 276
 export interface IOSNativeWebViewProps extends CommonNativeWebViewProps {
262 277
   allowingReadAccessToURL?: string;
263 278
   allowsBackForwardNavigationGestures?: boolean;
@@ -266,11 +281,7 @@ export interface IOSNativeWebViewProps extends CommonNativeWebViewProps {
266 281
   automaticallyAdjustContentInsets?: boolean;
267 282
   bounces?: boolean;
268 283
   contentInset?: ContentInsetProp;
269
-  contentInsetAdjustmentBehavior?:
270
-    | 'automatic'
271
-    | 'scrollableAxes'
272
-    | 'never'
273
-    | 'always';
284
+  contentInsetAdjustmentBehavior?: ContentInsetAdjustmentBehavior;
274 285
   dataDetectorTypes?: DataDetectorTypes | readonly DataDetectorTypes[];
275 286
   decelerationRate?: number;
276 287
   directionalLockEnabled?: boolean;
@@ -283,6 +294,23 @@ export interface IOSNativeWebViewProps extends CommonNativeWebViewProps {
283 294
   injectedJavaScriptBeforeContentLoadedForMainFrameOnly?: boolean;
284 295
 }
285 296
 
297
+export interface MacOSNativeWebViewProps extends CommonNativeWebViewProps {
298
+  allowingReadAccessToURL?: string;
299
+  allowsBackForwardNavigationGestures?: boolean;
300
+  allowsInlineMediaPlayback?: boolean;
301
+  allowsLinkPreview?: boolean;
302
+  automaticallyAdjustContentInsets?: boolean;
303
+  bounces?: boolean;
304
+  contentInset?: ContentInsetProp;
305
+  contentInsetAdjustmentBehavior?: ContentInsetAdjustmentBehavior;
306
+  directionalLockEnabled?: boolean;
307
+  hideKeyboardAccessoryView?: boolean;
308
+  pagingEnabled?: boolean;
309
+  scrollEnabled?: boolean;
310
+  useSharedProcessPool?: boolean;
311
+  onContentProcessDidTerminate?: (event: WebViewTerminatedEvent) => void;
312
+}
313
+
286 314
 export interface IOSWebViewProps extends WebViewSharedProps {
287 315
   /**
288 316
    * Does not store any data within the lifetime of the WebView.
@@ -337,11 +365,7 @@ export interface IOSWebViewProps extends WebViewSharedProps {
337 365
    * content area of the scroll view. The default value of this property is
338 366
    * "never". Available on iOS 11 and later.
339 367
    */
340
-  contentInsetAdjustmentBehavior?:
341
-    | 'automatic'
342
-    | 'scrollableAxes'
343
-    | 'never'
344
-    | 'always';
368
+  contentInsetAdjustmentBehavior?: ContentInsetAdjustmentBehavior;
345 369
 
346 370
   /**
347 371
    * The amount by which the web view content is inset from the edges of
@@ -476,6 +500,143 @@ export interface IOSWebViewProps extends WebViewSharedProps {
476 500
   injectedJavaScriptBeforeContentLoadedForMainFrameOnly?: boolean;
477 501
 }
478 502
 
503
+export interface MacOSWebViewProps extends WebViewSharedProps {
504
+  /**
505
+   * Does not store any data within the lifetime of the WebView.
506
+   */
507
+  incognito?: boolean;
508
+
509
+  /**
510
+   * Boolean value that determines whether the web view bounces
511
+   * when it reaches the edge of the content. The default value is `true`.
512
+   * @platform macos
513
+   */
514
+  bounces?: boolean;
515
+
516
+  /**
517
+   * Boolean value that determines whether scrolling is enabled in the
518
+   * `WebView`. The default value is `true`.
519
+   * @platform macos
520
+   */
521
+  scrollEnabled?: boolean;
522
+
523
+  /**
524
+   * If the value of this property is true, the scroll view stops on multiples
525
+   * of the scroll view’s bounds when the user scrolls.
526
+   * The default value is false.
527
+   * @platform macos
528
+   */
529
+  pagingEnabled?: boolean;
530
+
531
+  /**
532
+   * Controls whether to adjust the content inset for web views that are
533
+   * placed behind a navigation bar, tab bar, or toolbar. The default value
534
+   * is `true`.
535
+   * @platform macos
536
+   */
537
+  automaticallyAdjustContentInsets?: boolean;
538
+
539
+  /**
540
+   * This property specifies how the safe area insets are used to modify the
541
+   * content area of the scroll view. The default value of this property is
542
+   * "never". Available on iOS 11 and later.
543
+   */
544
+  contentInsetAdjustmentBehavior?: ContentInsetAdjustmentBehavior;
545
+
546
+  /**
547
+   * The amount by which the web view content is inset from the edges of
548
+   * the scroll view. Defaults to {top: 0, left: 0, bottom: 0, right: 0}.
549
+   * @platform macos
550
+   */
551
+  contentInset?: ContentInsetProp;
552
+
553
+  /**
554
+   * Boolean that determines whether HTML5 videos play inline or use the
555
+   * native full-screen controller. The default value is `false`.
556
+   *
557
+   * **NOTE** : In order for video to play inline, not only does this
558
+   * property need to be set to `true`, but the video element in the HTML
559
+   * document must also include the `webkit-playsinline` attribute.
560
+   * @platform macos
561
+   */
562
+  allowsInlineMediaPlayback?: boolean;
563
+  /**
564
+   * Hide the accessory view when the keyboard is open. Default is false to be
565
+   * backward compatible.
566
+   */
567
+  hideKeyboardAccessoryView?: boolean;
568
+  /**
569
+   * A Boolean value indicating whether horizontal swipe gestures will trigger
570
+   * back-forward list navigations.
571
+   */
572
+  allowsBackForwardNavigationGestures?: boolean;
573
+  /**
574
+   * A Boolean value indicating whether WebKit WebView should be created using a shared
575
+   * process pool, enabling WebViews to share cookies and localStorage between each other.
576
+   * Default is true but can be set to false for backwards compatibility.
577
+   * @platform macos
578
+   */
579
+  useSharedProcessPool?: boolean;
580
+
581
+  /**
582
+   * The custom user agent string.
583
+   */
584
+  userAgent?: string;
585
+
586
+  /**
587
+   * A Boolean value that determines whether pressing on a link
588
+   * displays a preview of the destination for the link.
589
+   *
590
+   * This property is available on devices that support Force Touch trackpad.
591
+   * @platform macos
592
+   */
593
+  allowsLinkPreview?: boolean;
594
+
595
+  /**
596
+   * Set true if shared cookies from HTTPCookieStorage should used for every load request.
597
+   * The default value is `false`.
598
+   * @platform macos
599
+   */
600
+  sharedCookiesEnabled?: boolean;
601
+
602
+  /**
603
+   * A Boolean value that determines whether scrolling is disabled in a particular direction.
604
+   * The default value is `true`.
605
+   * @platform macos
606
+   */
607
+  directionalLockEnabled?: boolean;
608
+
609
+  /**
610
+   * A Boolean value indicating whether web content can programmatically display the keyboard.
611
+   *
612
+   * When this property is set to true, the user must explicitly tap the elements in the
613
+   * web view to display the keyboard (or other relevant input view) for that element.
614
+   * When set to false, a focus event on an element causes the input view to be displayed
615
+   * and associated with that element automatically.
616
+   *
617
+   * The default value is `true`.
618
+   * @platform macos
619
+   */
620
+  keyboardDisplayRequiresUserAction?: boolean;
621
+
622
+  /**
623
+   * A String value that indicates which URLs the WebView's file can then
624
+   * reference in scripts, AJAX requests, and CSS imports. This is only used
625
+   * for WebViews that are loaded with a source.uri set to a `'file://'` URL.
626
+   *
627
+   * If not provided, the default is to only allow read access to the URL
628
+   * provided in source.uri itself.
629
+   * @platform macos
630
+   */
631
+  allowingReadAccessToURL?: string;
632
+
633
+  /**
634
+   * Function that is invoked when the WebKit WebView content process gets terminated.
635
+   * @platform macos
636
+   */
637
+  onContentProcessDidTerminate?: (event: WebViewTerminatedEvent) => void;
638
+}
639
+
479 640
 export interface AndroidWebViewProps extends WebViewSharedProps {
480 641
   onNavigationStateChange?: (event: WebViewNavigation) => void;
481 642
   onContentSizeChange?: (event: WebViewEvent) => void;

+ 0
- 0
src/__tests__/WebViewShared-test.js View File


Some files were not shown because too many files changed in this diff