Skip to content

Commit 4b95cde

Browse files
committed
Have the example iOS app use a UIViewController instead of adding the webview directly to the app window. Fixes marcuswestin#65 on GH
1 parent cd1b1a7 commit 4b95cde

File tree

5 files changed

+111
-79
lines changed

5 files changed

+111
-79
lines changed

Example Apps/ExampleApp-iOS.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
/* Begin PBXBuildFile section */
1010
2C1562B5176B9F8400B4AE50 /* WebViewJavascriptBridge.js.txt in Resources */ = {isa = PBXBuildFile; fileRef = 2C1562B4176B9F8400B4AE50 /* WebViewJavascriptBridge.js.txt */; };
1111
2C1562C0176BA63500B4AE50 /* WebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C1562A9176B9F6200B4AE50 /* WebViewJavascriptBridge.m */; };
12+
2C45CA2C1884AD520002A4E2 /* ExampleAppViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C45CA2B1884AD520002A4E2 /* ExampleAppViewController.m */; };
1213
2CA045BF17117439006DEE8B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 2CA045B717117439006DEE8B /* InfoPlist.strings */; };
1314
2CA045C217117439006DEE8B /* ExampleAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CA045BD17117439006DEE8B /* ExampleAppDelegate.m */; };
1415
2CA045C317117439006DEE8B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2CA045BE17117439006DEE8B /* main.m */; };
@@ -23,6 +24,8 @@
2324
2C1562A8176B9F6200B4AE50 /* WebViewJavascriptBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.h; sourceTree = "<group>"; };
2425
2C1562A9176B9F6200B4AE50 /* WebViewJavascriptBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge.m; sourceTree = "<group>"; };
2526
2C1562B4176B9F8400B4AE50 /* WebViewJavascriptBridge.js.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebViewJavascriptBridge.js.txt; sourceTree = "<group>"; };
27+
2C45CA2A1884AD520002A4E2 /* ExampleAppViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExampleAppViewController.h; sourceTree = "<group>"; };
28+
2C45CA2B1884AD520002A4E2 /* ExampleAppViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ExampleAppViewController.m; sourceTree = "<group>"; };
2629
2CA045B817117439006DEE8B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
2730
2CA045B917117439006DEE8B /* ExampleApp-iOS-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "ExampleApp-iOS-Info.plist"; sourceTree = "<group>"; };
2831
2CA045BA17117439006DEE8B /* ExampleApp-iOS-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ExampleApp-iOS-Prefix.pch"; sourceTree = "<group>"; };
@@ -68,6 +71,8 @@
6871
2CA0465B1711AC8D006DEE8B /* ExampleApp.html */,
6972
2CA045BC17117439006DEE8B /* ExampleAppDelegate.h */,
7073
2CA045BD17117439006DEE8B /* ExampleAppDelegate.m */,
74+
2C45CA2A1884AD520002A4E2 /* ExampleAppViewController.h */,
75+
2C45CA2B1884AD520002A4E2 /* ExampleAppViewController.m */,
7176
2C1562A7176B9F5400B4AE50 /* WebViewJavascriptBridge */,
7277
2CA046211711A94E006DEE8B /* Supporting Files */,
7378
);
@@ -179,6 +184,7 @@
179184
buildActionMask = 2147483647;
180185
files = (
181186
2C1562C0176BA63500B4AE50 /* WebViewJavascriptBridge.m in Sources */,
187+
2C45CA2C1884AD520002A4E2 /* ExampleAppViewController.m in Sources */,
182188
2CA045C217117439006DEE8B /* ExampleAppDelegate.m in Sources */,
183189
2CA045C317117439006DEE8B /* main.m in Sources */,
184190
);
Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
#import <UIKit/UIKit.h>
2-
#import "WebViewJavascriptBridge.h"
3-
4-
@interface ExampleAppDelegate : UIResponder <UIApplicationDelegate, UIWebViewDelegate>
5-
6-
@property (strong, nonatomic) UIWindow *window;
7-
@property (strong, nonatomic) WebViewJavascriptBridge *javascriptBridge;
8-
9-
- (void)renderButtons:(UIWebView*)webView;
10-
- (void)loadExamplePage:(UIWebView*)webView;
112

