互评 發表於 2019-8-5 21:39:00

【uniapp 开发】uni-app 中如何打开外部应用

<p>我们在开发 App 应用中,经常会遇到打开第三方程序的场景,比如打开手机淘宝、通过第三方浏览器打开一个 url 等等。</p>
<p>App不像网页可以使用http超链接互相跳转,但手机os设计了scheme机制,可以通过特殊的链接互相调起。</p>
<p>比如手机淘宝,其安装后会在手机os中会注册一个scheme协议,taobao://。</p>
<p>这种协议还支持参数,比如taobao://s.taobao.com/search?q=uni-app启动淘宝并打开搜索页面搜索uni-app。</p>
<p>在uni-app/5+App中,可以通过scheme呼起其他App,也支持给自己的App设置scheme参数。</p>
<p>这个功能小程序并不支持,属于App端的扩展API。</p>
<p>打开外部scheme的API是plus.runtime.openURL()。查看文档:http://www.html5plus.org/doc/zh_cn/runtime.html</p>
<h2 id="打开第三方程序">打开第三方程序</h2>
<p>打开第三方程序,我们需要使用 runtime 模块,下面我罗列两个相关的方法。其他操作请详读文档。</p>
<pre><code>plus.runtime.openURL( url, errorCB, identity );
</code></pre>
<ul>
<li>
<p>url: ( String ) 必选 要打开的URL地址<br>
字符串类型,各平台支持的地址类型存在差异,参考平台URL支持表。</p>
</li>
<li>
<p>errorCB: ( OpenErrorCallback ) 可选 打开URL地址失败的回调<br>
打开指定URL地址失败时回调,并返回失败信息。</p>
</li>
<li>
<p>identity: ( String ) 可选 指定打开URL地址的程序名称<br>
在iOS平台此参数被忽略,在Android平台为程序包名,如果指定的包名不存在,则打开URL地址失败。</p>
</li>
</ul>
<pre><code>&lt;template&gt;
       &lt;view&gt;
         &lt;button class="button" type="primary" @click="open(0)"&gt;使用第三方程序打开指定URL&lt;/button&gt;
       &lt;/view&gt;
   &lt;/template&gt;
</code></pre>
<pre><code>&lt;script&gt;
export default {
   data() {
       return {
         url: 'https://uniapp.dcloud.io/'
       };
   },
   onLoad(op) {},
   methods: {
       open(types) {
               plus.runtime.openURL(this.url, function(res) {
                   console.log(res);
               });
       }
   }
};
&lt;/script&gt;
</code></pre>
<p>2,调用第三方程序</p>
<pre><code>plus.runtime.launchApplication( appInf, errorCB );
</code></pre>
<ul>
<li>
<p>appInf: ( ApplicationInf ) 必选 要启动第三方程序的描述信息</p>
</li>
<li>
<p>errorCB: ( LaunchErrorCallback ) 必选 启动第三方程序操作失败的回调函数<br>
启动第三方程序失败时回调,并返回失败信息。</p>
</li>
</ul>
<pre><code>    &lt;template&gt;
      &lt;view&gt;
            &lt;button class="button" type="primary" @click="launchApp"&gt;打开淘宝&lt;/button&gt;
      &lt;/view&gt;
    &lt;/template&gt;
