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

我们在开发 App 应用中,经常会遇到打开第三方程序的场景,比如打开手机淘宝、通过第三方浏览器打开一个 url 等等。

App不像网页可以使用http超链接互相跳转,但手机os设计了scheme机制,可以通过特殊的链接互相调起。

比如手机淘宝,其安装后会在手机os中会注册一个scheme协议,taobao://。

这种协议还支持参数,比如taobao://s.taobao.com/search?q=uni-app启动淘宝并打开搜索页面搜索uni-app。

在uni-app/5+App中,可以通过scheme呼起其他App,也支持给自己的App设置scheme参数。

这个功能小程序并不支持,属于App端的扩展API。

打开外部scheme的API是plus.runtime.openURL()。查看文档:http://www.html5plus.org/doc/zh_cn/runtime.html

打开第三方程序

打开第三方程序,我们需要使用 runtime 模块,下面我罗列两个相关的方法。其他操作请详读文档。

plus.runtime.openURL( url, errorCB, identity );  
  • url: ( String ) 必选 要打开的URL地址
    字符串类型,各平台支持的地址类型存在差异,参考平台URL支持表。

  • errorCB: ( OpenErrorCallback ) 可选 打开URL地址失败的回调
    打开指定URL地址失败时回调,并返回失败信息。

  • identity: ( String ) 可选 指定打开URL地址的程序名称
    在iOS平台此参数被忽略,在Android平台为程序包名,如果指定的包名不存在,则打开URL地址失败。

<template>  
       <view>  
           <button class="button" type="primary" @click="open(0)">使用第三方程序打开指定URL</button>  
       </view>  
   </template>  
<script>  
export default {  
   data() {  
       return {  
           url: 'https://uniapp.dcloud.io/'  
       };  
   },  
   onLoad(op) {},  
   methods: {  
       open(types) {  
               plus.runtime.openURL(this.url, function(res) {  
                   console.log(res);  
               });  
       }  
   }  
};  
</script>  

2,调用第三方程序

plus.runtime.launchApplication( appInf, errorCB );  
  • appInf: ( ApplicationInf ) 必选 要启动第三方程序的描述信息

  • errorCB: ( LaunchErrorCallback ) 必选 启动第三方程序操作失败的回调函数
    启动第三方程序失败时回调,并返回失败信息。

    <template>  
        <view>  
            <button class="button" type="primary" @click="launchApp">打开淘宝</button>  
        </view>  
    </template>  
<script>  
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);  
                });  
            }  

        }  
    }  
};  
</script>  

常用URLscheme

[  
    // 只在 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://'  
    }  
] 

更多实用例子

除了简单的打开App,我们更多的时候想要直达。这里汇总了很多有用的直达案例:

  • 使用应用商店打开指定App,可用于引导评分
  • 强制使用应用宝打开指定App
  • 打开淘宝搜索页面。需要你要做淘宝客,需要向淘宝申请自己的scheme参数并传入。
  • 打开地图并指定地点
  • 打开qq并到指定聊天界面,可用于客服
    具体代码见下:
<template>  
    <view>  
        <page-head title="通过scheme打开三方app示例"></page-head>  
        <button class="button" @click="openBrowser('https://uniapp.dcloud.io/h5')">使用浏览器打开指定URL</button>  
        <button class="button" @click="openMarket()">使用应用商店打开指定App</button>  
        <button class="button" @click="openMarket('com.tencent.android.qqdownloader')">强制使用应用宝打开指定App</button>  
        <button class="button" @click="openTaobao('taobao://s.taobao.com/search?q=uni-app')">打开淘宝搜索页面</button>  
        <button class="button" @click="openMap()">打开地图并指定地点</button>  
        <view class="uni-divider">  
            <view class="uni-divider__content">打开QQ</view>  
            <view class="uni-divider__line"></view>  
        </view>  
        <view class="uni-padding-wrap">  
            <form @submit="openQQ">  
                <view>  
                    <view class="uni-title">请输入聊天对象QQ号:</view>  
                    <view class="uni-list">  
                        <view class="uni-list-cell">  
                            <input class="uni-input" name="qqNum" type="number"/>  
                        </view>  
                    </view>  
                </view>  
                <view>  
                    <view class="uni-title">请选择QQ号类型:</view>  
                    <radio-group class="uni-flex" name="qqNumType">  
                        <label>  
                            <radio value="wpa" checked=""/>普通QQ号</label>  
                        <label>  
                            <radio value="crm" />营销QQ号(无需加好友直接聊天)</label>  
                    </radio-group>  
                </view>  
                <view class="uni-btn-v uni-common-mt">  
                    <button class="button" formType="submit">打开qq并到指定聊天界面</button>  
                </view>  
            </form>  
        </view>  
    </view>  
</template>  

