在IOS中,需求調起一個app可以運用schema協議,這是IOS原生支持的,並且由於IOS零碎中都不能運用自己的閱讀器內核,所以一切的閱讀器都支持,這跟Android生態不一樣,Android是可以自己搞內核的,但是iOS不行。
在iOS中提供了兩種在閱讀器中翻開APP的辦法:Smart App Banner和schema協議。
Smart App Banner
即經過一個meta 標簽,在標簽上帶上app的信息,和翻開後的行為,例如:app-id之類的,代碼形如:
myapplink://
# 例如 facebook的
fb://
# itunes的
itms-apps://
# 還有短信也是相似的
sms://
假如要翻開一個app,最復雜的方式是經過一個鏈接,如我們在html中這樣寫:
<a href="myapplink://">翻開我的app</a>
當用戶點擊鏈接的時分就可以翻開對應的app。
綁定click事情
但是實踐中我們更多的狀況是綁定事情,比方做個彈層啥的,不能一味的用a標簽啊,所以可以經過兩種方式來處理:location.href和iframe。
iframe的方式是開發中常用的,但是他也有一些問題:
1.我們沒很好的方式來判別能否翻開了app
2.會惹起history變化
3.由於惹起history變化,所以一些webview會有問題,比方:我查查,翻開一個頁面,假如有iframe,選擇在safari中翻開,實踐翻開的是iframe的頁面
4.假如頁面暴漏給了Android零碎,那麼也會呈現頁面打不開,之類的問題
5.假如沒有app,調起不成功,ios的safari會自己彈出一個對話框:打不開網址之類的提示
所以如今的問題是:如何知道iframe曾經翻開了某個app,即處理iframe翻開app回調。
運用iframe在iOS零碎中翻開app
聰明的你能夠想到了,iframe的onload事情啊,可是遺憾的說,有效!所以我們找到了定時器(setTimeout),經過一個定時器,假如在一段時間內(比方500ms),當點擊了按鈕(記載time1),頁面沒有切走(調起app之後,頁面進程會被中綴),進程中綴,那麼計時器也會中綴,這時分應該不會觸發timer,假如調起失敗,那麼timer會就觸發,我們判別下在一定時間內假如頁面沒有被切走,就以為調起失敗。
另外經過timer觸發時分的timer2,做差,判別能否太離譜了(切走了之後的時間應該比timer實踐定時的500ms要長):
function openIos(url, callback) {
if (!url) {
return;
}
var node = document.createElement('iframe');
node.style.display = 'none';
var body = document.body;
var timer;
var clear = function(evt, isTimeout) {
(typeof callback==='function') && callback(isTimeout);
if (!node) {
return;
}
node.onload = null;
body.removeChild(node);
node = null;
};
var hide = function(e){
clearTimeout(timer);
clear(e, false);
};
node.onload = clear;
node.src = url;
body.appendChild(node);
var now = +new Date();
//假如事情失敗,則1秒設置為空
timer = setTimeout(function(){
var newTime = +new Date();
if(now-newTime>600){
//由於切走了,在切回來需求耗費時間
//所以timer即便執行了,但是兩者的時間差應該跟500ms有較大的出入
//但是實踐並不是這樣的!
clear(null, false);
}else{
clear(null, true);
}
}, 500);
}
看上去辦法很靠譜,但是理想總是那麼的嚴酷!
不同的閱讀器app(包括webview),都有自己在後台的常駐時間,即:假設一個閱讀器他在被切走之後,後台常駐10s,那麼我們設置定時器5s過時就是白費的,而且5s的定時器,用戶要空等5s!交互也不讓你這樣干啊!
最後我們想到了pageshow和pagehide事情,即假如閱讀器被切走到了要翻開的app,應該會觸發閱讀器的pagehide事情,而從app重新前往到閱讀器,就會觸發pageshow辦法。
但是經過代碼測試發現,在uc、chrome中,不會觸發pagehide和pageshow的辦法,而在safari中可以的。
結論:
1.運用iframe調用schema URL
2.運用定時器判別在一段時間內能否調起成功
3.運用pageshow和pagehide來輔佐定時器做更詳細的判別
4.定時器中假如有alert能夠不會被彈出,這一點很吃驚!前面的dom居然5.執行了,但是alert沒彈出,能夠跟alert的完成有關系吧
6.在實驗中我運用了兩個定時器,是由於切回閱讀器之後,有時分timeout觸發要在pagehide和pageshow之前
7.計算timer實踐執行時間差,也是不靠譜的
最後附上研討的代碼,算是比擬靠譜的辦法了,雖然還是有一定的失敗(第三方閱讀器pagehide和pageshow不觸發):
<p><button id="btn">點我點我啊!alert,不會彈出</button></p>
<p><button id="btn2">點我點我啊!alert2,雖然有alert和info,info執行,但是alert不彈出</button></p>
<p><button id="btninfo">點我點我啊!info可以</button></p>
$(function(){
var $info = $('#info');
function info(msg){
var p = $('<p>'+msg+'</p>');
$info.append(p);
}
$('#btn').on('click', function(){
openIos('baiduboxapp://', function(t){
if(t){
alert('timeout or no baidu APP');
}else{
alert('invoke success');
}
});
});
$('#btn2').on('click', function(){
openIos('baiduboxapp://', function(t){
if(t){
info('timeout or no baidu APP2');
alert('timeout or no baidu APP2');
}else{
info('invoke success2');
alert('invoke success2');
}
});
});
$('#btninfo').on('click', function(){
openIos('baiduboxapp://', function(t){
if(t){
info('timeout or no baidu APP');
}else{
info('invoke success');
}
});
});
});
function openIos(url, callback) {
if (!url) {
return;
}
var node = document.createElement('iframe');
node.style.display = 'none';
var body = document.body;
var timer;
var clear = function(evt, isTimeout) {
(typeof callback==='function') && callback(isTimeout);
Window.removeEventListener('pagehide', hide, true);
Window.removeEventListener('pageshow', hide, true);
if (!node) {
return;
}
node.onload = null;
body.removeChild(node);
node = null;
};
var hide = function(e){
clearTimeout(timer);
clear(e, false);
};
Window.addEventListener('pagehide', hide, true);
window.addEventListener('pageshow', hide, true);
node.onload = clear;
node.src = url;
body.appendChild(node);
var now = +new Date();
//假如事情失敗,則1秒設置為空
timer = setTimeout(function(){
timer = setTimeout(function(){
var newTime = +new Date();
if(now-newTime>1300){
clear(null, false);
}else{
clear(null, true);
}
}, 1200);
}, 60);
}
【iOS中運用schema協議調用APP和運用iframe翻開APP的例子】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!