Skip to content

Instantly share code, notes, and snippets.

@lovesunstar
Last active February 3, 2022 00:53
Show Gist options
  • Save lovesunstar/efec08f8d2655ad432ab9dcb7d172536 to your computer and use it in GitHub Desktop.
Save lovesunstar/efec08f8d2655ad432ab9dcb7d172536 to your computer and use it in GitHub Desktop.
Provide a way to send event to native.
/* wk.bridge.min.js | v0.2 */
(function() {
if (window.isIOS) {
return
}
window.isIOS = function () {
return navigator && navigator.userAgent && (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent))
}
}());
/* wk.bridge.min.js | v0.3 */
/* wk.bridge.min.js | v0.3 */
(function() {
if (window.bridge) {
return
}
window.bridge = function() {
var callbacks = [], callbackID = 0, registerHandlers = [];
document.addEventListener('PacificDidReceiveNativeCallback', function(e) {
if (e.detail) {
var detail = e.detail;
var id = isNaN(parseInt(detail.id)) ? -1 : parseInt(detail.id)
if (id != -1) {
callbacks[id] && callbacks[id](detail.parameters, detail.error);
delete callbacks[id];
}
}
}, false);
document.addEventListener('PacificDidReceiveNativeBroadcast', function(e) {
if (e.detail) {
var detail = e.detail;
var name = detail.name
if (name !== undefined && registerHandlers[name]) {
var namedListeners = registerHandlers[name]
if (namedListeners instanceof Array) {
var parameters = detail.parameters
// 使用压缩的话, 这句话压缩不过
// (handler) => { handler(parameters) }
namedListeners.forEach(function(handler){handler(parameters)})
}
}
}
}, false);
return {
'post': function(action, parameters, callback, print) {
var message = {'action':action, 'parameters':parameters, 'print': print || 0}
if (callback) {
var id = ++callbackID;
callbacks[id] = callback;
message['callback'] = id
}
// For iOS
if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.pacific) {
window.webkit.messageHandlers.pacific.postMessage(message)
} else {
// For Android
if (window.pacific && window.pacific.didReceiveMessage) {
window.pacific.didReceiveMessage(JSON.stringify(message))
} else {
// For Apps Havn't Implement (Message Bridge)
var openURLString = "pacific://postMessage?_json=" + encodeURIComponent(JSON.stringify(message));
var bridgeFrame = document.createElement("iframe");
bridgeFrame.setAttribute("src", openURLString);
document.documentElement.appendChild(bridgeFrame);
bridgeFrame.parentNode.removeChild(bridgeFrame);
bridgeFrame = null;
}
}
},
'dispatch': function(action, parameters, print) {
return new Promise((resolve, reject) => {
window.bridge.post(action, parameters, (result, error)=>{
if (error) {
reject(error)
} else {
resolve(result)
};
}, print)
});
},
'on': function(name, callback) {
var namedListeners = registerHandlers[name]
if (!namedListeners) {
registerHandlers[name] = namedListeners = []
}
namedListeners.push(callback);
return function() {
namedListeners[indexOf(namedListeners, callback)] = null
}
},
'off': function(name) {
delete registerHandlers[name];
}
}
}()
}());
/* window.bridge.post('test', {'key': 'value'}, (parameters, error)=>{ <# print parameters, error #> }); */
/* var unregisterHandler = window.bridge.on('userDidLogin', (parameters) => { <# receive notify from native #> } ); Call unregisterHandler() when cancel a listen. */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment