@@ -58,6 +58,124 @@ <h1>Demo</h1>
5858 } )
5959 }
6060 } )
61+
62+ ; ( function ( ) {
63+ if ( window . WKWebViewJavascriptBridge ) {
64+ return ;
65+ }
66+
67+ if ( ! window . onerror ) {
68+ window . onerror = function ( msg , url , line ) {
69+ console . log ( "WKWebViewJavascriptBridge: ERROR:" + msg + "@" + url + ":" + line ) ;
70+ }
71+ }
72+ window . WKWebViewJavascriptBridge = {
73+ registerHandler : registerHandler ,
74+ callHandler : callHandler ,
75+ disableJavscriptAlertBoxSafetyTimeout : disableJavscriptAlertBoxSafetyTimeout ,
76+ _fetchQueue : _fetchQueue ,
77+ _handleMessageFromiOS : _handleMessageFromiOS
78+ } ;
79+
80+ var messagingIframe ;
81+ var sendMessageQueue = [ ] ;
82+ var messageHandlers = { } ;
83+
84+ var CUSTOM_PROTOCOL_SCHEME = 'https' ;
85+ var QUEUE_HAS_MESSAGE = '__wvjb_queue_message__' ;
86+
87+ var responseCallbacks = { } ;
88+ var uniqueId = 1 ;
89+ var dispatchMessagesWithTimeoutSafety = true ;
90+
91+ function registerHandler ( handlerName , handler ) {
92+ messageHandlers [ handlerName ] = handler ;
93+ }
94+
95+ function callHandler ( handlerName , data , responseCallback ) {
96+ if ( arguments . length == 2 && typeof data == 'function' ) {
97+ responseCallback = data ;
98+ data = null ;
99+ }
100+ _doSend ( { handlerName :handlerName , data :data } , responseCallback ) ;
101+ }
102+ function disableJavscriptAlertBoxSafetyTimeout ( ) {
103+ dispatchMessagesWithTimeoutSafety = false ;
104+ }
105+
106+ function _doSend ( message , responseCallback ) {
107+ if ( responseCallback ) {
108+ var callbackId = 'cb_' + ( uniqueId ++ ) + '_' + new Date ( ) . getTime ( ) ;
109+ responseCallbacks [ callbackId ] = responseCallback ;
110+ message [ 'callbackId' ] = callbackId ;
111+ }
112+ sendMessageQueue . push ( message ) ;
113+ messagingIframe . src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE ;
114+ }
115+
116+ function _fetchQueue ( ) {
117+ var messageQueueString = JSON . stringify ( sendMessageQueue ) ;
118+ sendMessageQueue = [ ] ;
119+ return messageQueueString ;
120+ }
121+
122+ function _dispatchMessageFromiOS ( messageJSON ) {
123+ if ( dispatchMessagesWithTimeoutSafety ) {
124+ setTimeout ( _doDispatchMessageFromiOS ) ;
125+ } else {
126+ _doDispatchMessageFromiOS ( ) ;
127+ }
128+
129+ function _doDispatchMessageFromiOS ( ) {
130+ var message = JSON . parse ( messageJSON ) ;
131+ var messageHandler ;
132+ var responseCallback ;
133+
134+ if ( message . responseId ) {
135+ responseCallback = responseCallbacks [ message . responseId ] ;
136+ if ( ! responseCallback ) {
137+ return ;
138+ }
139+ responseCallback ( message . responseData ) ;
140+ delete responseCallbacks [ message . responseId ] ;
141+ } else {
142+ if ( message . callbackId ) {
143+ var callbackResponseId = message . callbackId ;
144+ responseCallback = function ( responseData ) {
145+ _doSend ( { handlerName :message . handlerName , responseId :callbackResponseId , responseData :responseData } ) ;
146+ } ;
147+ }
148+
149+ var handler = messageHandlers [ message . handlerName ] ;
150+ if ( ! handler ) {
151+ console . log ( "WKWebViewJavascriptBridge: WARNING: no handler for message from ObjC:" , message ) ;
152+ } else {
153+ handler ( message . data , responseCallback ) ;
154+ }
155+ }
156+ }
157+ }
158+
159+ function _handleMessageFromiOS ( messageJSON ) {
160+ _dispatchMessageFromiOS ( messageJSON ) ;
161+ }
162+
163+ messagingIframe = document . createElement ( 'iframe' ) ;
164+ messagingIframe . style . display = 'none' ;
165+ messagingIframe . src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE ;
166+ document . documentElement . appendChild ( messagingIframe ) ;
167+
168+ registerHandler ( "_disableJavascriptAlertBoxSafetyTimeout" , disableJavscriptAlertBoxSafetyTimeout ) ;
169+
170+ setTimeout ( _callWVJBCallbacks , 0 ) ;
171+ function _callWVJBCallbacks ( ) {
172+ var callbacks = window . WVJBCallbacks ;
173+ delete window . WVJBCallbacks ;
174+ for ( var i = 0 ; i < callbacks . length ; i ++ ) {
175+ callbacks [ i ] ( WKWebViewJavascriptBridge ) ;
176+ }
177+ }
178+ } ) ( ) ;
61179 </ script >
62180 < div id ='buttons '> </ div > < div id ='log '> </ div >
63181</ body > </ html >
0 commit comments