1
1
#import " WebViewJavascriptBridge.h"
2
2
3
+ @interface WebViewJavascriptBridge ()
4
+
5
+ @property (readwrite ,retain ) NSMutableArray * startupMessageQueue;
6
+
7
+ - (void ) _flushMessageQueueFromWebView : (UIWebView *) theWebView ;
8
+ - (void ) _doSendMessage : (NSString *)message toWebView : (UIWebView *) theWebView ;
9
+
10
+ @end
11
+
3
12
@implementation WebViewJavascriptBridge
4
13
5
- @synthesize delegate;
6
- @synthesize webView;
7
- @synthesize startupMessageQueue;
14
+ @synthesize delegate = _delegate;
15
+ @synthesize startupMessageQueue = _startupMessageQueue;
8
16
9
17
static NSString * MESSAGE_SEPERATOR = @" __wvjb_sep__" ;
10
18
static NSString * CUSTOM_PROTOCOL_SCHEME = @" webviewjavascriptbridge" ;
11
19
static NSString * QUEUE_HAS_MESSAGE = @" queuehasmessage" ;
12
20
13
- + (id ) createWithDelegate : (id <WebViewJavascriptBridgeDelegate>) delegate {
14
- WebViewJavascriptBridge* bridge = [[WebViewJavascriptBridge alloc ] init ];
15
- bridge.delegate = delegate;
16
- bridge.startupMessageQueue = [[NSMutableArray alloc ] init ];
17
- return bridge;
21
+ + (id ) javascriptBridge
22
+ {
23
+ return [[[self alloc ] init ] autorelease ];
24
+ }
25
+
26
+ - (id ) init
27
+ {
28
+ if ( (self = [super init ]) )
29
+ {
30
+ self.startupMessageQueue = [[NSMutableArray new ] autorelease ];
31
+ }
32
+
33
+ return self;
34
+ }
35
+
36
+ - (void ) dealloc
37
+ {
38
+ self.delegate = nil ;
39
+ self.startupMessageQueue = nil ;
40
+
41
+ [super dealloc ];
18
42
}
19
43
20
- - (void )sendMessage : (NSString *)message {
21
- if (startupMessageQueue) { [startupMessageQueue addObject: message]; }
22
- else { [self _doSendMessage: message]; }
44
+ - (void )sendMessage : (NSString *)message toWebView : (UIWebView *) theWebView {
45
+ if (self. startupMessageQueue ) { [self . startupMessageQueue addObject: message]; }
46
+ else { [self _doSendMessage: message toWebView: theWebView ]; }
23
47
}
24
48
25
- - (void )_doSendMessage : (NSString *)message {
49
+ - (void )_doSendMessage : (NSString *)message toWebView : (UIWebView *) aWebView {
26
50
message = [message stringByReplacingOccurrencesOfString: @" \\ n" withString: @" \\\\ n" ];
27
51
message = [message stringByReplacingOccurrencesOfString: @" '" withString: @" \\ '" ];
28
52
message = [message stringByReplacingOccurrencesOfString: @" \" " withString: @" \\\" " ];
29
- [webView stringByEvaluatingJavaScriptFromString: [NSString stringWithFormat: @" WebViewJavascriptBridge._handleMessageFromObjC('%@ ');" , message]];
53
+ [aWebView stringByEvaluatingJavaScriptFromString: [NSString stringWithFormat: @" WebViewJavascriptBridge._handleMessageFromObjC('%@ ');" , message]];
30
54
}
31
55
32
56
- (void )webViewDidFinishLoad : (UIWebView *)theWebView {
33
- webView = theWebView;
34
57
NSString * js;
35
58
js = [NSString stringWithFormat: @" ;(function() {"
36
59
" if (window.WebViewJavascriptBridge) { return; };"
@@ -92,12 +115,12 @@ - (void)webViewDidFinishLoad:(UIWebView *)theWebView {
92
115
CUSTOM_PROTOCOL_SCHEME,
93
116
QUEUE_HAS_MESSAGE];
94
117
95
- [webView stringByEvaluatingJavaScriptFromString: js];
118
+ [theWebView stringByEvaluatingJavaScriptFromString: js];
96
119
97
- for (id message in startupMessageQueue) {
98
- [self _doSendMessage: message];
120
+ for (id message in self. startupMessageQueue ) {
121
+ [self _doSendMessage: message toWebView: theWebView ];
99
122
}
100
- startupMessageQueue = nil ;
123
+ self. startupMessageQueue = nil ;
101
124
}
102
125
103
126
@@ -106,19 +129,19 @@ - (BOOL)webView:(UIWebView *)theWebView shouldStartLoadWithRequest:(NSURLRequest
106
129
if (![[url scheme ] isEqualToString: CUSTOM_PROTOCOL_SCHEME]) { return YES ; }
107
130
108
131
if ([[url host ] isEqualToString: QUEUE_HAS_MESSAGE]) {
109
- [self _flushMessageQueue ];
132
+ [self _flushMessageQueueFromWebView: theWebView ];
110
133
} else {
111
134
NSLog (@" WARNING: Received unknown WebViewJavascriptBridge command %@ ://%@ " , CUSTOM_PROTOCOL_SCHEME, [url path ]);
112
135
}
113
136
114
137
return NO ;
115
138
}
116
139
117
- - (void ) _flushMessageQueue {
118
- NSString * messageQueueString = [webView stringByEvaluatingJavaScriptFromString: @" WebViewJavascriptBridge._fetchQueue();" ];
140
+ - (void ) _flushMessageQueueFromWebView : (UIWebView *) theWebView {
141
+ NSString * messageQueueString = [theWebView stringByEvaluatingJavaScriptFromString: @" WebViewJavascriptBridge._fetchQueue();" ];
119
142
NSArray * messages = [messageQueueString componentsSeparatedByString: MESSAGE_SEPERATOR];
120
143
for (id message in messages) {
121
- [delegate handleMessage: message];
144
+ [self . delegate handleMessage: message fromWebView: theWebView ];
122
145
}
123
146
}
124
147
0 commit comments