3+
@interface ExampleAppDelegate : UIResponder <UIApplicationDelegate>
4+
@property (nonatomic) UIWindow *window;
125
@end
Lines changed: 2 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,13 @@
11
#import "ExampleAppDelegate.h"
2+
#import "ExampleAppViewController.h"
23

34
@implementation ExampleAppDelegate
45

5-
@synthesize window = _window;
6-
@synthesize javascriptBridge = _bridge;
7-
8-
- (void)webViewDidStartLoad:(UIWebView *)webView {
9-
NSLog(@"webViewDidStartLoad");
10-
}
11-
12-
- (void)webViewDidFinishLoad:(UIWebView *)webView {
13-
NSLog(@"webViewDidFinishLoad");
14-
}
15-
166
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
177
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
18-
UIWebView* webView = [[UIWebView alloc] initWithFrame:self.window.bounds];
19-
[self.window addSubview:webView];
20-
21-
[WebViewJavascriptBridge enableLogging];
22-
23-
_bridge = [WebViewJavascriptBridge bridgeForWebView:webView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) {
24-
NSLog(@"ObjC received message from JS: %@", data);
25-
responseCallback(@"Response for message from ObjC");
26-
}];
27-
28-
[_bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
29-
NSLog(@"testObjcCallback called: %@", data);
30-
responseCallback(@"Response from testObjcCallback");
31-
}];
32-
33-
[_bridge send:@"A string sent from ObjC before Webview has loaded." responseCallback:^(id responseData) {
34-
NSLog(@"objc got response! %@", responseData);
35-
}];
36-
37-
[_bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];
38-
39-
[self renderButtons:webView];
40-
[self loadExamplePage:webView];
41-
42-
[_bridge send:@"A string sent from ObjC after Webview has loaded."];
43-
8+
self.window.rootViewController = [ExampleAppViewController new];
449
[self.window makeKeyAndVisible];
4510
return YES;
4611
}
4712