<script>  
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&title=DCloud&src=Hello%20uni-app";  
                var urlAmap = "androidamap://viewMap?sourceApplication=Hello%20uni-app&poiname=DCloud&lat=39.9631018208&lon=116.3406135236&dev=0"  
                if (hasAmap && 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->distribute->apple->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&ll=39.96310,116.340698&spn=0.008766,0.019441";  
                            break;  
                        case 2:  
                            url = "baidumap://map/marker?location=39.968789,116.347247&title=DCloud&src=Hello%20uni-app";  
                            break;  
                        case 3:  
                            url = "iosamap://viewMap?sourceApplication=Hello%20uni-app&poiname=DCloud&lat=39.9631018208&lon=116.3406135236&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 + '&uin=' + e.detail.value.qqNum,function (res) {  
                plus.nativeUI.alert("本机没有安装QQ,无法启动");  
            });  
        }  
    }  
};  
</script>  
<style>  
.button {  
    margin: 30upx;  
    color: #007AFF;  
}  
</style>  

给自己的App设置scheme

可在manifest中可配置。

Android配置方法
iOS配置方法

转载于:https://www.cnblogs.com/neo-java/p/11305711.html

### 如何在 UniApp 中使用 `uni-app-qrcode` 插件生成二维码 #### 插件概述 `uni-app-qrcode` 是一个基于 UniApp 框架的插件,主要用于生成和扫描二维码。它提供了简单易用的功能接口来满足应用中常见的二维码需求[^1]。 --- #### 主要功能 该插件的核心功能包括但不限于以下几点: - **生成二维码**:通过指定内容字符串生成对应的二维码图片。 - **自定义尺寸**:允许设置二维码的高度和宽度参数(单位为 rpx),从而适应不同的显示需求。 - **跨平台兼容**:由于其基于 UniApp 开发框架,因此能够在 H5、小程序以及 App 等多端环境中正常工作。 --- #### API 接口说明 以下是 `uni-app-qrcode` 提供的关键方法及其参数解释: ```javascript function qrcode(id, code, width, height); ``` | 参数名 | 类型 | 含义 | |--------|--------|----------------------------------------------------------------------| | id | String | WXML 文件中的 Canvas 组件唯一标识符 | | code | String | 要编码成二维码的具体数据内容 | | width | Number | 输出二维码图像的宽度(rpx 单位) | | height | Number | 输出二维码图像的高度(rpx 单位),通常建议宽高比例保持一致 | 此函数会根据传入的数据动态渲染到页面上的 `<canvas>` 元素上形成可视化的二维条码图形。 --- #### 实现步骤详解 ##### 页面结构设计 (WXML 部分) 首先,在目标 Vue 文件内的模板区域添加必要的视图容器与画布组件实例化声明如下所示代码片段即可完成基础布局搭建工作: ```html <view class="container"> <!-- 显示区 --> <image v-if="qrCodeUrl" :src="qrCodeUrl" mode="aspectFit"></image> <!-- canvas 容器 --> <canvas style="display:none;" canvas-id="myQrcodeCanvas"></canvas> <!-- 输入框 --> <input type="text" placeholder="请输入需要转换为二维码的文字..." @confirm="generateQRCode"/> </view> ``` 上述代码实现了三个主要部分: 1. 展示最终生成好的二维码图案; 2. 创建隐藏状态下的绘图空间(canvas),作为实际绘制载体; 3. 用户输入待转化文本字段入口,并绑定触发事件处理器以便后续调用逻辑处理流程[^2]. --- ##### JavaScript 方法编写 接着,在脚本区块里引入所需依赖库并实现核心业务逻辑: ```javascript import QRCode from '@/utils/qrcode.js'; // 假设已下载好对应工具类文件放置于 utils 目录下 export default { data() { return { qrCodeUrl: '' // 存储生成后的二维码链接地址 } }, methods:{ generateQRCode(e){ const content = e.detail.value; // 获取用户填写的信息 if(!content.trim()){ uni.showToast({title:'不能为空',icon:"none"}); return; } try{ let options={ id:'myQrcodeCanvas', code:content, width:400, height:400 }; this.qrCodeUrl=QRCode.qrcode(options); // 调用静态方法执行具体操作过程 console.log('成功生成:',this.qrCodeUrl); }catch(err){ console.error('发生错误:',err.message); uni.showToast({title:`${err.message}`,icon:"error"}); } } } } ``` 这里我们完成了几个重要动作: - 导入外部辅助模块以简化内部复杂度管理. - 设置初始变量用来记录最新一次有效产出成果位置信息方便随时访问查阅. - 编写响应式交互行为当检测到键盘回车键按下时自动启动整个制作环节直至结束反馈给前端界面呈现出来. 注意这里的 `qrcode()` 函数返回的是 base64 格式的 URI 字符串可以直接赋值给 image src 属性加载展示^. --- #### 注意事项 为了确保最佳体验效果,请遵循以下指导原则: - 如果计划部署至生产环境前务必确认所使用的第三方资源均已合法授权许可范围之内以免引发版权纠纷等问题. - 对于某些特殊字符集可能存在的潜在兼容性隐患提前做好充分测试验证工作减少后期维护成本投入. - 当涉及到敏感隐私资料传输加密保护措施不可忽视任何细节之处严格把控安全关口防线稳固可靠. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值