From 70135e193eee4e2662eb9b2fe03e94c2efda4c9b Mon Sep 17 00:00:00 2001 From: Ali Najafizadeh Date: Mon, 13 Jul 2015 16:09:24 -0400 Subject: [PATCH] added webview bridge --- example/Sample2/RCTWebView+WebViewExBridge.h | 1 + example/Sample2/RCTWebView+WebViewExBridge.m | 63 +++++++++++-------- .../RCTWebViewManager+WebViewExManager.m | 11 ++++ .../Sample2/Sample2.xcodeproj/project.pbxproj | 4 ++ example/Sample2/WebViewBridge.js | 5 ++ example/Sample2/index.ios.js | 5 +- example/Sample2/webview-bridge-script.js | 18 ++++++ 7 files changed, 79 insertions(+), 28 deletions(-) create mode 100644 example/Sample2/webview-bridge-script.js diff --git a/example/Sample2/RCTWebView+WebViewExBridge.h b/example/Sample2/RCTWebView+WebViewExBridge.h index 85c963b..3e42db7 100644 --- a/example/Sample2/RCTWebView+WebViewExBridge.h +++ b/example/Sample2/RCTWebView+WebViewExBridge.h @@ -10,6 +10,7 @@ @interface RCTWebView (WebViewExBridge) - (void)eval:(NSString *) value; +- (void)injectBridgeScript; //in this category I'm going to make this mothod visible. - (NSMutableDictionary *)baseEvent; diff --git a/example/Sample2/RCTWebView+WebViewExBridge.m b/example/Sample2/RCTWebView+WebViewExBridge.m index a92dda7..8350d1e 100644 --- a/example/Sample2/RCTWebView+WebViewExBridge.m +++ b/example/Sample2/RCTWebView+WebViewExBridge.m @@ -14,6 +14,7 @@ static NSString *const RNWBSchema = @"reactnativewebviewbridge"; @implementation RCTWebView (WebViewExBridge) + - (void)eval:(NSString *) value { //access to provate variable UIWebView* _webView = [self valueForKey:@"_webView"]; @@ -21,33 +22,43 @@ static NSString *const RNWBSchema = @"reactnativewebviewbridge"; NSLog(@"Called Eval %@", value); } -- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request - navigationType:(UIWebViewNavigationType)navigationType -{ - //access to provate variable - RCTEventDispatcher *_eventDispatcher = [self valueForKey:@"_eventDispatcher"]; - - //we need to check whether it's coming from our request schema - NSURL *URL = [request URL]; - if ([[URL scheme] isEqualToString:RNWBSchema]) { - // parse the rest of the URL object and execute functions - - return NO; +//- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request +// navigationType:(UIWebViewNavigationType)navigationType +//{ +// //access to provate variable +// RCTEventDispatcher *_eventDispatcher = [self valueForKey:@"_eventDispatcher"]; +// +// //we need to check whether it's coming from our request schema +// NSURL *URL = [request URL]; +// if ([[URL scheme] isEqualToString:RNWBSchema]) { +// // parse the rest of the URL object and execute functions +// +// return NO; +// } +// +// // We have this check to filter out iframe requests and whatnot +// BOOL isTopFrame = [request.URL isEqual:request.mainDocumentURL]; +// if (isTopFrame) { +// NSMutableDictionary *event = [self baseEvent]; +// [event addEntriesFromDictionary: @{ +// @"url": [request.URL absoluteString], +// @"navigationType": @(navigationType) +// }]; +// [_eventDispatcher sendInputEventWithName:@"topLoadingStart" body:event]; +// } +// +// // AJAX handler +// return ![request.URL.scheme isEqualToString:RCTJSAJAXScheme]; +//} + +- (void)injectBridgeScript { + UIWebView* _webView = [self valueForKey:@"_webView"]; + if (![[_webView stringByEvaluatingJavaScriptFromString:@"typeof WebViewJavascriptBridge == 'object'"] isEqualToString:@"true"]) { + NSBundle *bundle = [NSBundle mainBundle]; + NSString *filePath = [bundle pathForResource:@"webview-bridge-script" ofType:@"js"]; + NSString *js = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil]; + [_webView stringByEvaluatingJavaScriptFromString:js]; } - - // We have this check to filter out iframe requests and whatnot - BOOL isTopFrame = [request.URL isEqual:request.mainDocumentURL]; - if (isTopFrame) { - NSMutableDictionary *event = [self baseEvent]; - [event addEntriesFromDictionary: @{ - @"url": [request.URL absoluteString], - @"navigationType": @(navigationType) - }]; - [_eventDispatcher sendInputEventWithName:@"topLoadingStart" body:event]; - } - - // AJAX handler - return ![request.URL.scheme isEqualToString:RCTJSAJAXScheme]; } @end diff --git a/example/Sample2/RCTWebViewManager+WebViewExManager.m b/example/Sample2/RCTWebViewManager+WebViewExManager.m index 3965c32..06b230f 100644 --- a/example/Sample2/RCTWebViewManager+WebViewExManager.m +++ b/example/Sample2/RCTWebViewManager+WebViewExManager.m @@ -32,5 +32,16 @@ RCT_EXPORT_METHOD(eval:(NSNumber *)reactTag }]; } +RCT_EXPORT_METHOD(injectBridgeScript:(NSNumber *)reactTag) +{ + [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + RCTWebView *view = viewRegistry[reactTag]; + if (![view isKindOfClass:[RCTWebView class]]) { + RCTLogMustFix(@"Invalid view returned from registry, expecting RKWebView, got: %@", view); + } + [view injectBridgeScript]; + }]; +} + @end diff --git a/example/Sample2/Sample2.xcodeproj/project.pbxproj b/example/Sample2/Sample2.xcodeproj/project.pbxproj index 5d4e1d6..dfb391f 100644 --- a/example/Sample2/Sample2.xcodeproj/project.pbxproj +++ b/example/Sample2/Sample2.xcodeproj/project.pbxproj @@ -22,6 +22,7 @@ 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 */; }; + 412BC73B1B5434B900AEB14B /* webview-bridge-script.js in Resources */ = {isa = PBXBuildFile; fileRef = 412BC73A1B5434B900AEB14B /* webview-bridge-script.js */; }; 4144F9C11B502CE2005C34CC /* RCTWebView+WebViewExBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 4144F9C01B502CE2005C34CC /* RCTWebView+WebViewExBridge.m */; }; 4144F9DB1B5033F7005C34CC /* RCTWebViewManager+WebViewExManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4144F9DA1B5033F7005C34CC /* RCTWebViewManager+WebViewExManager.m */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; @@ -127,6 +128,7 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = iOS/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = iOS/main.m; sourceTree = ""; }; 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; + 412BC73A1B5434B900AEB14B /* webview-bridge-script.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "webview-bridge-script.js"; sourceTree = ""; }; 4144F9BF1B502CE2005C34CC /* RCTWebView+WebViewExBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RCTWebView+WebViewExBridge.h"; sourceTree = ""; }; 4144F9C01B502CE2005C34CC /* RCTWebView+WebViewExBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "RCTWebView+WebViewExBridge.m"; sourceTree = ""; }; 4144F9D91B5033F7005C34CC /* RCTWebViewManager+WebViewExManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RCTWebViewManager+WebViewExManager.h"; sourceTree = ""; }; @@ -250,6 +252,7 @@ 4144F9C01B502CE2005C34CC /* RCTWebView+WebViewExBridge.m */, 4144F9D91B5033F7005C34CC /* RCTWebViewManager+WebViewExManager.h */, 4144F9DA1B5033F7005C34CC /* RCTWebViewManager+WebViewExManager.m */, + 412BC73A1B5434B900AEB14B /* webview-bridge-script.js */, ); name = Sample2; sourceTree = ""; @@ -515,6 +518,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 412BC73B1B5434B900AEB14B /* webview-bridge-script.js in Resources */, 008F07F31AC5B25A0029DE68 /* main.jsbundle in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, diff --git a/example/Sample2/WebViewBridge.js b/example/Sample2/WebViewBridge.js index a78fcff..699aab2 100644 --- a/example/Sample2/WebViewBridge.js +++ b/example/Sample2/WebViewBridge.js @@ -22,6 +22,11 @@ class WebViewBridge extends Component { WebViewManager.eval(ref.getWebWiewHandle(), value); } + injectBridgeScript() { + var ref = this.refs[WEB_VIEW_BRIDGE_REF]; + WebViewManager.injectBridgeScript(ref.getWebWiewHandle()); + } + render() { return ( ); diff --git a/example/Sample2/webview-bridge-script.js b/example/Sample2/webview-bridge-script.js new file mode 100644 index 0000000..bf36b35 --- /dev/null +++ b/example/Sample2/webview-bridge-script.js @@ -0,0 +1,18 @@ +(function() { + 'use strict'; + var WebViewBridge = {}; + + function noop() {} + + WebViewBridge = { + send: function (value) { + + }, + onMessage: noop + }; + + window.WebViewBridge = WebViewBridge; + var event = document.createEvent('Event'); + event.initEvent('WebViewBridge', true, true); + document.dispatchEvent(event); +}());