48-
- (void)renderButtons:(UIWebView*)webView {
49-
UIButton *messageButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
50-
[messageButton setTitle:@"Send message" forState:UIControlStateNormal];
51-
[messageButton addTarget:self action:@selector(sendMessage:) forControlEvents:UIControlEventTouchUpInside];
52-
[self.window insertSubview:messageButton aboveSubview:webView];
53-
messageButton.frame = CGRectMake(20, 414, 130, 45);
54-
55-
UIButton *callbackButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
56-
[callbackButton setTitle:@"Call handler" forState:UIControlStateNormal];
57-
[callbackButton addTarget:self action:@selector(callHandler:) forControlEvents:UIControlEventTouchUpInside];
58-
[self.window insertSubview:callbackButton aboveSubview:webView];
59-
callbackButton.frame = CGRectMake(170, 414, 130, 45);
60-
}
61-
62-
- (void)sendMessage:(id)sender {
63-
[_bridge send:@"A string sent from ObjC to JS" responseCallback:^(id response) {
64-
NSLog(@"sendMessage got response: %@", response);
65-
}];
66-
}
67-
68-
- (void)callHandler:(id)sender {
69-
id data = @{ @"greetingFromObjC": @"Hi there, JS!" };
70-
[_bridge callHandler:@"testJavascriptHandler" data:data responseCallback:^(id response) {
71-
NSLog(@"testJavascriptHandler responded: %@", response);
72-
}];
73-
}
74-
75-
- (void)loadExamplePage:(UIWebView*)webView {
76-
NSString* htmlPath = [[NSBundle mainBundle] pathForResource:@"ExampleApp" ofType:@"html"];
77-
NSString* appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
78-
[webView loadHTMLString:appHtml baseURL:nil];
79-
}
80-
8113
@end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//
2+
// ExampleAppViewController.h
3+
// ExampleApp-iOS
4+
//
5+
// Created by Marcus Westin on 1/13/14.
6+
// Copyright (c) 2014 Marcus Westin. All rights reserved.
7+
//
8+
9+
#import <UIKit/UIKit.h>
10+
11+
@interface ExampleAppViewController : UINavigationController <UIWebViewDelegate>
12+
13+
@end
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
//
2+
// ExampleAppViewController.m
3+
// ExampleApp-iOS
4+
//
5+
// Created by Marcus Westin on 1/13/14.
6+
// Copyright (c) 2014 Marcus Westin. All rights reserved.
7+
//
8+
9+
#import "ExampleAppViewController.h"
10+
#import "WebViewJavascriptBridge.h"
11+
12+
@interface ExampleAppViewController ()
13+
@property WebViewJavascriptBridge* bridge;
14+
@end
15+
16+
@implementation ExampleAppViewController
17+
18+
- (void)viewWillAppear:(BOOL)animated {
19+
if (_bridge) { return; }
20+
21+
UIWebView* webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
22+
[self.view addSubview:webView];
23+
24+
[WebViewJavascriptBridge enableLogging];
25+
26+
_bridge = [WebViewJavascriptBridge bridgeForWebView:webView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) {
27+
NSLog(@"ObjC received message from JS: %@", data);
28+
responseCallback(@"Response for message from ObjC");
29+
}];
30+
31+
[_bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
32+
NSLog(@"testObjcCallback called: %@", data);
33+
responseCallback(@"Response from testObjcCallback");
34+
}];
35+
36+
[_bridge send:@"A string sent from ObjC before Webview has loaded." responseCallback:^(id responseData) {
37+
NSLog(@"objc got response! %@", responseData);
38+
}];
39+
40+
[_bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];
41+
42+
[self renderButtons:webView];
43+
[self loadExamplePage:webView];
44+
45+
[_bridge send:@"A string sent from ObjC after Webview has loaded."];
46+
}
47+
48+
- (void)webViewDidStartLoad:(UIWebView *)webView {
49+
NSLog(@"webViewDidStartLoad");
50+
}
51+
52+
- (void)webViewDidFinishLoad:(UIWebView *)webView {
53+
NSLog(@"webViewDidFinishLoad");
54+
}
55+
56+
- (void)renderButtons:(UIWebView*)webView {
57+
UIButton *messageButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
58+
[messageButton setTitle:@"Send message" forState:UIControlStateNormal];
59+
[messageButton addTarget:self action:@selector(sendMessage:) forControlEvents:UIControlEventTouchUpInside];
60+
[self.view insertSubview:messageButton aboveSubview:webView];
61+
messageButton.frame = CGRectMake(20, 414, 130, 45);
62+
63+
UIButton *callbackButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
64+
[callbackButton setTitle:@"Call handler" forState:UIControlStateNormal];
65+
[callbackButton addTarget:self action:@selector(callHandler:) forControlEvents:UIControlEventTouchUpInside];
66+
[self.view insertSubview:callbackButton aboveSubview:webView];
67+
callbackButton.frame = CGRectMake(170, 414, 130, 45);
68+
}
69+
70+
- (void)sendMessage:(id)sender {
71+
[_bridge send:@"A string sent from ObjC to JS" responseCallback:^(id response) {
72+
NSLog(@"sendMessage got response: %@", response);
73+
}];
74+
}
75+
76+
- (void)callHandler:(id)sender {
77+
id data = @{ @"greetingFromObjC": @"Hi there, JS!" };
78+
[_bridge callHandler:@"testJavascriptHandler" data:data responseCallback:^(id response) {
79+
NSLog(@"testJavascriptHandler responded: %@", response);
80+
}];
81+
}
82+
83+
- (void)loadExamplePage:(UIWebView*)webView {
84+
NSString* htmlPath = [[NSBundle mainBundle] pathForResource:@"ExampleApp" ofType:@"html"];
85+
NSString* appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
86+
[webView loadHTMLString:appHtml baseURL:nil];
87+
}
88+
@end

0 commit comments

Comments
 (0)