</code></pre>
<pre><code>&lt;script&gt;
export default {
    data() {
      return {
            url: 'https://uniapp.dcloud.io/'
      };
    },
    onLoad(op) {},
    methods: {
      launchApp() {
            let _this = this;
            // 判断平台
            if (plus.os.name == 'Android') {
                plus.runtime.launchApplication(
                  {
                        pname: 'com.taobao.taobao'
                  },
                  function(e) {
                        console.log('Open system default browser failed: ' + e.message);
                  }
                );
            } else if (plus.os.name == 'iOS') {
                plus.runtime.launchApplication({ action: 'taobao://' }, function(e) {
                  console.log('Open system default browser failed: ' + e.message);
                });
            }

      }
    }
};
&lt;/script&gt;
</code></pre>
<h2 id="常用urlscheme">常用URLscheme</h2>
<pre><code>[
    // 只在 ios 中生效
    {
      name: 'App Store',
      scheme: 'itms-apps://'
    },
    {
      name: '支付宝',
      pname: 'com.eg.android.AlipayGphone',
      scheme: 'alipay://'
    },
    {
      name: '淘宝',
      pname: 'com.taobao.taobao',
      scheme: 'taobao://'
    },
    {
      name: 'QQ',
      pname: 'com.tencent.mobileqq',
      scheme: 'mqq://'
    },
    {
      name: '微信',
      pname: 'com.tencent.mm',
      scheme: 'weixin://'
    },
    {
      name: '京东',
      pname: 'com.jingdong.app.mall',
      scheme: 'openApp.jdMobile://'
    },
    {
      name: '新浪微博',
      pname: 'com.sina.weibo',
      scheme: 'sinaweibo://'
    },
    {
      name: '优酷',
      pname: 'com.youku.phone',
      scheme: 'youku://'
    }
]
</code></pre>
<h2 id="更多实用例子">更多实用例子</h2>
<p>除了简单的打开App,我们更多的时候想要直达。这里汇总了很多有用的直达案例:</p>
<ul>
<li>使用应用商店打开指定App,可用于引导评分</li>
<li>强制使用应用宝打开指定App</li>
<li>打开淘宝搜索页面。需要你要做淘宝客,需要向淘宝申请自己的scheme参数并传入。</li>
<li>打开地图并指定地点</li>
<li>打开qq并到指定聊天界面,可用于客服<br>
具体代码见下:</li>
</ul>
<pre><code>&lt;template&gt;
    &lt;view&gt;
      &lt;page-head title="通过scheme打开三方app示例"&gt;&lt;/page-head&gt;
      &lt;button class="button" @click="openBrowser('https://uniapp.dcloud.io/h5')"&gt;使用浏览器打开指定URL&lt;/button&gt;
      &lt;button class="button" @click="openMarket()"&gt;使用应用商店打开指定App&lt;/button&gt;
      &lt;button class="button" @click="openMarket('com.tencent.android.qqdownloader')"&gt;强制使用应用宝打开指定App&lt;/button&gt;
      &lt;button class="button" @click="openTaobao('taobao://s.taobao.com/search?q=uni-app')"&gt;打开淘宝搜索页面&lt;/button&gt;
      &lt;button class="button" @click="openMap()"&gt;打开地图并指定地点&lt;/button&gt;
      &lt;view class="uni-divider"&gt;
            &lt;view class="uni-divider__content"&gt;打开QQ&lt;/view&gt;
            &lt;view class="uni-divider__line"&gt;&lt;/view&gt;
      &lt;/view&gt;
      &lt;view class="uni-padding-wrap"&gt;
            &lt;form @submit="openQQ"&gt;
                &lt;view&gt;
                  &lt;view class="uni-title"&gt;请输入聊天对象QQ号:&lt;/view&gt;
                  &lt;view class="uni-list"&gt;
                        &lt;view class="uni-list-cell"&gt;
                            &lt;input class="uni-input" name="qqNum" type="number"/&gt;
                        &lt;/view&gt;
                  &lt;/view&gt;
                &lt;/view&gt;
                &lt;view&gt;
                  &lt;view class="uni-title"&gt;请选择QQ号类型:&lt;/view&gt;
                  &lt;radio-group class="uni-flex" name="qqNumType"&gt;
                        &lt;label&gt;
                            &lt;radio value="wpa" checked=""/&gt;普通QQ号&lt;/label&gt;
                        &lt;label&gt;
                            &lt;radio value="crm" /&gt;营销QQ号(无需加好友直接聊天)&lt;/label&gt;
                  &lt;/radio-group&gt;
                &lt;/view&gt;
                &lt;view class="uni-btn-v uni-common-mt"&gt;
                  &lt;button class="button" formType="submit"&gt;打开qq并到指定聊天界面&lt;/button&gt;
                &lt;/view&gt;
            &lt;/form&gt;
      &lt;/view&gt;
    &lt;/view&gt;
&lt;/template&gt;

