亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS中使用schema協議調用APP和使用iframe打開APP的例子

2019-10-21 18:57:54
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了iOS中使用schema協議調用APP和使用iframe打開APP的例子,用在瀏覽器中打開APP,需要的朋友可以參考下
 

在iOS中,需要調起一個app可以使用schema協議,這是iOS原生支持的,并且因為iOS系統中都不能使用自己的瀏覽器內核,所以所有的瀏覽器都支持,這跟android生態不一樣,android是可以自己搞內核的,但是iOS不行。

在iOS中提供了兩種在瀏覽器中打開APP的方法:Smart App Banner和schema協議。

Smart App Banner

即通過一個meta 標簽,在標簽上帶上app的信息,和打開后的行為,例如:app-id之類的,代碼形如:

復制代碼代碼如下:
<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">

具體可以看下開發文檔:https://developer.apple.com/library/ios/documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html
今天Smart APP Banner不是我們的主角,我們說的是schema

 

使用schema URL來打開iOS APP

schema類似自定義url協議,我們可以通過自定義的協議來打開自己的應用,形如:

復制代碼代碼如下:

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實際執行時間差,也是不靠譜的

最后附上研究的代碼,算是比較靠譜的方法了,雖然還是有一定的失?。ǖ谌綖g覽器pagehide和pageshow不觸發):

復制代碼代碼如下:

<p><button id="btn">點我點我啊!alert,不會彈出</button></p>
<p><button id="btn2">點我點我??!alert2,雖然有alert和info,info執行,但是alert不彈出</button></p>
<p><button id="btninfo">點我點我?。nfo可以</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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲精品激情久久| 国产精品一区=区| 中文字幕综合在线| 亚洲九九九在线观看| 日韩在线精品视频| 色黄久久久久久| 久久久精品免费| 欧美精品videosex极品1| 亚洲变态欧美另类捆绑| 中文日韩在线视频| 日韩av第一页| 久久91精品国产91久久久| 国语自产在线不卡| 岛国av在线不卡| 亚洲va久久久噜噜噜久久天堂| 午夜精品久久久久久久久久久久久| 久久综合五月天| 欧美激情国内偷拍| 国产精品永久免费视频| 91国产高清在线| 国语自产精品视频在线看| 爱福利视频一区| 亚洲欧美精品一区| 亚洲三级免费看| 国产精品久久久| 成人深夜直播免费观看| 国产91免费观看| 亚洲精品永久免费| 精品亚洲国产成av人片传媒| 日韩有码在线视频| 91免费看片在线| 国产精品爽黄69| 国产成人综合久久| 国产精品偷伦视频免费观看国产| 国产精品久久久久久久app| 色哟哟网站入口亚洲精品| 98精品国产高清在线xxxx天堂| 97精品在线观看| 国模精品一区二区三区色天香| 97国产精品人人爽人人做| 欧美性xxxxhd| 成人欧美一区二区三区黑人孕妇| 一区二区福利视频| 在线观看欧美www| 国产一区二区视频在线观看| 亚洲白虎美女被爆操| 色青青草原桃花久久综合| 色综合影院在线| 欧美日韩综合视频| 久久久国产精品视频| 在线观看国产精品淫| 国产在线精品自拍| 亚洲天堂男人天堂女人天堂| 亚洲精品aⅴ中文字幕乱码| 黑人狂躁日本妞一区二区三区| 国产精品久久久久999| 蜜月aⅴ免费一区二区三区| 亚洲欧美色图片| 久久久久久午夜| 久久夜色精品国产欧美乱| 日本一区二区在线免费播放| 欧美美最猛性xxxxxx| 69av成年福利视频| 国产精品自拍偷拍视频| 九九热精品在线| 黑丝美女久久久| 亚洲无亚洲人成网站77777| 欧美中文字幕在线视频| 国产日韩欧美在线视频观看| 91精品国产91久久久久久不卡| 欧美成人精品一区| 国产精品成人av性教育| 日韩av一区在线观看| 狠狠色狠色综合曰曰| 亚洲人高潮女人毛茸茸| 欧美人在线视频| 91视频8mav| 久久久国产精品免费| 亚洲图片欧美午夜| 秋霞午夜一区二区| 最近中文字幕2019免费| 欧美美女操人视频| 国产日韩欧美在线观看| 九九九久久久久久| 日韩电影在线观看中文字幕| 日韩国产精品一区| 成人精品久久一区二区三区| 日韩电影在线观看永久视频免费网站| 国产午夜精品美女视频明星a级| 欧美激情第1页| 一个人看的www久久| 日韩中文字幕免费视频| 欧美孕妇与黑人孕交| 欧美午夜影院在线视频| 国产精品爽爽爽爽爽爽在线观看| 欧美午夜宅男影院在线观看| 孩xxxx性bbbb欧美| 亚洲精品久久久久中文字幕二区| 欧美电影免费观看电视剧大全| 欧美日韩成人黄色| 日韩精品免费在线视频观看| 欧美成人午夜激情视频| 国产视频精品久久久| 午夜精品一区二区三区在线视| 亚洲一区二区三区四区在线播放| 久久伊人精品视频| 久久亚洲精品一区| 国产福利精品av综合导导航| 久久久精品视频在线观看| 成人午夜激情网| 成人欧美一区二区三区在线| 亚洲一区二区三区777| 尤物yw午夜国产精品视频明星| 亚洲社区在线观看| 国产精品观看在线亚洲人成网| 欧美性猛交xxxx乱大交极品| 亚洲欧美精品一区| 欧美激情亚洲自拍| 国产噜噜噜噜噜久久久久久久久| 亚洲国产精品人久久电影| 韩国精品美女www爽爽爽视频| 国内精品久久久久影院 日本资源| 欧美激情伊人电影| 亚洲欧美一区二区三区情侣bbw| 日韩在线欧美在线| 日韩电影中文字幕在线| 午夜精品一区二区三区视频免费看| 欧美有码在线观看视频| 欧美精品在线极品| 亚洲人成五月天| 亚洲人成欧美中文字幕| 2019国产精品自在线拍国产不卡| 久久久91精品| 国产精品成久久久久三级| 日韩一区在线视频| 精品av在线播放| 精品久久久久久久大神国产| 91在线播放国产| 亚洲欧美国产一本综合首页| 国产精品热视频| 81精品国产乱码久久久久久| 中文字幕综合在线| 亚洲自拍偷拍色片视频| 亚洲深夜福利网站| 成人福利视频在线观看| 在线播放日韩专区| 午夜精品三级视频福利| 亚洲欧美三级在线| 日韩国产中文字幕| 国产成人拍精品视频午夜网站| 精品国产一区二区三区久久| 欧美精品videosex极品1| 久久99青青精品免费观看| 欧美中文字幕视频在线观看| 成人久久久久久| 这里只有精品在线观看| 国产精品极品美女在线观看免费| 国产精品久久77777| 亚洲国产成人爱av在线播放| 92看片淫黄大片看国产片| 欧美夫妻性生活视频| 国产日韩欧美在线看| 91免费欧美精品| 在线精品高清中文字幕|