pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

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

這篇文章主要介紹了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實際執行時間差,也是不靠譜的

最后附上研究的代碼,算是比較靠譜的方法了,雖然還是有一定的失敗(第三方瀏覽器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實現文件對比的方法,主要是用到了filemanager,有需要的小伙伴可以參考下。
這篇文章主要給大家匯總了一下ios下移動文件方法,從簡單到復雜,十分的實用,有需要的小伙伴可以參考下。
本文給大家總結了幾則在IOS系統下刪除文件的代碼,十分的實用,有需要的小伙伴可以參考下。
本文給大家分享的是IOS開發中遇到的一個手風琴特效無法正常工作的問題的解決方法,經過度娘了很久才找到解決方法,這里推薦給大家,有需要的小伙伴可以參考下。
這篇文章主要介紹了iOS、Mac OS X系統中編程實現漢字轉拼音的方法(超級簡單),本文講解的方法不僅支持中文,還支持日文、韓文等,需要的朋友可以參考下
這篇文章主要分享了iOS7 毛玻璃特效代碼,非常的實用,做IOS開發的童鞋們不要錯過了
主站蜘蛛池模板: 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 高精度电阻回路测试仪-回路直流电阻测试仪-武汉特高压电力科技有限公司 | 真空干燥烘箱_鼓风干燥箱 _高低温恒温恒湿试验箱_光照二氧化碳恒温培养箱-上海航佩仪器 | 湿地保护| 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 单柱拉力机-橡胶冲片机-哑铃裁刀-江都轩宇试验机械厂 | 天空彩票天下彩,天空彩天空彩票免费资料,天空彩票与你同行开奖,天下彩正版资料大全 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 破碎机锤头_耐磨锤头_合金锤头-鼎成机械一站式耐磨铸件定制服务 微型驱动系统解决方案-深圳市兆威机电股份有限公司 | 新疆乌鲁木齐网站建设-乌鲁木齐网站制作设计-新疆远璨网络 | 挖掘机挖斗和铲斗生产厂家选择徐州崛起机械制造有限公司 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 钛合金标准件-钛合金螺丝-钛管件-钛合金棒-钛合金板-钛合金锻件-宝鸡远航钛业有限公司 | 小型UV打印机-UV平板打印机-大型uv打印机-UV打印机源头厂家 |松普集团 | 建筑资质代办_工程施工资质办理_资质代办公司_北京众聚企服 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 熔体泵|换网器|熔体齿轮泵|熔体计量泵厂家-郑州巴特熔体泵有限公司 | 波纹补偿器_不锈钢波纹补偿器_巩义市润达管道设备制造有限公司 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | GAST/BRIWATEC/CINCINNATI/KARL-KLEIN/ZIEHL-ABEGG风机|亚喜科技 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 生物除臭剂-除味剂-植物-污水除臭剂厂家-携葵环保有限公司 | 顺景erp系统_erp软件_erp软件系统_企业erp管理系统-广东顺景软件科技有限公司 | 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 防爆电机-高压防爆电机-ybx4电动机厂家-河南省南洋防爆电机有限公司 | 深圳公司注册-工商注册公司-千百顺代理记账公司 | 超声波焊接机_超音波熔接机_超声波塑焊机十大品牌_塑料超声波焊接设备厂家 | 临海涌泉蜜桔官网|涌泉蜜桔微商批发代理|涌泉蜜桔供应链|涌泉蜜桔一件代发 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 茶楼装修设计_茶馆室内设计效果图_云臻轩茶楼装饰公司 | 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 |