&lt;script&gt;
export default {
    data() {
      return {

      };
    },
    methods: {
      openBrowser(url){
            plus.runtime.openURL(url)
      },
      openMarket(marketPackageName) {
            var appurl;
            if (plus.os.name=="Android") {
                appurl = "market://details?id=io.dcloud.HelloH5"; //由于hello uni-app没有上Android应用商店,所以此处打开了另一个示例应用
            }
            else{
                appurl = "itms-apps://itunes.apple.com/cn/app/hello-uni-app/id1417078253?mt=8";
            }
            if (typeof(marketPackageName)=="undefined") {
                plus.runtime.openURL(appurl, function(res) {
                  console.log(res);
                });
            } else{//强制指定某个Android应用市场的包名,通过这个包名启动指定app
                if (plus.os.name=="Android") {
                  plus.runtime.openURL(appurl, function(res) {
                        plus.nativeUI.alert("本机没有安装应用宝");
                  },marketPackageName);
                } else{
                  plus.nativeUI.alert("仅Android手机才支持应用宝");
                }
            }
      },
      openTaobao(url){
            plus.runtime.openURL(url, function(res) {
                uni.showModal({
                  content:"本机未检测到淘宝客户端,是否打开浏览器访问淘宝?",
                  success:function(res){
                        if (res.confirm) {
                            plus.runtime.openURL("https://s.taobao.com/search?q=uni-app")
                        }
                  }
                })
            });
      },
      openMap(){
            var url = "";
            if (plus.os.name=="Android") {
                var hasBaiduMap = plus.runtime.isApplicationExist({pname:'com.baidu.BaiduMap',action:'baidumap://'});
                var hasAmap = plus.runtime.isApplicationExist({pname:'com.autonavi.minimap',action:'androidamap://'});
                var urlBaiduMap = "baidumap://map/marker?location=39.968789,116.347247&amp;title=DCloud&amp;src=Hello%20uni-app";
                var urlAmap = "androidamap://viewMap?sourceApplication=Hello%20uni-app&amp;poiname=DCloud&amp;lat=39.9631018208&amp;lon=116.3406135236&amp;dev=0"
                if (hasAmap &amp;&amp; hasBaiduMap) {
                  plus.nativeUI.actionSheet({title:"选择地图应用",cancel:"取消",buttons:[{title:"百度地图"},{title:"高德地图"}]}, function(e){
                        switch (e.index){
                            case 1:
                              plus.runtime.openURL(urlBaiduMap);
                              break;
                            case 2:
                              plus.runtime.openURL(urlAmap);
                              break;
                        }
                  })
                }
                else if (hasAmap) {
                  plus.runtime.openURL(urlAmap);
                }
                else if (hasBaiduMap) {
                  plus.runtime.openURL(urlBaiduMap);
                }
                else{
                  url = "geo:39.96310,116.340698?q=%e6%95%b0%e5%ad%97%e5%a4%a9%e5%a0%82";
                  plus.runtime.openURL(url); //如果是国外应用,应该优先使用这个,会启动google地图。这个接口不能统一坐标系,进入百度地图时会有偏差
                }
            } else{
                // iOS上获取本机是否安装了百度高德地图,需要在manifest里配置,在manifest.json文件app-plus-&gt;distribute-&gt;apple-&gt;urlschemewhitelist节点下添加(如urlschemewhitelist:["iosamap","baidumap"])
                plus.nativeUI.actionSheet({title:"选择地图应用",cancel:"取消",buttons:[{title:"Apple地图"},{title:"百度地图"},{title:"高德地图"}]}, function(e){
                  console.log("e.index: " + e.index);
                  switch (e.index){
                        case 1:
                            url = "http://maps.apple.com/?q=%e6%95%b0%e5%ad%97%e5%a4%a9%e5%a0%82&amp;ll=39.96310,116.340698&amp;spn=0.008766,0.019441";
                            break;
                        case 2:
                            url = "baidumap://map/marker?location=39.968789,116.347247&amp;title=DCloud&amp;src=Hello%20uni-app";
                            break;
                        case 3:
                            url = "iosamap://viewMap?sourceApplication=Hello%20uni-app&amp;poiname=DCloud&amp;lat=39.9631018208&amp;lon=116.3406135236&amp;dev=0";
                            break;
                        default:
                            break;
                  }
                  if (url!="") {
                        plus.runtime.openURL( url, function( e ) {
                            plus.nativeUI.alert("本机未安装指定的地图应用");
                        });
                  }
                })
            }
      },
      openQQ: function (e) {
            // console.log("e.detail.value: " + JSON.stringify(e.detail.value));
            // 没有校验qq号是否为空或合法数字,如果不是可用的qq号,启动qq后会停留在qq主界面
            plus.runtime.openURL('mqqwpa://im/chat?chat_type=' + e.detail.value.qqNumType + '&amp;uin=' + e.detail.value.qqNum,function (res) {
                plus.nativeUI.alert("本机没有安装QQ,无法启动");
            });
      }
    }
};
&lt;/script&gt;
&lt;style&gt;
.button {
    margin: 30upx;
    color: #007AFF;
}
&lt;/style&gt;
</code></pre>
<h2 id="给自己的app设置scheme">给自己的App设置scheme</h2>
<p>可在manifest中可配置。</p>
<p>Android配置方法<br>
iOS配置方法</p><br><br>
来源:https://www.cnblogs.com/neo-java/p/11305711.html
頁: [1]
查看完整版本: 【uniapp 开发】uni-app 中如何打开外部应用