最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS中使用schema協(xié)議調(diào)用APP和使用iframe打開APP的例子

 更新時(shí)間:2014年08月28日 08:48:54   投稿:junjie  
這篇文章主要介紹了iOS中使用schema協(xié)議調(diào)用APP和使用iframe打開APP的例子,用在瀏覽器中打開APP,需要的朋友可以參考下

在iOS中,需要調(diào)起一個(gè)app可以使用schema協(xié)議,這是iOS原生支持的,并且因?yàn)閕OS系統(tǒng)中都不能使用自己的瀏覽器內(nèi)核,所以所有的瀏覽器都支持,這跟android生態(tài)不一樣,android是可以自己搞內(nèi)核的,但是iOS不行。

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

Smart App Banner

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

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

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

使用schema URL來打開iOS APP

schema類似自定義url協(xié)議,我們可以通過自定義的協(xié)議來打開自己的應(yīng)用,形如:

復(fù)制代碼 代碼如下:

myapplink://
# 例如 facebook的
fb://
# itunes的
itms-apps://
# 還有短信也是類似的
sms://

如果要打開一個(gè)app,最簡(jiǎn)單的方式是通過一個(gè)鏈接,如我們?cè)趆tml中這樣寫:
復(fù)制代碼 代碼如下:

<a href="myapplink://">打開我的app</a>

當(dāng)用戶點(diǎn)擊鏈接的時(shí)候就可以打開對(duì)應(yīng)的app。

綁定click事件

但是實(shí)際中我們更多的情況是綁定事件,比如做個(gè)彈層啥的,不能一味的用a標(biāo)簽啊,所以可以通過兩種方式來解決:location.href和iframe。

iframe的方式是開發(fā)中常用的,但是他也有一些問題:

1.我們沒很好的方式來判斷是否打開了app
2.會(huì)引起history變化
3.因?yàn)橐餳istory變化,所以一些webview會(huì)有問題,比如:我查查,打開一個(gè)頁面,如果有iframe,選擇在safari中打開,實(shí)際打開的是iframe的頁面
4.如果頁面暴漏給了android系統(tǒng),那么也會(huì)出現(xiàn)頁面打不開,之類的問題
5.如果沒有app,調(diào)起不成功,ios的safari會(huì)自己彈出一個(gè)對(duì)話框:打不開網(wǎng)址之類的提示

所以現(xiàn)在的問題是:如何知道iframe已經(jīng)打開了某個(gè)app,即解決iframe打開app回調(diào)。

使用iframe在iOS系統(tǒng)中打開app

聰明的你可能想到了,iframe的onload事件啊,可是遺憾的說,無效!所以我們找到了定時(shí)器(setTimeout),通過一個(gè)定時(shí)器,如果在一段時(shí)間內(nèi)(比如500ms),當(dāng)點(diǎn)擊了按鈕(記錄time1),頁面沒有切走(調(diào)起app之后,頁面進(jìn)程會(huì)被中斷),進(jìn)程中斷,那么計(jì)時(shí)器也會(huì)中斷,這時(shí)候應(yīng)該不會(huì)觸發(fā)timer,如果調(diào)起失敗,那么timer會(huì)就觸發(fā),我們判斷下在一定時(shí)間內(nèi)如果頁面沒有被切走,就認(rèn)為調(diào)起失敗。

另外通過timer觸發(fā)時(shí)候的timer2,做差,判斷是否太離譜了(切走了之后的時(shí)間應(yīng)該比timer實(shí)際定時(shí)的500ms要長(zhǎng)):

復(fù)制代碼 代碼如下:

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秒設(shè)置為空
    timer = setTimeout(function(){
        var newTime = +new Date();
          if(now-newTime>600){
            //因?yàn)榍凶吡?,在切回來需要消耗時(shí)間
            //所以timer即使執(zhí)行了,但是兩者的時(shí)間差應(yīng)該跟500ms有較大的出入
            //但是實(shí)際并不是這樣的!
            clear(null, false);
          }else{
            clear(null, true);
          }
    }, 500);
}

看上去方法很靠譜,但是現(xiàn)實(shí)總是那么的殘酷!

不同的瀏覽器app(包括webview),都有自己在后臺(tái)的常駐時(shí)間,即:假如一個(gè)瀏覽器他在被切走之后,后臺(tái)常駐10s,那么我們?cè)O(shè)置定時(shí)器5s過期就是徒勞的,而且5s的定時(shí)器,用戶要空等5s!交互也不讓你這樣干啊!

最后我們想到了pageshow和pagehide事件,即如果瀏覽器被切走到了要打開的app,應(yīng)該會(huì)觸發(fā)瀏覽器的pagehide事件,而從app重新返回到瀏覽器,就會(huì)觸發(fā)pageshow方法。

但是經(jīng)過代碼測(cè)試發(fā)現(xiàn),在uc、chrome中,不會(huì)觸發(fā)pagehide和pageshow的方法,而在safari中可以的。

結(jié)論:

1.使用iframe調(diào)用schema URL
2.使用定時(shí)器判斷在一段時(shí)間內(nèi)是否調(diào)起成功
3.使用pageshow和pagehide來輔助定時(shí)器做更詳細(xì)的判斷
4.定時(shí)器中如果有alert可能不會(huì)被彈出,這一點(diǎn)很吃驚!后面的dom竟然5.執(zhí)行了,但是alert沒彈出,可能跟alert的實(shí)現(xiàn)有關(guān)系吧
6.在實(shí)驗(yàn)中我使用了兩個(gè)定時(shí)器,是因?yàn)榍谢貫g覽器之后,有時(shí)候timeout觸發(fā)要在pagehide和pageshow之前
7.計(jì)算timer實(shí)際執(zhí)行時(shí)間差,也是不靠譜的

