当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS中使用schema协议调用APP和使用iframe打开APP的例子分析

iOS中使用schema协议调用APP和使用iframe打开APP的例子分析

2018年09月30日  | 移动技术网IT编程  | 我要评论

日本时尚,视频安防监控系统,恶魔王子巧遇穷公主

这篇文章主要介绍了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 uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网