From 1e572318ec6c9cd1f88be86950564a2d3cbfe1c2 Mon Sep 17 00:00:00 2001 From: Tom Underhill Date: Wed, 12 Feb 2020 15:39:11 -0800 Subject: [PATCH] feat(macOS): macOS Support (#1164) --- README.md | 1 + docs/Contributing.md | 38 + docs/Getting-Started.md | 22 +- docs/Reference.md | 36 +- example/.gitignore | 5 +- example/ios/Podfile.lock | 4 +- example/macos/example-macOS/AppDelegate.h | 16 + example/macos/example-macOS/AppDelegate.m | 39 + example/macos/example-macOS/Info.plist | 45 + example/macos/example-macOS/Main.storyboard | 713 ++++++++ example/macos/example-macOS/ViewController.h | 12 + example/macos/example-macOS/ViewController.m | 29 + example/macos/example-macOS/main.m | 12 + .../macos/example.xcodeproj/project.pbxproj | 1569 +++++++++++++++++ .../xcshareddata/WorkspaceSettings.xcsettings | 10 + .../xcschemes/example-macOS.xcscheme | 92 + .../xcshareddata/xcschemes/example.xcscheme | 92 + example/macos/example/AppDelegate.h | 15 + example/macos/example/AppDelegate.m | 42 + .../macos/example/Base.lproj/LaunchScreen.xib | 42 + .../AppIcon.appiconset/Contents.json | 53 + .../example/Images.xcassets/Contents.json | 6 + example/macos/example/Info.plist | 57 + example/macos/example/main.m | 16 + ios/RNCWebView.m | 206 ++- ios/RNCWebViewManager.m | 6 + macos/RNCWebView.xcodeproj/project.pbxproj | 363 ++++ metro.config.js | 12 + metro.config.macos.js | 19 + package.json | 7 +- react-native.config.js | 26 + src/WebView.macos.tsx | 347 ++++ src/WebViewTypes.ts | 189 +- yarn.lock | 319 +++- 34 files changed, 4376 insertions(+), 84 deletions(-) create mode 100644 example/macos/example-macOS/AppDelegate.h create mode 100644 example/macos/example-macOS/AppDelegate.m create mode 100644 example/macos/example-macOS/Info.plist create mode 100644 example/macos/example-macOS/Main.storyboard create mode 100644 example/macos/example-macOS/ViewController.h create mode 100644 example/macos/example-macOS/ViewController.m create mode 100644 example/macos/example-macOS/main.m create mode 100644 example/macos/example.xcodeproj/project.pbxproj create mode 100644 example/macos/example.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 example/macos/example.xcodeproj/xcshareddata/xcschemes/example-macOS.xcscheme create mode 100644 example/macos/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme create mode 100644 example/macos/example/AppDelegate.h create mode 100644 example/macos/example/AppDelegate.m create mode 100644 example/macos/example/Base.lproj/LaunchScreen.xib create mode 100644 example/macos/example/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 example/macos/example/Images.xcassets/Contents.json create mode 100644 example/macos/example/Info.plist create mode 100644 example/macos/example/main.m create mode 100644 macos/RNCWebView.xcodeproj/project.pbxproj create mode 100644 metro.config.js create mode 100644 metro.config.macos.js create mode 100644 react-native.config.js create mode 100644 src/WebView.macos.tsx diff --git a/README.md b/README.md index 7d46017..3ab6128 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ _This project is maintained for free by these people using both their free time - [x] iOS - [x] Android +- [x] macOS _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)._ diff --git a/docs/Contributing.md b/docs/Contributing.md index 2390e3a..a2a2348 100644 --- a/docs/Contributing.md +++ b/docs/Contributing.md @@ -8,6 +8,44 @@ Secondly, we'd like the contribution experience to be as good as possible. While After you fork the repo, clone it to your machine, and make your changes, you'll want to test them in an app. +There are two methods of testing: +1) Testing within a clone of react-native-webview +2) Testing in a new `react-native init` project + +### Testing within react-native-webview + +#### For all platforms: +``` +$ yarn install +``` + +#### For Android: +``` +$ yarn start:android +``` + +The Android example app will built, the Metro Bundler will launch, and the example app will be installed and started in the Android emulator. + +#### For iOS: +``` +$ cd example/ios +$ pod install +$ cd ../.. +$ yarn start:ios +``` + +The iOS example app will be built, the Metro bundler will launch, and the example app will be install and started in the Simulator. + +#### for macOS: +``` +$ open example/macos/example.xcodeproj +$ yarn start:macos +``` + +The Metro Bundler will now be running in the Terminal for react-native-macos. In XCode select the `example-macos` target and Run. + +### Testing in a new `react-native init` project + In a new `react-native init` project, do this: ``` diff --git a/docs/Getting-Started.md b/docs/Getting-Started.md index 0df4509..70f9ab0 100644 --- a/docs/Getting-Started.md +++ b/docs/Getting-Started.md @@ -2,7 +2,7 @@ Here's how to get started quickly with the React Native WebView. -#### 1. Add react-native-webview to your dependencies +## 1. Add react-native-webview to your dependencies ``` $ yarn add react-native-webview @@ -14,7 +14,7 @@ $ yarn add react-native-webview $ npm install --save react-native-webview ``` -#### 2. Link native dependencies +## 2. Link native dependencies From react-native 0.60 autolinking will take care of the link step but don't forget to run `pod install` @@ -24,13 +24,20 @@ React Native modules that include native Objective-C, Swift, Java, or Kotlin cod $ react-native link react-native-webview ``` -iOS: +_NOTE: If you ever need to uninstall React Native WebView, run `react-native unlink react-native-webview` to unlink it._ + +### iOS: If using cocoapods in the `ios/` directory run ``` $ pod install ``` +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. +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). + +### Android: + Android - react-native-webview version <6: This module does not require any extra step after running the link command 🎉 @@ -44,12 +51,13 @@ android.enableJetifier=true 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. -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. -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). +### macOS: -_NOTE: If you ever need to uninstall React Native WebView, run `react-native unlink react-native-webview` to unlink it._ +Cocoapod and autolinking is not yet support for react-native macOS but is coming soon. In the meantime you must manually link. -#### 3. Import the webview into your component +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. + +## 3. Import the webview into your component ```js import React, { Component } from 'react'; diff --git a/docs/Reference.md b/docs/Reference.md index 3ae2348..5852eb7 100644 --- a/docs/Reference.md +++ b/docs/Reference.md @@ -474,9 +474,9 @@ Note that this method will not be invoked on hash URL changes (e.g. from `https: Function that is invoked when the `WebView` content process is terminated. -| Type | Required | Platform | -| -------- | -------- | ------------- | -| function | No | iOS WKWebView | +| Type | Required | Platform | +| -------- | -------- | ----------------------- | +| function | No | iOS and macOS WKWebView | Example: @@ -863,9 +863,9 @@ Possible values for `dataDetectorTypes` are: 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. -| Type | Required | Platform | -| ---- | -------- | -------- | -| bool | No | iOS | +| Type | Required | Platform | +| ---- | -------- | ------------- | +| bool | No | iOS and macOS | --- @@ -934,9 +934,9 @@ Boolean that sets whether JavaScript running in the context of a file scheme URL 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. -| Type | Required | Platform | -| ------ | -------- | -------- | -| string | No | iOS | +| Type | Required | Platform | +| ------ | -------- | ------------- | +| string | No | iOS and macOS | --- @@ -984,9 +984,9 @@ If true, this will hide the keyboard accessory view (< > and Done). If true, this will be able horizontal swipe gestures. The default value is `false`. -| Type | Required | Platform | -| ------- | -------- | -------- | -| boolean | No | iOS | +| Type | Required | Platform | +| ------- | -------- | ----------------- | +| boolean | No | iOS and macOS | --- @@ -1061,9 +1061,9 @@ If the value of this property is true, the scroll view stops on multiples of the 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. -| Type | Required | Platform | -| ------- | -------- | -------- | -| boolean | No | iOS | +| Type | Required | Platform | +| ------- | -------- | ----------------- | +| boolean | No | iOS and macOS | --- @@ -1071,9 +1071,9 @@ A Boolean value that determines whether pressing on a link displays a preview of 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) -| Type | Required | Platform | -| ------- | -------- | -------- | -| boolean | No | iOS | +| Type | Required | Platform | +| ------- | -------- | ----------------- | +| boolean | No | iOS and macOS | --- diff --git a/example/.gitignore b/example/.gitignore index aadce1a..3a3f3a5 100755 --- a/example/.gitignore +++ b/example/.gitignore @@ -20,7 +20,10 @@ DerivedData *.hmap *.ipa *.xcuserstate -project.xcworkspace +# exclude project.xcworkspace except for xcshareddata/WorkspaceSettings.xcsettings +project.xcworkspace/* +**/project.xcworkspace/contents.xcworkspacedata +**/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist # Android/IntelliJ # diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 8c01606..ecaea72 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -182,7 +182,7 @@ PODS: - React-cxxreact (= 0.61.5) - React-jsi (= 0.61.5) - React-jsinspector (0.61.5) - - react-native-webview (8.0.4): + - react-native-webview (8.0.6): - React - React-RCTActionSheet (0.61.5): - React-Core/RCTActionSheetHeaders (= 0.61.5) @@ -326,7 +326,7 @@ SPEC CHECKSUMS: React-jsi: cb2cd74d7ccf4cffb071a46833613edc79cdf8f7 React-jsiexecutor: d5525f9ed5f782fdbacb64b9b01a43a9323d2386 React-jsinspector: fa0ecc501688c3c4c34f28834a76302233e29dc0 - react-native-webview: 3f5aa91c3cb083ea4762e006b9653291a96a777a + react-native-webview: 222d83c9c489e09b5d3541519110a637490ad4fa React-RCTActionSheet: 600b4d10e3aea0913b5a92256d2719c0cdd26d76 React-RCTAnimation: 791a87558389c80908ed06cc5dfc5e7920dfa360 React-RCTBlob: d89293cc0236d9cb0933d85e430b0bbe81ad1d72 diff --git a/example/macos/example-macOS/AppDelegate.h b/example/macos/example-macOS/AppDelegate.h new file mode 100644 index 0000000..37c4159 --- /dev/null +++ b/example/macos/example-macOS/AppDelegate.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@class RCTBridge; + +@interface AppDelegate : NSObject + +@property (nonatomic, readonly) RCTBridge *bridge; + +@end diff --git a/example/macos/example-macOS/AppDelegate.m b/example/macos/example-macOS/AppDelegate.m new file mode 100644 index 0000000..80c979e --- /dev/null +++ b/example/macos/example-macOS/AppDelegate.m @@ -0,0 +1,39 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "AppDelegate.h" + +#import +#import + +@interface AppDelegate () + +@end + +@implementation AppDelegate + +- (void)awakeFromNib { + [super awakeFromNib]; + + _bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:nil]; +} + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + // Insert code here to initialize your application +} + +- (void)applicationWillTerminate:(NSNotification *)aNotification { + // Insert code here to tear down your application +} + +#pragma mark - RCTBridgeDelegate Methods + +- (NSURL *)sourceURLForBridge:(__unused RCTBridge *)bridge { + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"example/index" fallbackResource:@"main"]; // .jsbundle; +} + +@end diff --git a/example/macos/example-macOS/Info.plist b/example/macos/example-macOS/Info.plist new file mode 100644 index 0000000..6984b30 --- /dev/null +++ b/example/macos/example-macOS/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + NSHumanReadableCopyright + Copyright © 2017 Facebook. All rights reserved. + NSMainStoryboardFile + Main + NSPrincipalClass + NSApplication + + diff --git a/example/macos/example-macOS/Main.storyboard b/example/macos/example-macOS/Main.storyboard new file mode 100644 index 0000000..e0e5372 --- /dev/null +++ b/example/macos/example-macOS/Main.storyboard @@ -0,0 +1,713 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/macos/example-macOS/ViewController.h b/example/macos/example-macOS/ViewController.h new file mode 100644 index 0000000..3dbe6da --- /dev/null +++ b/example/macos/example-macOS/ViewController.h @@ -0,0 +1,12 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +@interface ViewController : NSViewController + +@end diff --git a/example/macos/example-macOS/ViewController.m b/example/macos/example-macOS/ViewController.m new file mode 100644 index 0000000..e816aa3 --- /dev/null +++ b/example/macos/example-macOS/ViewController.m @@ -0,0 +1,29 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "ViewController.h" +#import "AppDelegate.h" + +#import + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + RCTBridge *bridge = [((AppDelegate *)[NSApp delegate])bridge]; + RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"example" initialProperties:nil]; + + NSView *view = [self view]; + + [view addSubview:rootView]; + [rootView setBackgroundColor:[NSColor windowBackgroundColor]]; + [rootView setFrame:[view bounds]]; + [rootView setAutoresizingMask:(NSViewMinXMargin | NSViewMinXMargin | NSViewMinYMargin | NSViewMaxYMargin | NSViewWidthSizable | NSViewHeightSizable)]; +} + +@end diff --git a/example/macos/example-macOS/main.m b/example/macos/example-macOS/main.m new file mode 100644 index 0000000..023187f --- /dev/null +++ b/example/macos/example-macOS/main.m @@ -0,0 +1,12 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +int main(int argc, const char *argv[]) { + return NSApplicationMain(argc, argv); +} diff --git a/example/macos/example.xcodeproj/project.pbxproj b/example/macos/example.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ac027ac --- /dev/null +++ b/example/macos/example.xcodeproj/project.pbxproj @@ -0,0 +1,1569 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; + 11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; + 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 38116A3723BBECFB00ACE311 /* libRNCWebView-macOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 38116A3623BBECFB00ACE311 /* libRNCWebView-macOS.a */; }; + 38C1421623BBE5B500902604 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 38C1421523BBE5B500902604 /* main.m */; }; + 38C1421823BBE65C00902604 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 38C1421723BBE65C00902604 /* AppDelegate.m */; }; + 38C1421C23BBE70D00902604 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 38C1421B23BBE70D00902604 /* ViewController.m */; }; + 38C1421D23BBE79300902604 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 38C141C223BBE33000902604 /* libReact.a */; }; + 38C1421F23BBE7A000902604 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 38C1421E23BBE7A000902604 /* JavaScriptCore.framework */; }; + 38C1422023BBE8E500902604 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 38C141A223BBE33000902604 /* libRCTWebSocket.a */; }; + 38C1422223BBE98D00902604 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 38C1422123BBE98D00902604 /* Main.storyboard */; }; + 38C1422323BBEB6400902604 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 38C1418F23BBE33000902604 /* libRCTNetwork.a */; }; + 38C1422423BBEB8300902604 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 38C1419923BBE33000902604 /* libRCTText.a */; }; + 38C1422523BBEC1D00902604 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 38C1417B23BBE33000902604 /* libRCTAnimation.a */; }; + 3D82E3B72248BD39001F5D1A /* libRNCWebView.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DC5398C220F2C940035D3A3 /* libRNCWebView.a */; }; + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; + ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; }; + ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED297162215061F000B7C4FE /* JavaScriptCore.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTActionSheet; + }; + 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5115D1A9E6B3D00147676; + remoteInfo = RCTImage; + }; + 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B511DB1A9E6C8500147676; + remoteInfo = RCTNetwork; + }; + 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; + remoteInfo = RCTVibration; + }; + 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTSettings; + }; + 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3C86DF461ADF2C930047B81A; + remoteInfo = RCTWebSocket; + }; + 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; + remoteInfo = React; + }; + 1990B95122398FC4009E5EA1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3DC5395A220F2C940035D3A3 /* RNCWebView.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 58B511DA1A9E6C8500147676; + remoteInfo = RNCWebView; + }; + 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = ADD01A681E09402E00F6D226; + remoteInfo = "RCTBlob-tvOS"; + }; + 2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EBF21BDC1FC498900052F4D5; + remoteInfo = jsinspector; + }; + 2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EBF21BFA1FC4989A0052F4D5; + remoteInfo = "jsinspector-tvOS"; + }; + 2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 139D7ECE1E25DB7D00323FB7; + remoteInfo = "third-party"; + }; + 2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D383D3C1EBD27B6005632C8; + remoteInfo = "third-party-tvOS"; + }; + 2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 139D7E881E25C6D100323FB7; + remoteInfo = "double-conversion"; + }; + 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D383D621EBD27B9005632C8; + remoteInfo = "double-conversion-tvOS"; + }; + 38116A3523BBECFB00ACE311 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3DC5395A220F2C940035D3A3 /* RNCWebView.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 38116A3323BBECB700ACE311; + remoteInfo = "RNCWebView-macOS"; + }; + 38116A6E23BBED1000ACE311 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3DC5395A220F2C940035D3A3 /* RNCWebView.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 38116A2923BBECB700ACE311; + remoteInfo = "RNCWebView-macOS"; + }; + 38C1417523BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 649D87D21F69D9BC0005AF18; + remoteInfo = "RCTActionSheet-macOS"; + }; + 38C1417A23BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 647647C51F0BC7F200C2D89B; + remoteInfo = "RCTAnimation-macOS"; + }; + 38C1417F23BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 6484CE57201A74FA004275A4; + remoteInfo = "RCTBlob-macOS"; + }; + 38C1418423BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 6BDE7AEB1ECB9C4400CC951F; + remoteInfo = "RCTImage-macOS"; + }; + 38C1418923BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D4C812E71F1CC42300FFA059; + remoteInfo = "RCTLinking-macOS"; + }; + 38C1418E23BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 6BDE7A901ECB6E8400CC951F; + remoteInfo = "RCTNetwork-macOS"; + }; + 38C1419323BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 6448A5CD1F292E63006FF1F5; + remoteInfo = "RCTSettings-macOS"; + }; + 38C1419823BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5119B1A9E6C1200147675; + remoteInfo = "RCTText-macos"; + }; + 38C141A123BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 6BDE7A581ECB6B8200CC951F; + remoteInfo = "RCTWebSocket-macOS"; + }; + 38C141A323BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3DBE0D001F3B181A0099AA32; + remoteInfo = fishhook; + }; + 38C141A523BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32; + remoteInfo = "fishhook-tvOS"; + }; + 38C141A723BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 18C3A9BF1FE1D41600DEC48A; + remoteInfo = "fishhook-macOS"; + }; + 38C141C123BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9F2AC95D2239D788005C9C14; + remoteInfo = "React-macOS"; + }; + 38C141C323BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9F5C195B230F4CB300E3E5A7; + remoteInfo = "yoga-macOS"; + }; + 38C141C523BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 6B857F421EC51FCF00A9D063; + remoteInfo = "cxxreact-macOS"; + }; + 38C141C723BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9F2AC95E2239D788005C9C14; + remoteInfo = "jsinspector-macOS"; + }; + 38C141C923BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 188202A21EF48CF700C9B354; + remoteInfo = "third-party-macOS"; + }; + 38C141CB23BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 1882027C1EF48B7E00C9B354; + remoteInfo = "double-conversion-macOS"; + }; + 38C141CD23BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9FD21D78224303D900E7F88E; + remoteInfo = "jsi-macOS"; + }; + 38C141CF23BBE33000902604 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9FD21D94224305AA00E7F88E; + remoteInfo = "jsiexecutor-macOS"; + }; + 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; + remoteInfo = "RCTImage-tvOS"; + }; + 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28471D9B043800D4039D; + remoteInfo = "RCTLinking-tvOS"; + }; + 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28541D9B044C00D4039D; + remoteInfo = "RCTNetwork-tvOS"; + }; + 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28611D9B046600D4039D; + remoteInfo = "RCTSettings-tvOS"; + }; + 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A287B1D9B048500D4039D; + remoteInfo = "RCTText-tvOS"; + }; + 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28881D9B049200D4039D; + remoteInfo = "RCTWebSocket-tvOS"; + }; + 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28131D9B038B00D4039D; + remoteInfo = "React-tvOS"; + }; + 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3C059A1DE3340900C268FA; + remoteInfo = yoga; + }; + 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3C06751DE3340C00C268FA; + remoteInfo = "yoga-tvOS"; + }; + 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; + remoteInfo = cxxreact; + }; + 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; + remoteInfo = "cxxreact-tvOS"; + }; + 3DC53982220F2C940035D3A3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EDEBC6D6214B3E7000DD5AC8; + remoteInfo = jsi; + }; + 3DC53984220F2C940035D3A3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EDEBC73B214B45A300DD5AC8; + remoteInfo = jsiexecutor; + }; + 3DC53986220F2C940035D3A3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = ED296FB6214C9A0900B7C4FE; + remoteInfo = "jsi-tvOS"; + }; + 3DC53988220F2C940035D3A3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = ED296FEE214C9CF800B7C4FE; + remoteInfo = "jsiexecutor-tvOS"; + }; + 3DC5398B220F2C940035D3A3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3DC5395A220F2C940035D3A3 /* RNCWebView.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RNCWebView; + }; + 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTAnimation; + }; + 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28201D9B03D100D4039D; + remoteInfo = "RCTAnimation-tvOS"; + }; + 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTLinking; + }; + 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5119B1A9E6C1200147676; + remoteInfo = RCTText; + }; + ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 358F4ED71D1E81A9004DF814; + remoteInfo = RCTBlob; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../../node_modules/react-native-macos/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../../node_modules/react-native-macos/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../../node_modules/react-native-macos/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../../node_modules/react-native-macos/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../../node_modules/react-native-macos/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../../node_modules/react-native-macos/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = example/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = example/AppDelegate.m; sourceTree = ""; }; + 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = example/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = example/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = example/main.m; sourceTree = ""; }; + 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../../node_modules/react-native-macos/React/React.xcodeproj"; sourceTree = ""; }; + 2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 38C1417223BBE33000902604 /* example-macOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example-macOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 38C141D123BBE33000902604 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "example-macOS/Info.plist"; sourceTree = ""; }; + 38C1421523BBE5B500902604 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 38C1421723BBE65C00902604 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 38C1421923BBE66C00902604 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 38C1421A23BBE70D00902604 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 38C1421B23BBE70D00902604 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 38C1421E23BBE7A000902604 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; + 38C1422123BBE98D00902604 /* Main.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + 3DC5395A220F2C940035D3A3 /* RNCWebView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNCWebView.xcodeproj; path = ../../macos/RNCWebView.xcodeproj; sourceTree = ""; }; + 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../../node_modules/react-native-macos/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../../node_modules/react-native-macos/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../../node_modules/react-native-macos/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; + ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../../node_modules/react-native-macos/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = ""; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + 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; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3D82E3B72248BD39001F5D1A /* libRNCWebView.a in Frameworks */, + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, + 11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */, + ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */, + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, + 146834051AC3E58100842450 /* libReact.a in Frameworks */, + ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 38C1415D23BBE33000902604 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 38116A3723BBECFB00ACE311 /* libRNCWebView-macOS.a in Frameworks */, + 38C1422523BBEC1D00902604 /* libRCTAnimation.a in Frameworks */, + 38C1422423BBEB8300902604 /* libRCTText.a in Frameworks */, + 38C1422323BBEB6400902604 /* libRCTNetwork.a in Frameworks */, + 38C1422023BBE8E500902604 /* libRCTWebSocket.a in Frameworks */, + 38C1421D23BBE79300902604 /* libReact.a in Frameworks */, + 38C1421F23BBE7A000902604 /* JavaScriptCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 00C302A81ABCB8CE00DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, + 38C1417623BBE33000902604 /* libRCTActionSheet.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302BC1ABCB91800DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, + 38C1418523BBE33000902604 /* libRCTImage.a */, + 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302D41ABCB9D200DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, + 38C1418F23BBE33000902604 /* libRCTNetwork.a */, + 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302E01ABCB9EE00DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, + ); + name = Products; + sourceTree = ""; + }; + 139105B71AF99BAD00B5F7CC /* Products */ = { + isa = PBXGroup; + children = ( + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, + 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, + 38C1419423BBE33000902604 /* libRCTSettings-macOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 139FDEE71B06529A00C62182 /* Products */ = { + isa = PBXGroup; + children = ( + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, + 38C141A223BBE33000902604 /* libRCTWebSocket.a */, + 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, + 38C141A423BBE33000902604 /* libfishhook.a */, + 38C141A623BBE33000902604 /* libfishhook-tvOS.a */, + 38C141A823BBE33000902604 /* libfishhook-macOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 13B07FAE1A68108700A75B9A /* example */ = { + isa = PBXGroup; + children = ( + 008F07F21AC5B25A0029DE68 /* main.jsbundle */, + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.m */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, + 13B07FB71A68108700A75B9A /* main.m */, + ); + name = example; + sourceTree = ""; + }; + 146834001AC3E56700842450 /* Products */ = { + isa = PBXGroup; + children = ( + 146834041AC3E56700842450 /* libReact.a */, + 38C141C223BBE33000902604 /* libReact.a */, + 3DAD3EA31DF850E9000B6D8A /* libReact.a */, + 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, + 38C141C423BBE33000902604 /* libyoga.a */, + 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, + 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, + 38C141C623BBE33000902604 /* libcxxreact.a */, + 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, + 2DF0FFDF2056DD460020B375 /* libjsinspector.a */, + 38C141C823BBE33000902604 /* libjsinspector-macOS.a */, + 2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */, + 2DF0FFE32056DD460020B375 /* libthird-party.a */, + 38C141CA23BBE33000902604 /* libthird-party.a */, + 2DF0FFE52056DD460020B375 /* libthird-party.a */, + 2DF0FFE72056DD460020B375 /* libdouble-conversion.a */, + 38C141CC23BBE33000902604 /* libdouble-conversion.a */, + 2DF0FFE92056DD460020B375 /* libdouble-conversion.a */, + 3DC53983220F2C940035D3A3 /* libjsi.a */, + 3DC53987220F2C940035D3A3 /* libjsi-tvOS.a */, + 38C141CE23BBE33000902604 /* libjsi-macOS.a */, + 3DC53985220F2C940035D3A3 /* libjsiexecutor.a */, + 38C141D023BBE33000902604 /* libjsiexecutor-macOS.a */, + 3DC53989220F2C940035D3A3 /* libjsiexecutor-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + ED2971642150620600B7C4FE /* JavaScriptCore.framework */, + 38C1421E23BBE7A000902604 /* JavaScriptCore.framework */, + 2D16E6891FA4F8E400B85C8A /* libReact.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 38C141D223BBE3E600902604 /* example-macOS */ = { + isa = PBXGroup; + children = ( + 38C141D123BBE33000902604 /* Info.plist */, + 38C1421523BBE5B500902604 /* main.m */, + 38C1421723BBE65C00902604 /* AppDelegate.m */, + 38C1421923BBE66C00902604 /* AppDelegate.h */, + 38C1421A23BBE70D00902604 /* ViewController.h */, + 38C1421B23BBE70D00902604 /* ViewController.m */, + 38C1422123BBE98D00902604 /* Main.storyboard */, + ); + path = "example-macOS"; + sourceTree = ""; + }; + 3DC5395B220F2C940035D3A3 /* Products */ = { + isa = PBXGroup; + children = ( + 3DC5398C220F2C940035D3A3 /* libRNCWebView.a */, + 38116A3623BBECFB00ACE311 /* libRNCWebView-macOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 5E91572E1DD0AC6500FF2AA8 /* Products */ = { + isa = PBXGroup; + children = ( + 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, + 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */, + 38C1417B23BBE33000902604 /* libRCTAnimation.a */, + ); + name = Products; + sourceTree = ""; + }; + 78C398B11ACF4ADC00677621 /* Products */ = { + isa = PBXGroup; + children = ( + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, + 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, + 38C1418A23BBE33000902604 /* libRCTLinking-macOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, + 146833FF1AC3E56700842450 /* React.xcodeproj */, + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, + ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */, + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, + ); + name = Libraries; + sourceTree = ""; + }; + 832341B11AAA6A8300B99B32 /* Products */ = { + isa = PBXGroup; + children = ( + 832341B51AAA6A8300B99B32 /* libRCTText.a */, + 38C1419923BBE33000902604 /* libRCTText.a */, + 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 3DC5395A220F2C940035D3A3 /* RNCWebView.xcodeproj */, + 13B07FAE1A68108700A75B9A /* example */, + 38C141D223BBE3E600902604 /* example-macOS */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* example.app */, + 38C1417223BBE33000902604 /* example-macOS.app */, + ); + name = Products; + sourceTree = ""; + }; + ADBDB9201DFEBF0600ED6528 /* Products */ = { + isa = PBXGroup; + children = ( + ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */, + 2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */, + 38C1418023BBE33000902604 /* libRCTBlob-macOS.a */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 13B07F861A680F5B00A75B9A /* example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */; + buildPhases = ( + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + ); + buildRules = ( + ); + dependencies = ( + 1990B95222398FC4009E5EA1 /* PBXTargetDependency */, + ); + name = example; + productName = "Hello World"; + productReference = 13B07F961A680F5B00A75B9A /* example.app */; + productType = "com.apple.product-type.application"; + }; + 38C1415723BBE33000902604 /* example-macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 38C1416F23BBE33000902604 /* Build configuration list for PBXNativeTarget "example-macOS" */; + buildPhases = ( + 38C1415A23BBE33000902604 /* Sources */, + 38C1415D23BBE33000902604 /* Frameworks */, + 38C1416B23BBE33000902604 /* Resources */, + 38C1416E23BBE33000902604 /* Bundle React Native code and images */, + ); + buildRules = ( + ); + dependencies = ( + 38116A6F23BBED1000ACE311 /* PBXTargetDependency */, + ); + name = "example-macOS"; + productName = "Hello World"; + productReference = 38C1417223BBE33000902604 /* example-macOS.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0940; + ORGANIZATIONNAME = Facebook; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "example" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; + ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + }, + { + ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; + ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + }, + { + ProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */; + ProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; + }, + { + ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; + ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + }, + { + ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; + ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + }, + { + ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; + ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + }, + { + ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; + ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + }, + { + ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; + ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + }, + { + ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; + ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; + }, + { + ProductGroup = 139FDEE71B06529A00C62182 /* Products */; + ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + }, + { + ProductGroup = 146834001AC3E56700842450 /* Products */; + ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; + }, + { + ProductGroup = 3DC5395B220F2C940035D3A3 /* Products */; + ProjectRef = 3DC5395A220F2C940035D3A3 /* RNCWebView.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* example */, + 38C1415723BBE33000902604 /* example-macOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTActionSheet.a; + remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTImage.a; + remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTNetwork.a; + remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTVibration.a; + remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTSettings.a; + remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTWebSocket.a; + remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 146834041AC3E56700842450 /* libReact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libReact.a; + remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTBlob-tvOS.a"; + remoteRef = 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2DF0FFDF2056DD460020B375 /* libjsinspector.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjsinspector.a; + remoteRef = 2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libjsinspector-tvOS.a"; + remoteRef = 2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2DF0FFE32056DD460020B375 /* libthird-party.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libthird-party.a"; + remoteRef = 2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2DF0FFE52056DD460020B375 /* libthird-party.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libthird-party.a"; + remoteRef = 2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2DF0FFE72056DD460020B375 /* libdouble-conversion.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libdouble-conversion.a"; + remoteRef = 2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2DF0FFE92056DD460020B375 /* libdouble-conversion.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libdouble-conversion.a"; + remoteRef = 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38116A3623BBECFB00ACE311 /* libRNCWebView-macOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRNCWebView-macOS.a"; + remoteRef = 38116A3523BBECFB00ACE311 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C1417623BBE33000902604 /* libRCTActionSheet.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTActionSheet.a; + remoteRef = 38C1417523BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C1417B23BBE33000902604 /* libRCTAnimation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTAnimation.a; + remoteRef = 38C1417A23BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C1418023BBE33000902604 /* libRCTBlob-macOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTBlob-macOS.a"; + remoteRef = 38C1417F23BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C1418523BBE33000902604 /* libRCTImage.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTImage.a; + remoteRef = 38C1418423BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C1418A23BBE33000902604 /* libRCTLinking-macOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTLinking-macOS.a"; + remoteRef = 38C1418923BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C1418F23BBE33000902604 /* libRCTNetwork.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTNetwork.a; + remoteRef = 38C1418E23BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C1419423BBE33000902604 /* libRCTSettings-macOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTSettings-macOS.a"; + remoteRef = 38C1419323BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C1419923BBE33000902604 /* libRCTText.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTText.a; + remoteRef = 38C1419823BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C141A223BBE33000902604 /* libRCTWebSocket.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTWebSocket.a; + remoteRef = 38C141A123BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C141A423BBE33000902604 /* libfishhook.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libfishhook.a; + remoteRef = 38C141A323BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C141A623BBE33000902604 /* libfishhook-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libfishhook-tvOS.a"; + remoteRef = 38C141A523BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C141A823BBE33000902604 /* libfishhook-macOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libfishhook-macOS.a"; + remoteRef = 38C141A723BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C141C223BBE33000902604 /* libReact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libReact.a; + remoteRef = 38C141C123BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C141C423BBE33000902604 /* libyoga.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libyoga.a; + remoteRef = 38C141C323BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C141C623BBE33000902604 /* libcxxreact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libcxxreact.a; + remoteRef = 38C141C523BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C141C823BBE33000902604 /* libjsinspector-macOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libjsinspector-macOS.a"; + remoteRef = 38C141C723BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C141CA23BBE33000902604 /* libthird-party.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libthird-party.a"; + remoteRef = 38C141C923BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C141CC23BBE33000902604 /* libdouble-conversion.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libdouble-conversion.a"; + remoteRef = 38C141CB23BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C141CE23BBE33000902604 /* libjsi-macOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libjsi-macOS.a"; + remoteRef = 38C141CD23BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 38C141D023BBE33000902604 /* libjsiexecutor-macOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libjsiexecutor-macOS.a"; + remoteRef = 38C141CF23BBE33000902604 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTImage-tvOS.a"; + remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTLinking-tvOS.a"; + remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTNetwork-tvOS.a"; + remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTSettings-tvOS.a"; + remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTText-tvOS.a"; + remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTWebSocket-tvOS.a"; + remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libReact.a; + remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libyoga.a; + remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libyoga.a; + remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libcxxreact.a; + remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libcxxreact.a; + remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DC53983220F2C940035D3A3 /* libjsi.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjsi.a; + remoteRef = 3DC53982220F2C940035D3A3 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DC53985220F2C940035D3A3 /* libjsiexecutor.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjsiexecutor.a; + remoteRef = 3DC53984220F2C940035D3A3 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DC53987220F2C940035D3A3 /* libjsi-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libjsi-tvOS.a"; + remoteRef = 3DC53986220F2C940035D3A3 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DC53989220F2C940035D3A3 /* libjsiexecutor-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libjsiexecutor-tvOS.a"; + remoteRef = 3DC53988220F2C940035D3A3 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DC5398C220F2C940035D3A3 /* libRNCWebView.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNCWebView.a; + remoteRef = 3DC5398B220F2C940035D3A3 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTAnimation.a; + remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTAnimation.a; + remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTLinking.a; + remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTText.a; + remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTBlob.a; + remoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 38C1416B23BBE33000902604 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 38C1422223BBE98D00902604 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../../node_modules/react-native-macos/scripts/react-native-xcode.sh\n"; + }; + 38C1416E23BBE33000902604 /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../../node_modules/react-native-macos/scripts/react-native-xcode.sh\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 38C1415A23BBE33000902604 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 38C1421C23BBE70D00902604 /* ViewController.m in Sources */, + 38C1421823BBE65C00902604 /* AppDelegate.m in Sources */, + 38C1421623BBE5B500902604 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 1990B95222398FC4009E5EA1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RNCWebView; + targetProxy = 1990B95122398FC4009E5EA1 /* PBXContainerItemProxy */; + }; + 38116A6F23BBED1000ACE311 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "RNCWebView-macOS"; + targetProxy = 38116A6E23BBED1000ACE311 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 13B07FB21A68108700A75B9A /* Base */, + ); + name = LaunchScreen.xib; + path = example; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = NO; + INFOPLIST_FILE = example/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = example; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = example/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = example; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 38C1417023BBE33000902604 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = NO; + INFOPLIST_FILE = "example-macos/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.14; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 38C1417123BBE33000902604 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = "example-macos/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.14; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 38C1416F23BBE33000902604 /* Build configuration list for PBXNativeTarget "example-macOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 38C1417023BBE33000902604 /* Debug */, + 38C1417123BBE33000902604 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/example/macos/example.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/macos/example.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..6b30c74 --- /dev/null +++ b/example/macos/example.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + BuildSystemType + Original + PreviewsEnabled + + + diff --git a/example/macos/example.xcodeproj/xcshareddata/xcschemes/example-macOS.xcscheme b/example/macos/example.xcodeproj/xcshareddata/xcschemes/example-macOS.xcscheme new file mode 100644 index 0000000..15fb8f1 --- /dev/null +++ b/example/macos/example.xcodeproj/xcshareddata/xcschemes/example-macOS.xcscheme @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/macos/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme b/example/macos/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme new file mode 100644 index 0000000..3b13f1d --- /dev/null +++ b/example/macos/example.xcodeproj/xcshareddata/xcschemes/example.xcscheme @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/macos/example/AppDelegate.h b/example/macos/example/AppDelegate.h new file mode 100644 index 0000000..2726d5e --- /dev/null +++ b/example/macos/example/AppDelegate.h @@ -0,0 +1,15 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import +#import + +@interface AppDelegate : UIResponder + +@property (nonatomic, strong) UIWindow *window; + +@end diff --git a/example/macos/example/AppDelegate.m b/example/macos/example/AppDelegate.m new file mode 100644 index 0000000..76fd0e7 --- /dev/null +++ b/example/macos/example/AppDelegate.m @@ -0,0 +1,42 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "AppDelegate.h" + +#import +#import +#import + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; + RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge + moduleName:@"example" + initialProperties:nil]; + + rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; + + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; + UIViewController *rootViewController = [UIViewController new]; + rootViewController.view = rootView; + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; + return YES; +} + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ +#if DEBUG + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"example/index" fallbackResource:nil]; +#else + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; +#endif +} + +@end diff --git a/example/macos/example/Base.lproj/LaunchScreen.xib b/example/macos/example/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..9e04807 --- /dev/null +++ b/example/macos/example/Base.lproj/LaunchScreen.xib @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/macos/example/Images.xcassets/AppIcon.appiconset/Contents.json b/example/macos/example/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..19882d5 --- /dev/null +++ b/example/macos/example/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/example/macos/example/Images.xcassets/Contents.json b/example/macos/example/Images.xcassets/Contents.json new file mode 100644 index 0000000..2d92bd5 --- /dev/null +++ b/example/macos/example/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/example/macos/example/Info.plist b/example/macos/example/Info.plist new file mode 100644 index 0000000..20fb35c --- /dev/null +++ b/example/macos/example/Info.plist @@ -0,0 +1,57 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + NSLocationWhenInUseUsageDescription + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/example/macos/example/main.m b/example/macos/example/main.m new file mode 100644 index 0000000..c316cf8 --- /dev/null +++ b/example/macos/example/main.m @@ -0,0 +1,16 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/ios/RNCWebView.m b/ios/RNCWebView.m index 88746cf..76a94e1 100644 --- a/ios/RNCWebView.m +++ b/ios/RNCWebView.m @@ -9,7 +9,11 @@ #import #import #import "RNCWKProcessPoolManager.h" +#if !TARGET_OS_OSX #import +#else +#import +#endif // !TARGET_OS_OSX #import "objc/runtime.h" @@ -19,6 +23,7 @@ static NSString *const MessageHandlerName = @"ReactNativeWebView"; static NSURLCredential* clientAuthenticationCredential; static NSDictionary* customCertificatesForHost; +#if !TARGET_OS_OSX // runtime trick to remove WKWebView keyboard default toolbar // see: http://stackoverflow.com/questions/19033292/ios-7-uiwebview-keyboard-issue/19042279#19042279 @interface _SwizzleHelperWK : UIView @@ -39,8 +44,29 @@ static NSDictionary* customCertificatesForHost; return nil; } @end +#endif // !TARGET_OS_OSX -@interface RNCWebView () +#if TARGET_OS_OSX +@interface RNCWKWebView : WKWebView +@end +@implementation RNCWKWebView +- (void)scrollWheel:(NSEvent *)theEvent { + RNCWebView *rncWebView = (RNCWebView *)[self superview]; + RCTAssert([rncWebView isKindOfClass:[rncWebView class]], @"superview must be an RNCWebView"); + if (![rncWebView scrollEnabled]) { + [[self nextResponder] scrollWheel:theEvent]; + return; + } + [super scrollWheel:theEvent]; +} +@end +#endif // TARGET_OS_OSX + +@interface RNCWebView () @property (nonatomic, copy) RCTDirectEventBlock onLoadingStart; @property (nonatomic, copy) RCTDirectEventBlock onLoadingFinish; @property (nonatomic, copy) RCTDirectEventBlock onLoadingError; @@ -50,19 +76,29 @@ static NSDictionary* customCertificatesForHost; @property (nonatomic, copy) RCTDirectEventBlock onMessage; @property (nonatomic, copy) RCTDirectEventBlock onScroll; @property (nonatomic, copy) RCTDirectEventBlock onContentProcessDidTerminate; +#if !TARGET_OS_OSX @property (nonatomic, copy) WKWebView *webView; +#else +@property (nonatomic, copy) RNCWKWebView *webView; +#endif // !TARGET_OS_OSX @end @implementation RNCWebView { +#if !TARGET_OS_OSX UIColor * _savedBackgroundColor; +#else + RCTUIColor * _savedBackgroundColor; +#endif // !TARGET_OS_OSX BOOL _savedHideKeyboardAccessoryView; BOOL _savedKeyboardDisplayRequiresUserAction; // Workaround for StatusBar appearance bug for iOS 12 // https://github.com/react-native-community/react-native-webview/issues/62 BOOL _isFullScreenVideoOpen; +#if !TARGET_OS_OSX UIStatusBarStyle _savedStatusBarStyle; +#endif // !TARGET_OS_OSX BOOL _savedStatusBarHidden; #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */ @@ -73,7 +109,11 @@ static NSDictionary* customCertificatesForHost; - (instancetype)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { + #if !TARGET_OS_OSX super.backgroundColor = [UIColor clearColor]; + #else + super.backgroundColor = [RCTUIColor clearColor]; + #endif // !TARGET_OS_OSX _bounces = YES; _scrollEnabled = YES; _showsHorizontalScrollIndicator = YES; @@ -82,14 +122,17 @@ static NSDictionary* customCertificatesForHost; _automaticallyAdjustContentInsets = YES; _contentInset = UIEdgeInsetsZero; _savedKeyboardDisplayRequiresUserAction = YES; +#if !TARGET_OS_OSX _savedStatusBarStyle = RCTSharedApplication().statusBarStyle; _savedStatusBarHidden = RCTSharedApplication().statusBarHidden; +#endif // !TARGET_OS_OSX #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */ _savedContentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; #endif } +#if !TARGET_OS_OSX if (@available(iOS 12.0, *)) { // Workaround for a keyboard dismissal bug present in iOS 12 // https://openradar.appspot.com/radar?id=5018321736957952 @@ -114,7 +157,7 @@ static NSDictionary* customCertificatesForHost; name:UIWindowDidBecomeHiddenNotification object:nil]; } - +#endif // !TARGET_OS_OSX return self; } @@ -208,6 +251,7 @@ static NSDictionary* customCertificatesForHost; } } +#if !TARGET_OS_OSX wkWebViewConfig.allowsInlineMediaPlayback = _allowsInlineMediaPlayback; #if WEBKIT_IOS_10_APIS_AVAILABLE wkWebViewConfig.mediaTypesRequiringUserActionForPlayback = _mediaPlaybackRequiresUserAction @@ -217,6 +261,7 @@ static NSDictionary* customCertificatesForHost; #else wkWebViewConfig.mediaPlaybackRequiresUserAction = _mediaPlaybackRequiresUserAction; #endif +#endif // !TARGET_OS_OSX if (_applicationNameForUserAgent) { wkWebViewConfig.applicationNameForUserAgent = [NSString stringWithFormat:@"%@ %@", wkWebViewConfig.applicationNameForUserAgent, _applicationNameForUserAgent]; @@ -291,17 +336,26 @@ static NSDictionary* customCertificatesForHost; { if (self.window != nil && _webView == nil) { WKWebViewConfiguration *wkWebViewConfig = [self setUpWkWebViewConfig]; +#if !TARGET_OS_OSX _webView = [[WKWebView alloc] initWithFrame:self.bounds configuration: wkWebViewConfig]; +#else + _webView = [[RNCWKWebView alloc] initWithFrame:self.bounds configuration: wkWebViewConfig]; +#endif // !TARGET_OS_OSX + [self setBackgroundColor: _savedBackgroundColor]; +#if !TARGET_OS_OSX _webView.scrollView.delegate = self; +#endif // !TARGET_OS_OSX _webView.UIDelegate = self; _webView.navigationDelegate = self; +#if !TARGET_OS_OSX _webView.scrollView.scrollEnabled = _scrollEnabled; _webView.scrollView.pagingEnabled = _pagingEnabled; _webView.scrollView.bounces = _bounces; _webView.scrollView.showsHorizontalScrollIndicator = _showsHorizontalScrollIndicator; _webView.scrollView.showsVerticalScrollIndicator = _showsVerticalScrollIndicator; _webView.scrollView.directionalLockEnabled = _directionalLockEnabled; +#endif // !TARGET_OS_OSX _webView.allowsLinkPreview = _allowsLinkPreview; [_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil]; _webView.allowsBackForwardNavigationGestures = _allowsBackForwardNavigationGestures; @@ -335,13 +389,16 @@ static NSDictionary* customCertificatesForHost; [_webView.configuration.userContentController removeScriptMessageHandlerForName:MessageHandlerName]; [_webView removeObserver:self forKeyPath:@"estimatedProgress"]; [_webView removeFromSuperview]; +#if !TARGET_OS_OSX _webView.scrollView.delegate = nil; +#endif // !TARGET_OS_OSX _webView = nil; } [super removeFromSuperview]; } +#if !TARGET_OS_OSX -(void)showFullScreenVideoStatusBars { #pragma clang diagnostic ignored "-Wdeprecated-declarations" @@ -389,6 +446,7 @@ static NSDictionary* customCertificatesForHost; }]; } } +#endif // !TARGET_OS_OSX - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ if ([keyPath isEqual:@"estimatedProgress"] && object == self.webView) { @@ -402,7 +460,11 @@ static NSDictionary* customCertificatesForHost; } } +#if !TARGET_OS_OSX - (void)setBackgroundColor:(UIColor *)backgroundColor +#else +- (void)setBackgroundColor:(RCTUIColor *)backgroundColor +#endif // !TARGET_OS_OSX { _savedBackgroundColor = backgroundColor; if (_webView == nil) { @@ -410,9 +472,20 @@ static NSDictionary* customCertificatesForHost; } CGFloat alpha = CGColorGetAlpha(backgroundColor.CGColor); - self.opaque = _webView.opaque = (alpha == 1.0); + BOOL opaque = (alpha == 1.0); +#if !TARGET_OS_OSX + self.opaque = _webView.opaque = opaque; _webView.scrollView.backgroundColor = backgroundColor; _webView.backgroundColor = backgroundColor; +#else + // https://stackoverflow.com/questions/40007753/macos-wkwebview-background-transparency + NSOperatingSystemVersion version = { 10, 12, 0 }; + if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:version]) { + [_webView setValue:@(opaque) forKey: @"drawsBackground"]; + } else { + [_webView setValue:@(!opaque) forKey: @"drawsTransparentBackground"]; + } +#endif // !TARGET_OS_OSX } #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */ @@ -475,6 +548,7 @@ static NSDictionary* customCertificatesForHost; } } +#if !TARGET_OS_OSX - (void)setContentInset:(UIEdgeInsets)contentInset { _contentInset = contentInset; @@ -489,6 +563,7 @@ static NSDictionary* customCertificatesForHost; withScrollView:_webView.scrollView updateOffset:YES]; } +#endif // !TARGET_OS_OSX - (void)visitSource { @@ -525,6 +600,7 @@ static NSDictionary* customCertificatesForHost; } } +#if !TARGET_OS_OSX -(void)setKeyboardDisplayRequiresUserAction:(BOOL)keyboardDisplayRequiresUserAction { if (_webView == nil) { @@ -630,17 +706,23 @@ static NSDictionary* customCertificatesForHost; object_setClass(subview, newClass); } +// UIScrollViewDelegate method - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { scrollView.decelerationRate = _decelerationRate; } +#endif // !TARGET_OS_OSX - (void)setScrollEnabled:(BOOL)scrollEnabled { _scrollEnabled = scrollEnabled; +#if !TARGET_OS_OSX _webView.scrollView.scrollEnabled = scrollEnabled; +#endif // !TARGET_OS_OSX } +#if !TARGET_OS_OSX +// UIScrollViewDelegate method - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // Don't allow scrolling the scrollView. @@ -690,6 +772,7 @@ static NSDictionary* customCertificatesForHost; _showsVerticalScrollIndicator = showsVerticalScrollIndicator; _webView.scrollView.showsVerticalScrollIndicator = showsVerticalScrollIndicator; } +#endif // !TARGET_OS_OSX - (void)postMessage:(NSString *)message { @@ -707,7 +790,9 @@ static NSDictionary* customCertificatesForHost; // Ensure webview takes the position and dimensions of RNCWebView _webView.frame = self.bounds; +#if !TARGET_OS_OSX _webView.scrollView.contentInset = _contentInset; +#endif // !TARGET_OS_OSX } - (NSMutableDictionary *)baseEvent @@ -769,52 +854,95 @@ static NSDictionary* customCertificatesForHost; #pragma mark - WKNavigationDelegate methods /** -* alert -*/ + * alert + */ - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler { - UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:message preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { - completionHandler(); - }]]; - [[self topViewController] presentViewController:alert animated:YES completion:NULL]; - +#if !TARGET_OS_OSX + UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:message preferredStyle:UIAlertControllerStyleAlert]; + [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { + completionHandler(); + }]]; + [[self topViewController] presentViewController:alert animated:YES completion:NULL]; +#else + NSAlert *alert = [[NSAlert alloc] init]; + [alert setMessageText:message]; + [alert beginSheetModalForWindow:[NSApp keyWindow] completionHandler:^(__unused NSModalResponse response){ + completionHandler(); + }]; +#endif // !TARGET_OS_OSX } /** -* confirm -*/ + * confirm + */ - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{ - UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:message preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { - completionHandler(YES); - }]]; - [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { - completionHandler(NO); - }]]; - [[self topViewController] presentViewController:alert animated:YES completion:NULL]; +#if !TARGET_OS_OSX + UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:message preferredStyle:UIAlertControllerStyleAlert]; + [alert addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { + completionHandler(YES); + }]]; + [alert addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { + completionHandler(NO); + }]]; + [[self topViewController] presentViewController:alert animated:YES completion:NULL]; +#else + NSAlert *alert = [[NSAlert alloc] init]; + [alert setMessageText:message]; + [alert addButtonWithTitle:NSLocalizedString(@"OK", @"OK button")]; + [alert addButtonWithTitle:NSLocalizedString(@"Cancel", @"Cancel button")]; + void (^callbacksHandlers)(NSModalResponse response) = ^void(NSModalResponse response) { + completionHandler(response == NSAlertFirstButtonReturn); + }; + [alert beginSheetModalForWindow:[NSApp keyWindow] completionHandler:callbacksHandlers]; +#endif // !TARGET_OS_OSX } /** -* prompt -*/ + * prompt + */ - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *))completionHandler{ - UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:prompt preferredStyle:UIAlertControllerStyleAlert]; - [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) { - textField.text = defaultText; - }]; - UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { - completionHandler([[alert.textFields lastObject] text]); - }]; - [alert addAction:okAction]; - UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { - completionHandler(nil); - }]; - [alert addAction:cancelAction]; - alert.preferredAction = okAction; - [[self topViewController] presentViewController:alert animated:YES completion:NULL]; +#if !TARGET_OS_OSX + UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" message:prompt preferredStyle:UIAlertControllerStyleAlert]; + [alert addTextFieldWithConfigurationHandler:^(UITextField *textField) { + textField.text = defaultText; + }]; + UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { + completionHandler([[alert.textFields lastObject] text]); + }]; + [alert addAction:okAction]; + UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { + completionHandler(nil); + }]; + [alert addAction:cancelAction]; + alert.preferredAction = okAction; + [[self topViewController] presentViewController:alert animated:YES completion:NULL]; +#else + NSAlert *alert = [[NSAlert alloc] init]; + [alert setMessageText:prompt]; + + const NSRect RCTSingleTextFieldFrame = NSMakeRect(0.0, 0.0, 275.0, 22.0); + NSTextField *textField = [[NSTextField alloc] initWithFrame:RCTSingleTextFieldFrame]; + textField.cell.scrollable = YES; + if (@available(macOS 10.11, *)) { + textField.maximumNumberOfLines = 1; + } + textField.stringValue = defaultText; + [alert setAccessoryView:textField]; + + [alert addButtonWithTitle:NSLocalizedString(@"OK", @"OK button")]; + [alert addButtonWithTitle:NSLocalizedString(@"Cancel", @"Cancel button")]; + [alert beginSheetModalForWindow:[NSApp keyWindow] completionHandler:^(NSModalResponse response) { + if (response == NSAlertFirstButtonReturn) { + completionHandler([textField stringValue]); + } else { + completionHandler(nil); + } + }]; +#endif // !TARGET_OS_OSX } +#if !TARGET_OS_OSX /** * topViewController */ @@ -853,7 +981,7 @@ static NSDictionary* customCertificatesForHost; } return window; } - +#endif // !TARGET_OS_OSX /** * Decides whether to allow or cancel a navigation. @@ -1058,11 +1186,13 @@ static NSDictionary* customCertificatesForHost; [_webView stopLoading]; } +#if !TARGET_OS_OSX - (void)setBounces:(BOOL)bounces { _bounces = bounces; _webView.scrollView.bounces = bounces; } +#endif // !TARGET_OS_OSX - (NSURLRequest *)requestForSource:(id)json { NSURLRequest *request = [RCTConvert NSURLRequest:self.source]; diff --git a/ios/RNCWebViewManager.m b/ios/RNCWebViewManager.m index 2b45667..a00534a 100644 --- a/ios/RNCWebViewManager.m +++ b/ios/RNCWebViewManager.m @@ -22,7 +22,11 @@ RCT_EXPORT_MODULE() +#if !TARGET_OS_OSX - (UIView *)view +#else +- (RCTUIView *)view +#endif // !TARGET_OS_OSX { RNCWebView *webView = [RNCWebView new]; webView.delegate = self; @@ -97,9 +101,11 @@ RCT_CUSTOM_VIEW_PROPERTY(sharedCookiesEnabled, BOOL, RNCWebView) { view.sharedCookiesEnabled = json == nil ? false : [RCTConvert BOOL: json]; } +#if !TARGET_OS_OSX RCT_CUSTOM_VIEW_PROPERTY(decelerationRate, CGFloat, RNCWebView) { view.decelerationRate = json == nil ? UIScrollViewDecelerationRateNormal : [RCTConvert CGFloat: json]; } +#endif // !TARGET_OS_OSX RCT_CUSTOM_VIEW_PROPERTY(directionalLockEnabled, BOOL, RNCWebView) { view.directionalLockEnabled = json == nil ? true : [RCTConvert BOOL: json]; diff --git a/macos/RNCWebView.xcodeproj/project.pbxproj b/macos/RNCWebView.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c2b7329 --- /dev/null +++ b/macos/RNCWebView.xcodeproj/project.pbxproj @@ -0,0 +1,363 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 3515965E21A3C86000623BFA /* ../ios/RNCWKProcessPoolManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3515965D21A3C86000623BFA /* ../ios/RNCWKProcessPoolManager.m */; }; + 38116A2B23BBECB700ACE311 /* ../ios/RNCWebViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E91B351B21446E6C00F9801F /* ../ios/RNCWebViewManager.m */; }; + 38116A2C23BBECB700ACE311 /* ../ios/RNCWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = E91B351C21446E6C00F9801F /* ../ios/RNCWebView.m */; }; + 38116A2D23BBECB700ACE311 /* ../ios/RNCWKProcessPoolManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3515965D21A3C86000623BFA /* ../ios/RNCWKProcessPoolManager.m */; }; + E91B351D21446E6C00F9801F /* ../ios/RNCWebViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E91B351B21446E6C00F9801F /* ../ios/RNCWebViewManager.m */; }; + E91B351E21446E6C00F9801F /* ../ios/RNCWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = E91B351C21446E6C00F9801F /* ../ios/RNCWebView.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 38116A2F23BBECB700ACE311 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 58B511D91A9E6C8500147676 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 134814201AA4EA6300B7C361 /* libRNCWebView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNCWebView.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 3515965D21A3C86000623BFA /* ../ios/RNCWKProcessPoolManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ../ios/RNCWKProcessPoolManager.m; sourceTree = ""; }; + 3515965F21A3C87E00623BFA /* ../ios/RNCWKProcessPoolManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ../ios/RNCWKProcessPoolManager.h; sourceTree = ""; }; + 38116A3323BBECB700ACE311 /* libRNCWebView-macOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libRNCWebView-macOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + E91B351921446E6C00F9801F /* ../ios/RNCWebViewManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ../ios/RNCWebViewManager.h; sourceTree = ""; }; + E91B351A21446E6C00F9801F /* ../ios/RNCWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ../ios/RNCWebView.h; sourceTree = ""; }; + E91B351B21446E6C00F9801F /* ../ios/RNCWebViewManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ../ios/RNCWebViewManager.m; sourceTree = ""; }; + E91B351C21446E6C00F9801F /* ../ios/RNCWebView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ../ios/RNCWebView.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 38116A2E23BBECB700ACE311 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 58B511D81A9E6C8500147676 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 134814211AA4EA7D00B7C361 /* Products */ = { + isa = PBXGroup; + children = ( + 134814201AA4EA6300B7C361 /* libRNCWebView.a */, + ); + name = Products; + sourceTree = ""; + }; + 58B511D21A9E6C8500147676 = { + isa = PBXGroup; + children = ( + E91B351A21446E6C00F9801F /* ../ios/RNCWebView.h */, + E91B351C21446E6C00F9801F /* ../ios/RNCWebView.m */, + E91B351921446E6C00F9801F /* ../ios/RNCWebViewManager.h */, + E91B351B21446E6C00F9801F /* ../ios/RNCWebViewManager.m */, + 3515965D21A3C86000623BFA /* ../ios/RNCWKProcessPoolManager.m */, + 3515965F21A3C87E00623BFA /* ../ios/RNCWKProcessPoolManager.h */, + 134814211AA4EA7D00B7C361 /* Products */, + 38116A3323BBECB700ACE311 /* libRNCWebView-macOS.a */, + ); + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 38116A2923BBECB700ACE311 /* RNCWebView-macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 38116A3023BBECB700ACE311 /* Build configuration list for PBXNativeTarget "RNCWebView-macOS" */; + buildPhases = ( + 38116A2A23BBECB700ACE311 /* Sources */, + 38116A2E23BBECB700ACE311 /* Frameworks */, + 38116A2F23BBECB700ACE311 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "RNCWebView-macOS"; + productName = RCTDataManager; + productReference = 38116A3323BBECB700ACE311 /* libRNCWebView-macOS.a */; + productType = "com.apple.product-type.library.static"; + }; + 58B511DA1A9E6C8500147676 /* RNCWebView */ = { + isa = PBXNativeTarget; + buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "RNCWebView" */; + buildPhases = ( + 58B511D71A9E6C8500147676 /* Sources */, + 58B511D81A9E6C8500147676 /* Frameworks */, + 58B511D91A9E6C8500147676 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RNCWebView; + productName = RCTDataManager; + productReference = 134814201AA4EA6300B7C361 /* libRNCWebView.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 58B511D31A9E6C8500147676 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = Facebook; + TargetAttributes = { + 58B511DA1A9E6C8500147676 = { + CreatedOnToolsVersion = 6.1.1; + }; + }; + }; + buildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "RNCWebView" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 58B511D21A9E6C8500147676; + productRefGroup = 58B511D21A9E6C8500147676; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 58B511DA1A9E6C8500147676 /* RNCWebView */, + 38116A2923BBECB700ACE311 /* RNCWebView-macOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 38116A2A23BBECB700ACE311 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 38116A2B23BBECB700ACE311 /* ../ios/RNCWebViewManager.m in Sources */, + 38116A2C23BBECB700ACE311 /* ../ios/RNCWebView.m in Sources */, + 38116A2D23BBECB700ACE311 /* ../ios/RNCWKProcessPoolManager.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 58B511D71A9E6C8500147676 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E91B351D21446E6C00F9801F /* ../ios/RNCWebViewManager.m in Sources */, + E91B351E21446E6C00F9801F /* ../ios/RNCWebView.m in Sources */, + 3515965E21A3C86000623BFA /* ../ios/RNCWKProcessPoolManager.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 38116A3123BBECB700ACE311 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../node_modules/react-native-macos/React/**"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-macos/React/**", + ); + LIBRARY_SEARCH_PATHS = "$(inherited)"; + MACOSX_DEPLOYMENT_TARGET = 10.14; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 38116A3223BBECB700ACE311 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../node_modules/react-native-macos/React/**"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-macos/React/**", + ); + LIBRARY_SEARCH_PATHS = "$(inherited)"; + MACOSX_DEPLOYMENT_TARGET = 10.14; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 58B511ED1A9E6C8500147676 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 58B511EE1A9E6C8500147676 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 58B511F01A9E6C8500147676 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../node_modules/react-native-macos/React/**"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-macos/React/**", + "$(SRCROOT)/../../react-native-macos/React/**", + ); + LIBRARY_SEARCH_PATHS = "$(inherited)"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = RNCWebView; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 58B511F11A9E6C8500147676 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/../node_modules/react-native-macos/React/**"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/react-native-macos/React/**", + "$(SRCROOT)/../../react-native-macos/React/**", + ); + LIBRARY_SEARCH_PATHS = "$(inherited)"; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = RNCWebView; + SKIP_INSTALL = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 38116A3023BBECB700ACE311 /* Build configuration list for PBXNativeTarget "RNCWebView-macOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 38116A3123BBECB700ACE311 /* Debug */, + 38116A3223BBECB700ACE311 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "RNCWebView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 58B511ED1A9E6C8500147676 /* Debug */, + 58B511EE1A9E6C8500147676 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "RNCWebView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 58B511F01A9E6C8500147676 /* Debug */, + 58B511F11A9E6C8500147676 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 58B511D31A9E6C8500147676 /* Project object */; +} diff --git a/metro.config.js b/metro.config.js new file mode 100644 index 0000000..e01efb1 --- /dev/null +++ b/metro.config.js @@ -0,0 +1,12 @@ +/** + * This cli config is needed for development purposes, e.g. for running + * integration tests during local development or on CI services. + */ + +const blacklist = require('metro-config/src/defaults/blacklist'); + +module.exports = { + resolver: { + blacklistRE: blacklist([/node_modules\/react-native-macos\/.*/]) + }, +}; diff --git a/metro.config.macos.js b/metro.config.macos.js new file mode 100644 index 0000000..81c43c0 --- /dev/null +++ b/metro.config.macos.js @@ -0,0 +1,19 @@ +/** + * This cli config is needed for development purposes, e.g. for running + * integration tests during local development or on CI services. + */ + +const path = require('path'); +const blacklist = require('metro-config/src/defaults/blacklist'); + +const rnmPath = path.resolve(__dirname, 'node_modules/react-native-macos'); + +module.exports = { + resolver: { + extraNodeModules: { + 'react-native': rnmPath, + }, + platforms: ['macos', 'ios', 'android'], + blacklistRE: blacklist([/node_modules\/react-native\/.*/]) + }, +}; diff --git a/package.json b/package.json index f10c6c2..04ae918 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-webview", - "description": "React Native WebView component for iOS, Android, and Windows 10 (coming soon)", + "description": "React Native WebView component for iOS, Android, and macOS", "main": "index.js", "typings": "index.d.ts", "author": "Jamon Holmgren ", @@ -14,6 +14,7 @@ "start": "node node_modules/react-native/local-cli/cli.js start", "start:android": "react-native run-android --root example/", "start:ios": "react-native run-ios --project-path example/ios --scheme example", + "start:macos": "node node_modules/react-native-macos/local-cli/cli.js start --use-react-native-macos", "ci": "CI=true && yarn lint && yarn test", "ci:publish": "yarn semantic-release", "lint": "yarn tsc --noEmit && yarn eslint ./src --ext .ts,.tsx", @@ -36,6 +37,8 @@ "devDependencies": { "@babel/core": "7.4.5", "@babel/runtime": "7.4.5", + "@react-native-community/cli-platform-ios": "^3.0.0", + "@react-native-community/cli-platform-android": "^3.0.0", "@semantic-release/git": "7.0.16", "@types/invariant": "^2.2.30", "@types/jest": "24.0.18", @@ -57,6 +60,7 @@ "metro-react-native-babel-preset": "0.54.1", "react": "16.9.0", "react-native": "0.61.5", + "react-native-macos": "0.60.0-microsoft.49", "semantic-release": "15.13.24", "typescript": "3.6.2" }, @@ -67,6 +71,7 @@ "files": [ "android", "ios", + "macos", "lib", "index.js", "index.d.ts", diff --git a/react-native.config.js b/react-native.config.js new file mode 100644 index 0000000..7c3d094 --- /dev/null +++ b/react-native.config.js @@ -0,0 +1,26 @@ +/** + * This cli config is needed for the coexistance of react-native and other + * out-of-tree implementations such react-native-macos. + * The following issue is tracked by + * https://github.com/react-native-community/discussions-and-proposals/issues/182 + * + * The work-around involves having a metro.config.js for each out-of-tree + * platform, i.e. metro.config.js for react-native and + * metro.config.macos.js for react-native-macos. + * This react-native.config.js looks for a --use-react-native-macos + * switch and when present pushes --config=metro.config.macos.js + * and specifies reactNativePath: 'node_modules/react-native-macos'. + * The metro.config.js has to blacklist 'node_modules/react-native-macos', + * and conversely metro.config.macos.js has to blacklist 'node_modules/react-native'. + */ +'use strict'; + +const macSwitch = '--use-react-native-macos'; + +if (process.argv.includes(macSwitch)) { + process.argv = process.argv.filter(arg => arg !== macSwitch); + process.argv.push('--config=metro.config.macos.js'); + module.exports = { + reactNativePath: 'node_modules/react-native-macos', + }; +} \ No newline at end of file diff --git a/src/WebView.macos.tsx b/src/WebView.macos.tsx new file mode 100644 index 0000000..436b518 --- /dev/null +++ b/src/WebView.macos.tsx @@ -0,0 +1,347 @@ +import React from 'react'; +import { + UIManager as NotTypedUIManager, + View, + requireNativeComponent, + NativeModules, + Image, + findNodeHandle, + ImageSourcePropType, +} from 'react-native'; +import invariant from 'invariant'; + +import { + defaultOriginWhitelist, + createOnShouldStartLoadWithRequest, + defaultRenderError, + defaultRenderLoading, +} from './WebViewShared'; +import { + WebViewErrorEvent, + WebViewHttpErrorEvent, + WebViewMessageEvent, + WebViewNavigationEvent, + WebViewProgressEvent, + WebViewTerminatedEvent, + MacOSWebViewProps, + NativeWebViewMacOS, + ViewManager, + State, + RNCWebViewUIManagerMacOS, +} from './WebViewTypes'; + +import styles from './WebView.styles'; + +const UIManager = NotTypedUIManager as RNCWebViewUIManagerMacOS; + +const { resolveAssetSource } = Image; + +const RNCWebViewManager = NativeModules.RNCWebViewManager as ViewManager; + +const RNCWebView: typeof NativeWebViewMacOS = requireNativeComponent( + 'RNCWebView', +); + +class WebView extends React.Component { + static defaultProps = { + javaScriptEnabled: true, + cacheEnabled: true, + originWhitelist: defaultOriginWhitelist, + useSharedProcessPool: true, + }; + + static isFileUploadSupported = async () => { + // no native implementation for macOS, depends only on permissions + return true; + }; + + state: State = { + viewState: this.props.startInLoadingState ? 'LOADING' : 'IDLE', + lastErrorEvent: null, + }; + + webViewRef = React.createRef(); + + // eslint-disable-next-line react/sort-comp + getCommands = () => UIManager.getViewManagerConfig('RNCWebView').Commands; + + /** + * Go forward one page in the web view's history. + */ + goForward = () => { + UIManager.dispatchViewManagerCommand( + this.getWebViewHandle(), + this.getCommands().goForward, + undefined, + ); + }; + + /** + * Go back one page in the web view's history. + */ + goBack = () => { + UIManager.dispatchViewManagerCommand( + this.getWebViewHandle(), + this.getCommands().goBack, + undefined, + ); + }; + + /** + * Reloads the current page. + */ + reload = () => { + this.setState({ viewState: 'LOADING' }); + UIManager.dispatchViewManagerCommand( + this.getWebViewHandle(), + this.getCommands().reload, + undefined, + ); + }; + + /** + * Stop loading the current page. + */ + stopLoading = () => { + UIManager.dispatchViewManagerCommand( + this.getWebViewHandle(), + this.getCommands().stopLoading, + undefined, + ); + }; + + /** + * Request focus on WebView rendered page. + */ + requestFocus = () => { + UIManager.dispatchViewManagerCommand( + this.getWebViewHandle(), + this.getCommands().requestFocus, + undefined, + ); + }; + + /** + * Posts a message to the web view, which will emit a `message` event. + * Accepts one argument, `data`, which must be a string. + * + * In your webview, you'll need to something like the following. + * + * ```js + * document.addEventListener('message', e => { document.title = e.data; }); + * ``` + */ + postMessage = (data: string) => { + UIManager.dispatchViewManagerCommand( + this.getWebViewHandle(), + this.getCommands().postMessage, + [String(data)], + ); + }; + + /** + * Injects a javascript string into the referenced WebView. Deliberately does not + * return a response because using eval() to return a response breaks this method + * on pages with a Content Security Policy that disallows eval(). If you need that + * functionality, look into postMessage/onMessage. + */ + injectJavaScript = (data: string) => { + UIManager.dispatchViewManagerCommand( + this.getWebViewHandle(), + this.getCommands().injectJavaScript, + [data], + ); + }; + + /** + * We return an event with a bunch of fields including: + * url, title, loading, canGoBack, canGoForward + */ + updateNavigationState = (event: WebViewNavigationEvent) => { + if (this.props.onNavigationStateChange) { + this.props.onNavigationStateChange(event.nativeEvent); + } + }; + + /** + * Returns the native `WebView` node. + */ + getWebViewHandle = () => { + const nodeHandle = findNodeHandle(this.webViewRef.current); + invariant(nodeHandle != null, 'nodeHandle expected to be non-null'); + return nodeHandle as number; + }; + + onLoadingStart = (event: WebViewNavigationEvent) => { + const { onLoadStart } = this.props; + if (onLoadStart) { + onLoadStart(event); + } + this.updateNavigationState(event); + }; + + onLoadingError = (event: WebViewErrorEvent) => { + event.persist(); // persist this event because we need to store it + const { onError, onLoadEnd } = this.props; + if (onLoadEnd) { + onLoadEnd(event); + } + if (onError) { + onError(event); + } + console.warn('Encountered an error loading page', event.nativeEvent); + + this.setState({ + lastErrorEvent: event.nativeEvent, + viewState: 'ERROR', + }); + }; + + onHttpError = (event: WebViewHttpErrorEvent) => { + const { onHttpError } = this.props; + if (onHttpError) { + onHttpError(event); + } + } + + onLoadingFinish = (event: WebViewNavigationEvent) => { + const { onLoad, onLoadEnd } = this.props; + if (onLoad) { + onLoad(event); + } + if (onLoadEnd) { + onLoadEnd(event); + } + this.setState({ + viewState: 'IDLE', + }); + this.updateNavigationState(event); + }; + + onMessage = (event: WebViewMessageEvent) => { + const { onMessage } = this.props; + if (onMessage) { + onMessage(event); + } + }; + + onLoadingProgress = (event: WebViewProgressEvent) => { + const { onLoadProgress } = this.props; + if (onLoadProgress) { + onLoadProgress(event); + } + }; + + onShouldStartLoadWithRequestCallback = ( + shouldStart: boolean, + _url: string, + lockIdentifier: number, + ) => { + const viewManager + = (this.props.nativeConfig && this.props.nativeConfig.viewManager) + || RNCWebViewManager; + + viewManager.startLoadWithResult(!!shouldStart, lockIdentifier); + }; + + onContentProcessDidTerminate = (event: WebViewTerminatedEvent) => { + const { onContentProcessDidTerminate } = this.props; + if (onContentProcessDidTerminate) { + onContentProcessDidTerminate(event); + } + }; + + componentDidUpdate(prevProps: MacOSWebViewProps) { + this.showRedboxOnPropChanges(prevProps, 'allowsInlineMediaPlayback'); + this.showRedboxOnPropChanges(prevProps, 'incognito'); + this.showRedboxOnPropChanges(prevProps, 'mediaPlaybackRequiresUserAction'); + } + + showRedboxOnPropChanges( + prevProps: MacOSWebViewProps, + propName: keyof MacOSWebViewProps, + ) { + if (this.props[propName] !== prevProps[propName]) { + console.error( + `Changes to property ${propName} do nothing after the initial render.`, + ); + } + } + + render() { + const { + nativeConfig = {}, + onMessage, + onShouldStartLoadWithRequest: onShouldStartLoadWithRequestProp, + originWhitelist, + renderError, + renderLoading, + style, + containerStyle, + ...otherProps + } = this.props; + + let otherView = null; + + if (this.state.viewState === 'LOADING') { + otherView = (renderLoading || defaultRenderLoading)(); + } else if (this.state.viewState === 'ERROR') { + const errorEvent = this.state.lastErrorEvent; + invariant(errorEvent != null, 'lastErrorEvent expected to be non-null'); + otherView = (renderError || defaultRenderError)( + errorEvent.domain, + errorEvent.code, + errorEvent.description, + ); + } else if (this.state.viewState !== 'IDLE') { + console.error( + `RNCWebView invalid state encountered: ${this.state.viewState}`, + ); + } + + const webViewStyles = [styles.container, styles.webView, style]; + const webViewContainerStyle = [styles.container, containerStyle]; + + const onShouldStartLoadWithRequest = createOnShouldStartLoadWithRequest( + this.onShouldStartLoadWithRequestCallback, + // casting cause it's in the default props + originWhitelist as readonly string[], + onShouldStartLoadWithRequestProp, + ); + + const NativeWebView + = (nativeConfig.component as typeof NativeWebViewMacOS | undefined) + || RNCWebView; + + const webView = ( + + ); + + return ( + + {webView} + {otherView} + + ); + } +} + +export default WebView; diff --git a/src/WebViewTypes.ts b/src/WebViewTypes.ts index a418a32..2c8a495 100644 --- a/src/WebViewTypes.ts +++ b/src/WebViewTypes.ts @@ -28,7 +28,7 @@ interface RNCWebViewUIManager extends UIManagerStatic { export type RNCWebViewUIManagerAndroid = RNCWebViewUIManager export type RNCWebViewUIManagerIOS = RNCWebViewUIManager - +export type RNCWebViewUIManagerMacOS = RNCWebViewUIManager type WebViewState = 'IDLE' | 'LOADING' | 'ERROR'; @@ -57,6 +57,14 @@ declare const NativeWebViewIOSBase: Constructor & typeof NativeWebViewIOSComponent; export class NativeWebViewIOS extends NativeWebViewIOSBase {} +// eslint-disable-next-line react/prefer-stateless-function +declare class NativeWebViewMacOSComponent extends Component< + MacOSNativeWebViewProps +> {} +declare const NativeWebViewMacOSBase: Constructor & + typeof NativeWebViewMacOSComponent; +export class NativeWebViewMacOS extends NativeWebViewMacOSBase {} + // eslint-disable-next-line react/prefer-stateless-function declare class NativeWebViewAndroidComponent extends Component< AndroidNativeWebViewProps @@ -104,7 +112,7 @@ export interface WebViewMessage extends WebViewNativeEvent { export interface WebViewError extends WebViewNativeEvent { /** - * `domain` is only used on iOS + * `domain` is only used on iOS and macOS */ domain?: string; code: number; @@ -195,7 +203,7 @@ export interface WebViewNativeConfig { /** * The native component used to render the WebView. */ - component?: typeof NativeWebViewIOS | typeof NativeWebViewAndroid; + component?: typeof NativeWebViewIOS | typeof NativeWebViewMacOS | typeof NativeWebViewAndroid; /** * Set props directly on the native component WebView. Enables custom props which the * original WebView doesn't pass through. @@ -203,7 +211,7 @@ export interface WebViewNativeConfig { props?: Object; /** * Set the ViewManager to use for communication with the native side. - * @platform ios + * @platform ios, macos */ viewManager?: ViewManager; } @@ -258,6 +266,13 @@ export interface AndroidNativeWebViewProps extends CommonNativeWebViewProps { urlPrefixesForDefaultIntent?: readonly string[]; } +export enum ContentInsetAdjustmentBehavior { + automatic = 'automatic', + scrollableAxes = 'scrollableAxes', + never = 'never', + always = 'always' +}; + export interface IOSNativeWebViewProps extends CommonNativeWebViewProps { allowingReadAccessToURL?: string; allowsBackForwardNavigationGestures?: boolean; @@ -266,11 +281,7 @@ export interface IOSNativeWebViewProps extends CommonNativeWebViewProps { automaticallyAdjustContentInsets?: boolean; bounces?: boolean; contentInset?: ContentInsetProp; - contentInsetAdjustmentBehavior?: - | 'automatic' - | 'scrollableAxes' - | 'never' - | 'always'; + contentInsetAdjustmentBehavior?: ContentInsetAdjustmentBehavior; dataDetectorTypes?: DataDetectorTypes | readonly DataDetectorTypes[]; decelerationRate?: number; directionalLockEnabled?: boolean; @@ -281,6 +292,23 @@ export interface IOSNativeWebViewProps extends CommonNativeWebViewProps { onContentProcessDidTerminate?: (event: WebViewTerminatedEvent) => void; } +export interface MacOSNativeWebViewProps extends CommonNativeWebViewProps { + allowingReadAccessToURL?: string; + allowsBackForwardNavigationGestures?: boolean; + allowsInlineMediaPlayback?: boolean; + allowsLinkPreview?: boolean; + automaticallyAdjustContentInsets?: boolean; + bounces?: boolean; + contentInset?: ContentInsetProp; + contentInsetAdjustmentBehavior?: ContentInsetAdjustmentBehavior; + directionalLockEnabled?: boolean; + hideKeyboardAccessoryView?: boolean; + pagingEnabled?: boolean; + scrollEnabled?: boolean; + useSharedProcessPool?: boolean; + onContentProcessDidTerminate?: (event: WebViewTerminatedEvent) => void; +} + export interface IOSWebViewProps extends WebViewSharedProps { /** * Does not store any data within the lifetime of the WebView. @@ -335,11 +363,7 @@ export interface IOSWebViewProps extends WebViewSharedProps { * content area of the scroll view. The default value of this property is * "never". Available on iOS 11 and later. */ - contentInsetAdjustmentBehavior?: - | 'automatic' - | 'scrollableAxes' - | 'never' - | 'always'; + contentInsetAdjustmentBehavior?: ContentInsetAdjustmentBehavior; /** * The amount by which the web view content is inset from the edges of @@ -460,6 +484,143 @@ export interface IOSWebViewProps extends WebViewSharedProps { onContentProcessDidTerminate?: (event: WebViewTerminatedEvent) => void; } +export interface MacOSWebViewProps extends WebViewSharedProps { + /** + * Does not store any data within the lifetime of the WebView. + */ + incognito?: boolean; + + /** + * Boolean value that determines whether the web view bounces + * when it reaches the edge of the content. The default value is `true`. + * @platform macos + */ + bounces?: boolean; + + /** + * Boolean value that determines whether scrolling is enabled in the + * `WebView`. The default value is `true`. + * @platform macos + */ + scrollEnabled?: boolean; + + /** + * If the value of this property is true, the scroll view stops on multiples + * of the scroll view’s bounds when the user scrolls. + * The default value is false. + * @platform macos + */ + pagingEnabled?: boolean; + + /** + * Controls whether to adjust the content inset for web views that are + * placed behind a navigation bar, tab bar, or toolbar. The default value + * is `true`. + * @platform macos + */ + automaticallyAdjustContentInsets?: boolean; + + /** + * This property specifies how the safe area insets are used to modify the + * content area of the scroll view. The default value of this property is + * "never". Available on iOS 11 and later. + */ + contentInsetAdjustmentBehavior?: ContentInsetAdjustmentBehavior; + + /** + * The amount by which the web view content is inset from the edges of + * the scroll view. Defaults to {top: 0, left: 0, bottom: 0, right: 0}. + * @platform macos + */ + contentInset?: ContentInsetProp; + + /** + * Boolean that determines whether HTML5 videos play inline or use the + * native full-screen controller. The default value is `false`. + * + * **NOTE** : In order for video to play inline, not only does this + * property need to be set to `true`, but the video element in the HTML + * document must also include the `webkit-playsinline` attribute. + * @platform macos + */ + allowsInlineMediaPlayback?: boolean; + /** + * Hide the accessory view when the keyboard is open. Default is false to be + * backward compatible. + */ + hideKeyboardAccessoryView?: boolean; + /** + * A Boolean value indicating whether horizontal swipe gestures will trigger + * back-forward list navigations. + */ + allowsBackForwardNavigationGestures?: boolean; + /** + * A Boolean value indicating whether WebKit WebView should be created using a shared + * process pool, enabling WebViews to share cookies and localStorage between each other. + * Default is true but can be set to false for backwards compatibility. + * @platform macos + */ + useSharedProcessPool?: boolean; + + /** + * The custom user agent string. + */ + userAgent?: string; + + /** + * A Boolean value that determines whether pressing on a link + * displays a preview of the destination for the link. + * + * This property is available on devices that support Force Touch trackpad. + * @platform macos + */ + allowsLinkPreview?: boolean; + + /** + * Set true if shared cookies from HTTPCookieStorage should used for every load request. + * The default value is `false`. + * @platform macos + */ + sharedCookiesEnabled?: boolean; + + /** + * A Boolean value that determines whether scrolling is disabled in a particular direction. + * The default value is `true`. + * @platform macos + */ + directionalLockEnabled?: boolean; + + /** + * A Boolean value indicating whether web content can programmatically display the keyboard. + * + * When this property is set to true, the user must explicitly tap the elements in the + * web view to display the keyboard (or other relevant input view) for that element. + * When set to false, a focus event on an element causes the input view to be displayed + * and associated with that element automatically. + * + * The default value is `true`. + * @platform macos + */ + keyboardDisplayRequiresUserAction?: boolean; + + /** + * 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 + * 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. + * @platform macos + */ + allowingReadAccessToURL?: string; + + /** + * Function that is invoked when the WebKit WebView content process gets terminated. + * @platform macos + */ + onContentProcessDidTerminate?: (event: WebViewTerminatedEvent) => void; +} + export interface AndroidWebViewProps extends WebViewSharedProps { onNavigationStateChange?: (event: WebViewNavigation) => void; onContentSizeChange?: (event: WebViewEvent) => void; diff --git a/yarn.lock b/yarn.lock index a809c56..cc17acd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -699,7 +699,14 @@ dependencies: regenerator-runtime "^0.13.2" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.4.5": +"@babel/runtime@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1" + integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/runtime@^7.4.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== @@ -1035,6 +1042,19 @@ dependencies: serve-static "^1.13.1" +"@react-native-community/cli-platform-android@^2.6.0", "@react-native-community/cli-platform-android@^2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-2.9.0.tgz#28831e61ce565a2c7d1905852fce1eecfd33cb5e" + integrity sha512-VEQs4Q6R5tnlYFrQIFoPEWjLc43whRHC9HeH+idbFymwDqysLVUffQbb9D6PJUj+C/AvrDhBhU6S3tDjGbSsag== + dependencies: + "@react-native-community/cli-tools" "^2.8.3" + chalk "^2.4.2" + execa "^1.0.0" + jetifier "^1.6.2" + logkitty "^0.6.0" + slash "^3.0.0" + xmldoc "^1.1.2" + "@react-native-community/cli-platform-android@^3.0.0": version "3.0.3" resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-3.0.3.tgz#e652abce79a7c1e3a8280228123e99df2c4b97b6" @@ -1048,6 +1068,15 @@ slash "^3.0.0" xmldoc "^1.1.2" +"@react-native-community/cli-platform-ios@^2.10.0", "@react-native-community/cli-platform-ios@^2.4.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-2.10.0.tgz#ee494d2f9a8f8727bd5eb3c446f22ebb5429b624" + integrity sha512-z5BQKyT/bgTSdHhvsFNf++6VP50vtOOaITnNKvw4954wURjv5JOQh1De3BngyaDOoGfV1mXkCxutqAXqSeuIjw== + dependencies: + "@react-native-community/cli-tools" "^2.8.3" + chalk "^2.4.2" + xcode "^2.0.0" + "@react-native-community/cli-platform-ios@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-3.0.0.tgz#3a48a449c0c33af3b0b3d19d3256de99388fe15f" @@ -1058,6 +1087,16 @@ js-yaml "^3.13.1" xcode "^2.0.0" +"@react-native-community/cli-tools@^2.8.3": + version "2.8.3" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-2.8.3.tgz#0e2249f48cf4603fb8d740a9f0715c31ac131ceb" + integrity sha512-N5Pz+pR+GFq3JApjd0SW4jp9KC7kbKsMH65QLRh30JNsxdPvNkYox6/ZZdkvdXaI5ev3EckR7eqlcwi5gpVTYQ== + dependencies: + chalk "^2.4.2" + lodash "^4.17.5" + mime "^2.4.1" + node-fetch "^2.5.0" + "@react-native-community/cli-tools@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-3.0.0.tgz#fe48b80822ed7e49b8af051f9fe41e22a2a710b1" @@ -1073,6 +1112,45 @@ resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-3.0.0.tgz#488d46605cb05e88537e030f38da236eeda74652" integrity sha512-ng6Tm537E/M42GjE4TRUxQyL8sRfClcL7bQWblOCoxPZzJ2J3bdALsjeG3vDnVCIfI/R0AeFalN9KjMt0+Z/Zg== +"@react-native-community/cli@^2.6.0": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-2.10.0.tgz#3bda7a77dadfde006d81ee835263b5ff88f1b590" + integrity sha512-KldnMwYzNJlbbJpJQ4AxwTMp89qqwilI1lEvCAwKmiviWuyYGACCQsXI7ikShRaQeakc28zyN2ldbkbrHeOoJA== + dependencies: + "@hapi/joi" "^15.0.3" + "@react-native-community/cli-platform-android" "^2.9.0" + "@react-native-community/cli-platform-ios" "^2.10.0" + "@react-native-community/cli-tools" "^2.8.3" + chalk "^2.4.2" + commander "^2.19.0" + compression "^1.7.1" + connect "^3.6.5" + cosmiconfig "^5.1.0" + deepmerge "^3.2.0" + envinfo "^7.1.0" + errorhandler "^1.5.0" + execa "^1.0.0" + fs-extra "^7.0.1" + glob "^7.1.1" + graceful-fs "^4.1.3" + inquirer "^3.0.6" + lodash "^4.17.5" + metro "^0.54.1" + metro-config "^0.54.1" + metro-core "^0.54.1" + metro-react-native-babel-transformer "^0.54.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + morgan "^1.9.0" + node-notifier "^5.2.1" + open "^6.2.0" + ora "^3.4.0" + plist "^3.0.0" + semver "^5.0.3" + serve-static "^1.13.1" + shell-quote "1.6.1" + ws "^1.1.0" + "@react-native-community/cli@^3.0.0": version "3.0.4" resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-3.0.4.tgz#a9dba1bc77855a6e45fccaabb017360645d936bb" @@ -4169,6 +4247,11 @@ hermes-engine@^0.2.1: resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.2.1.tgz#25c0f1ff852512a92cb5c5cc47cf967e1e722ea2" integrity sha512-eNHUQHuadDMJARpaqvlCZoK/Nitpj6oywq3vQ3wCwEsww5morX34mW5PmKWQTO7aU0ck0hgulxR+EVDlXygGxQ== +hermesvm@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/hermesvm/-/hermesvm-0.1.1.tgz#bd1df92b4dc504e261c23df34864daf24b844d03" + integrity sha512-EosSDeUqTTGvlc9vQiy5Y/9GBlucEyo6lYuxg/FnukHCD/CP3NYeDAGV54TyZ19FgSqMEoPgOH9cyxvv8epQ1g== + hook-std@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-2.0.0.tgz#ff9aafdebb6a989a354f729bb6445cf4a3a7077c" @@ -5190,7 +5273,7 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jsc-android@^245459.0.0: +jsc-android@245459.0.0, jsc-android@^245459.0.0: version "245459.0.0" resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-245459.0.0.tgz#e584258dd0b04c9159a27fb104cd5d491fd202c9" integrity sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg== @@ -5902,6 +5985,24 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.4.tgz#c9269589e6885a60cf80605d9522d4b67ca646e3" integrity sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A== +metro-babel-register@0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.54.1.tgz#7d2bfe444b1ccef8de99aedc7d9330891d806076" + integrity sha512-j3VydgncUG8HP6AZala6GTIt3V01nptodnnOke3JMYLqgk8EJ1LOVOdotK9pXi80o7EmmNKFs/LyyH8z+uAJzQ== + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/register" "^7.0.0" + core-js "^2.2.2" + escape-string-regexp "^1.0.5" + metro-babel-register@^0.56.0, metro-babel-register@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.56.4.tgz#b0c627a1cfdd1bdd768f81af79481754e833a902" @@ -5920,6 +6021,13 @@ metro-babel-register@^0.56.0, metro-babel-register@^0.56.4: core-js "^2.2.2" escape-string-regexp "^1.0.5" +metro-babel-transformer@0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.54.1.tgz#371ffa2d1118b22cc9e40b3c3ea6738c49dae9dc" + integrity sha512-2aiAnuYBdcLV1VINb8ENAA4keIaJIepHgR9+iRvIde+9GSjKnexqx4nNmJN392285gRDp1fVZ7uY0uQawK/A5g== + dependencies: + "@babel/core" "^7.0.0" + metro-babel-transformer@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.56.4.tgz#fe1d0dc600fcf90201a5bea4d42caea10b801057" @@ -5935,6 +6043,16 @@ metro-babel7-plugin-react-transform@0.54.1: dependencies: "@babel/helper-module-imports" "^7.0.0" +metro-cache@0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.54.1.tgz#2e9017cbd11106837b8c385c9eb8c8175469a8c1" + integrity sha512-RxCFoNcANHXZYi4MIQNnqh68gUnC3bMpzCFJY5pBoqqdrkkn8ibYglBweA0/DW7hx1OZTJWelwS1Dp8xxmE2CA== + dependencies: + jest-serializer "^24.4.0" + metro-core "0.54.1" + mkdirp "^0.5.1" + rimraf "^2.5.4" + metro-cache@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.56.4.tgz#542f9f8a35f8fb9d5576f46fd3ab4d4f42851a7e" @@ -5945,6 +6063,18 @@ metro-cache@^0.56.4: mkdirp "^0.5.1" rimraf "^2.5.4" +metro-config@0.54.1, metro-config@^0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.54.1.tgz#808b4e17625d9f4e9afa34232778fdf8e63cc8dd" + integrity sha512-FpxrA+63rGkPGvGI653dvuSreJzU+eOTILItVnnhmqwn2SAK5V00N/qGTOIJe2YIuWEFXwCzw9lXmANrXbwuGg== + dependencies: + cosmiconfig "^5.0.5" + jest-validate "^24.7.0" + metro "0.54.1" + metro-cache "0.54.1" + metro-core "0.54.1" + pretty-format "^24.7.0" + metro-config@^0.56.0, metro-config@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.56.4.tgz#338fd8165fba59424cec427c1a881757945e57e9" @@ -5957,6 +6087,16 @@ metro-config@^0.56.0, metro-config@^0.56.4: metro-core "^0.56.4" pretty-format "^24.7.0" +metro-core@0.54.1, metro-core@^0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.54.1.tgz#17f6ecc167918da8819d4af5726349e55714954b" + integrity sha512-8oz3Ck7QFBzW9dG9tKFhrXHKPu2Ajx3R7eatf61Gl6Jf/tF7PNouv3wHxPsJW3oXDFiwKLszd89+OgleTGkB5g== + dependencies: + jest-haste-map "^24.7.1" + lodash.throttle "^4.1.1" + metro-resolver "0.54.1" + wordwrap "^1.0.0" + metro-core@^0.56.0, metro-core@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.56.4.tgz#67cc41b3c0bf66e9c2306f50239a1080b1e82312" @@ -5967,6 +6107,17 @@ metro-core@^0.56.0, metro-core@^0.56.4: metro-resolver "^0.56.4" wordwrap "^1.0.0" +metro-inspector-proxy@0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.54.1.tgz#0ef48ee3feb11c6da47aa100151a9bf2a7c358ee" + integrity sha512-sf6kNu7PgFW6U+hU7YGZfbAUKAPVvCJhY8YVu/A1RMKH9nNULrCo+jlWh0gWgmFfWRQiAPCElevROg+5somk8A== + dependencies: + connect "^3.6.5" + debug "^2.2.0" + rxjs "^5.4.3" + ws "^1.1.5" + yargs "^9.0.0" + metro-inspector-proxy@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.56.4.tgz#7343ff3c5908af4fd99e96b6d646e24e99816be4" @@ -5978,6 +6129,13 @@ metro-inspector-proxy@^0.56.4: ws "^1.1.5" yargs "^9.0.0" +metro-minify-uglify@0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.54.1.tgz#54ed1cb349245ce82dba8cc662bbf69fbca142c3" + integrity sha512-z+pOPna/8IxD4OhjW6Xo1mV2EszgqqQHqBm1FdmtdF6IpWkQp33qpDBNEi9NGZTOr7pp2bvcxZnvNJdC2lrK9Q== + dependencies: + uglify-es "^3.1.9" + metro-minify-uglify@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.56.4.tgz#13589dfb1d43343608aacb7f78ddfcc052daa63c" @@ -6068,6 +6226,16 @@ metro-react-native-babel-preset@^0.56.4: "@babel/template" "^7.0.0" react-refresh "^0.4.0" +metro-react-native-babel-transformer@0.54.1, metro-react-native-babel-transformer@^0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.54.1.tgz#45b56db004421134e10e739f69e8de50775fef17" + integrity sha512-ECw7xG91t8dk/PHdiyoC5SP1s9OQzfmJzG5m0YOZaKtHMe534qTDbncxaKfTI3CP99yti2maXFBRVj+xyvph/g== + dependencies: + "@babel/core" "^7.0.0" + babel-preset-fbjs "^3.1.2" + metro-babel-transformer "0.54.1" + metro-react-native-babel-preset "0.54.1" + metro-react-native-babel-transformer@^0.56.0: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.56.4.tgz#3c6e48b605c305362ee624e45ff338656e35fc1d" @@ -6079,6 +6247,13 @@ metro-react-native-babel-transformer@^0.56.0: metro-react-native-babel-preset "^0.56.4" metro-source-map "^0.56.4" +metro-resolver@0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.54.1.tgz#0295b38624b678b88b16bf11d47288845132b087" + integrity sha512-Byv1LIawYAASy9CFRwzrncYnqaFGLe8vpw178EtzStqP05Hu6hXSqkNTrfoXa+3V9bPFGCrVzFx2NY3gFp2btg== + dependencies: + absolute-path "^0.0.0" + metro-resolver@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.56.4.tgz#9876f57bca37fd1bfcffd733541e2ee4a89fad7f" @@ -6086,6 +6261,28 @@ metro-resolver@^0.56.4: dependencies: absolute-path "^0.0.0" +metro-source-map@0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.54.1.tgz#e17bad53c11978197d3c05c9168d799c2e04dcc5" + integrity sha512-E9iSYMSUSq5qYi1R2hTQtxH4Mxjzfgr/jaSmQIWi7h3fG2P1qOZNNSzeaeUeTK+s2N/ksVlkcL5kMikol8CDrQ== + dependencies: + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + source-map "^0.5.6" + +metro-source-map@0.55.0, metro-source-map@^0.55.0: + version "0.55.0" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.55.0.tgz#1f6289905f08277c398f2b9b9c13e7e0e5a6f540" + integrity sha512-HZODA0KPl5onJNGIztfTHHWurR2nL6Je/X8wwj+bL4ZBB/hSMVeDk7rWReCAvO3twVz7Ztp8Si0jfMmmH4Ruuw== + dependencies: + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + invariant "^2.2.4" + metro-symbolicate "0.55.0" + ob1 "0.55.0" + source-map "^0.5.6" + vlq "^1.0.0" + metro-source-map@^0.56.0, metro-source-map@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.56.4.tgz#868ccac3f3519fe14eca358bc186f63651b2b9bc" @@ -6099,6 +6296,16 @@ metro-source-map@^0.56.0, metro-source-map@^0.56.4: source-map "^0.5.6" vlq "^1.0.0" +metro-symbolicate@0.55.0: + version "0.55.0" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.55.0.tgz#4086a2adae54b5e44a4911ca572d8a7b03c71fa1" + integrity sha512-3r3Gpv5L4U7rBGpIqw5S1nun5MelfUMLRiScJsPRGZVTX3WY1w+zpaQKlWBi5yuHf5dMQ+ZUVbhb02IdrfJ2Fg== + dependencies: + metro-source-map "0.55.0" + source-map "^0.5.6" + through2 "^2.0.1" + vlq "^1.0.0" + metro-symbolicate@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.56.4.tgz#53e9d40beac9049fa75a3e620ddd47d4907ff015" @@ -6110,6 +6317,65 @@ metro-symbolicate@^0.56.4: through2 "^2.0.1" vlq "^1.0.0" +metro@0.54.1, metro@^0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.54.1.tgz#a629be00abee5a450a25a8f71c24745f70cc9b44" + integrity sha512-6ODPT4mEo4FCpbExRNnQAcZmf1VeNvYOTMj2Na03FjGqhNODHhI2U/wF/Ul5gqTyJ2dVdkXeyvKW3gl/LrnJRg== + dependencies: + "@babel/core" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/plugin-external-helpers" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + absolute-path "^0.0.0" + async "^2.4.0" + babel-preset-fbjs "^3.1.2" + buffer-crc32 "^0.2.13" + chalk "^2.4.1" + concat-stream "^1.6.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + eventemitter3 "^3.0.0" + fbjs "^1.0.0" + fs-extra "^1.0.0" + graceful-fs "^4.1.3" + image-size "^0.6.0" + invariant "^2.2.4" + jest-haste-map "^24.7.1" + jest-worker "^24.6.0" + json-stable-stringify "^1.0.1" + lodash.throttle "^4.1.1" + merge-stream "^1.0.1" + metro-babel-register "0.54.1" + metro-babel-transformer "0.54.1" + metro-cache "0.54.1" + metro-config "0.54.1" + metro-core "0.54.1" + metro-inspector-proxy "0.54.1" + metro-minify-uglify "0.54.1" + metro-react-native-babel-preset "0.54.1" + metro-resolver "0.54.1" + metro-source-map "0.54.1" + mime-types "2.1.11" + mkdirp "^0.5.1" + node-fetch "^2.2.0" + nullthrows "^1.1.0" + react-transform-hmr "^1.0.4" + resolve "^1.5.0" + rimraf "^2.5.4" + serialize-error "^2.1.0" + source-map "^0.5.6" + temp "0.8.3" + throat "^4.1.0" + wordwrap "^1.0.0" + write-file-atomic "^1.2.0" + ws "^1.1.5" + xpipe "^1.0.5" + yargs "^9.0.0" + metro@^0.56.0, metro@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/metro/-/metro-0.56.4.tgz#be7e1380ee6ac3552c25ead8098eab261029e4d7" @@ -6832,6 +7098,11 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== +ob1@0.55.0: + version "0.55.0" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.55.0.tgz#e393b4ae786ef442b3ef2a298ab70d6ec353dbdd" + integrity sha512-pfyiMVsUItl8WiRKMT15eCi662pCRAuYTq2+V3UpE+PpFErJI/TvRh/M/l/9TaLlbFr7krJ7gdl+FXJNcybmvw== + ob1@^0.56.4: version "0.56.4" resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.56.4.tgz#c4acb3baa42f4993a44b35b2da7c8ef443dcccec" @@ -7623,7 +7894,7 @@ react-deep-force-update@^1.0.0: resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz#3d2ae45c2c9040cbb1772be52f8ea1ade6ca2ee1" integrity sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA== -react-devtools-core@^3.6.3: +react-devtools-core@^3.6.1, react-devtools-core@^3.6.3: version "3.6.3" resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-3.6.3.tgz#977d95b684c6ad28205f0c62e1e12c5f16675814" integrity sha512-+P+eFy/yo8Z/UH9J0DqHZuUM5+RI2wl249TNvMx3J2jpUomLQa4Zxl56GEotGfw3PIP1eI+hVf1s53FlUONStQ== @@ -7636,6 +7907,40 @@ react-is@^16.8.1, react-is@^16.8.4: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb" integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== +react-native-macos@0.60.0-microsoft.49: + version "0.60.0-microsoft.49" + resolved "https://registry.yarnpkg.com/react-native-macos/-/react-native-macos-0.60.0-microsoft.49.tgz#ac506343f7450f12f852769102e6262b531b181f" + integrity sha512-2631KIggGpw1RoLC/lWRZ/agFgAAMWuoQrRcmGsN+0neXHggEY5jUzz1uV6LeqKkrcudV+qaz3ajo85UjwqDIA== + dependencies: + "@babel/runtime" "^7.0.0" + "@react-native-community/cli" "^2.6.0" + "@react-native-community/cli-platform-android" "^2.6.0" + "@react-native-community/cli-platform-ios" "^2.4.1" + abort-controller "^3.0.0" + art "^0.10.0" + base64-js "^1.1.2" + connect "^3.6.5" + create-react-class "^15.6.3" + escape-string-regexp "^1.0.5" + event-target-shim "^5.0.1" + fbjs "^1.0.0" + fbjs-scripts "^1.1.0" + hermesvm "^0.1.0" + invariant "^2.2.4" + jsc-android "245459.0.0" + metro-babel-register "0.54.1" + metro-react-native-babel-transformer "0.54.1" + metro-source-map "^0.55.0" + nullthrows "^1.1.0" + pretty-format "^24.7.0" + promise "^7.1.1" + prop-types "^15.7.2" + react-devtools-core "^3.6.1" + regenerator-runtime "^0.13.2" + scheduler "0.14.0" + stacktrace-parser "^0.1.3" + whatwg-fetch "^3.0.0" + react-native@0.61.5: version "0.61.5" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.61.5.tgz#6e21acb56cbd75a3baeb1f70201a66f42600bba8" @@ -8228,6 +8533,14 @@ sax@^1.2.1, sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +scheduler@0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.14.0.tgz#b392c23c9c14bfa2933d4740ad5603cc0d59ea5b" + integrity sha512-9CgbS06Kki2f4R9FjLSITjZo5BZxPsryiRNyL3LpvrM9WxcVmhlqAOc9E+KQbeI2nqej4JIIbOsfdL51cNb4Iw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler@0.15.0: version "0.15.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.15.0.tgz#6bfcf80ff850b280fed4aeecc6513bc0b4f17f8e"