最后附上研究的代碼,算是比較靠譜的方法了,雖然還是有一定的失敗(第三方瀏覽器pagehide和pageshow不觸發(fā)):

復(fù)制代碼 代碼如下:

<p><button id="btn">點(diǎn)我點(diǎn)我??!alert,不會(huì)彈出</button></p>
<p><button id="btn2">點(diǎn)我點(diǎn)我?。lert2,雖然有alert和info,info執(zhí)行,但是alert不彈出</button></p>
<p><button id="btninfo">點(diǎn)我點(diǎn)我啊!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秒設(shè)置為空
    timer = setTimeout(function(){
        timer = setTimeout(function(){
          var newTime = +new Date();
          if(now-newTime>1300){
            clear(null, false);
          }else{
            clear(null, true);
          }

        }, 1200);
    }, 60);
}

相關(guān)文章

  • iOS實(shí)現(xiàn)設(shè)備判斷是否安裝相關(guān)地圖(百度、高德等)

    iOS實(shí)現(xiàn)設(shè)備判斷是否安裝相關(guān)地圖(百度、高德等)

    這篇文章主要給大家介紹了關(guān)于iOS如何實(shí)現(xiàn)設(shè)備判斷是否安裝相關(guān)地圖,比如百度、高德等,其實(shí)實(shí)現(xiàn)的方法還是很簡(jiǎn)單,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友下面來一起看看吧。
    2018-01-01
  • IOS UIImagePickerController從拍照、圖庫、相冊(cè)獲取圖片

    IOS UIImagePickerController從拍照、圖庫、相冊(cè)獲取圖片

    這篇文章主要介紹了IOS UIImagePickerController從拍照、圖庫、相冊(cè)獲取圖片的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • ios電子書翻頁效果代碼詳解

    ios電子書翻頁效果代碼詳解

    這篇文章主要介紹了ios電子書翻頁效果代碼實(shí)現(xiàn)過程以及對(duì)應(yīng)的代碼講解,有需要的朋友參考下。
    2018-02-02
  • 判斷iPhone的WiFi是否打開的兩種方法

    判斷iPhone的WiFi是否打開的兩種方法

    大家都知道判斷WiFi是否連接可以使用Reachability進(jìn)行判斷,那么wifi是否打開應(yīng)該怎么判斷呢?下面小編給大家分享兩種完全基于不同思路的方法,需要的朋友參考下
    2016-11-11
  • iOS消息發(fā)送和轉(zhuǎn)發(fā)示例詳解

    iOS消息發(fā)送和轉(zhuǎn)發(fā)示例詳解

    這篇文章主要給大家介紹了關(guān)于iOS消息發(fā)送和轉(zhuǎn)發(fā)的相關(guān)資料,用Objective-C的術(shù)語來講,這叫做“給某個(gè)對(duì)象發(fā)送某條消息”。文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • iOS使用WKWebView加載HTML5不顯示屏幕寬度的問題解決

    iOS使用WKWebView加載HTML5不顯示屏幕寬度的問題解決

    這篇文章主要介紹了iOS使用WKWebView加載HTML5不顯示屏幕寬度的問題解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • iOS App項(xiàng)目中引入SQLite數(shù)據(jù)庫的教程

    iOS App項(xiàng)目中引入SQLite數(shù)據(jù)庫的教程

    SQLite是一個(gè)極輕的嵌入式數(shù)據(jù)庫,在應(yīng)用程序中捆綁使用可以更方便地幫助操控關(guān)系型數(shù)據(jù),這里我們就來看一下iOS App項(xiàng)目中引入SQLite數(shù)據(jù)庫的教程
    2016-06-06
  • iOS中修改UITextField占位符字體顏色的方法總結(jié)

    iOS中修改UITextField占位符字體顏色的方法總結(jié)

    這篇文章給大家分享了iOS中修改UITextField占位符字體顏色的三個(gè)方法,分別是使用attributedPlaceholder屬性、重寫drawPlaceholderInRect方法和修改UITextField內(nèi)部placeholderLaber的顏色,下面我們一起來看看詳細(xì)的方法介紹。
    2016-09-09
  • 解決iOS下無法觸發(fā)focus事件的問題

    解決iOS下無法觸發(fā)focus事件的問題

    今天小編就為大家分享一篇解決iOS下無法觸發(fā)focus事件的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • iOS開發(fā)中常用的各種動(dòng)畫、頁面切面效果

    iOS開發(fā)中常用的各種動(dòng)畫、頁面切面效果

    這篇文章主要介紹了iOS開發(fā)中常用的各種動(dòng)畫、頁面切面效果 的相關(guān)資料,需要的朋友可以參考下
    2016-04-04

最新評(píng)論

稷山县| 桓台县| 丰镇市| 静海县| 东兴市| 宽甸| 伽师县| 营口市| 大庆市| 庆云县| 博罗县| 金寨县| 文安县| 咸阳市| 鄂托克前旗| 交口县| 应城市| 文化| 镇巴县| 若尔盖县| 陵川县| 涞源县| 南宫市| 象州县| 弥勒县| 喀什市| 黎平县| 蓬溪县| 鄂托克旗| 富平县| 阜平县| 闽侯县| 垣曲县| 车险| 崇礼县| 肥城市| 台东市| 南安市| 铜鼓县| 平潭县| 大荔县|