我们在开发 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 模块,下面我罗列两个相关的方法。其他操作请详读文档。

  1. plus.runtime.openURL( url, errorCB, identity );
  • url: ( String ) 必选 要打开的URL地址

    字符串类型,各平台支持的地址类型存在差异,参考平台URL支持表。

  • errorCB: ( OpenErrorCallback ) 可选 打开URL地址失败的回调

    打开指定URL地址失败时回调,并返回失败信息。

  • identity: ( String ) 可选 指定打开URL地址的程序名称

    在iOS平台此参数被忽略,在Android平台为程序包名,如果指定的包名不存在,则打开URL地址失败。

  1. <template>
  2. <view>
  3. <button class="button" type="primary" @click="open(0)">使用第三方程序打开指定URL</button>
  4. </view>
  5. </template>
  1. <script>
  2. export default {
  3. data() {
  4. return {
  5. url: 'https://uniapp.dcloud.io/'
  6. };
  7. },
  8. onLoad(op) {},
  9. methods: {
  10. open(types) {
  11. plus.runtime.openURL(this.url, function(res) {
  12. console.log(res);
  13. });
  14. }
  15. }
  16. };
  17. </script>

2,调用第三方程序

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

  • errorCB: ( LaunchErrorCallback ) 必选 启动第三方程序操作失败的回调函数

    启动第三方程序失败时回调,并返回失败信息。

  1. <template>
  2. <view>
  3. <button class="button" type="primary" @click="launchApp">打开淘宝</button>
  4. </view>
  5. </template>
  1. <script>
  2. export default {
  3. data() {
  4. return {
  5. url: 'https://uniapp.dcloud.io/'
  6. };
  7. },
  8. onLoad(op) {},
  9. methods: {
  10. launchApp() {
  11. let _this = this;
  12. // 判断平台
  13. if (plus.os.name == 'Android') {
  14. plus.runtime.launchApplication(
  15. {
  16. pname: 'com.taobao.taobao'
  17. },
  18. function(e) {
  19. console.log('Open system default browser failed: ' + e.message);
  20. }
  21. );
  22. } else if (plus.os.name == 'iOS') {
  23. plus.runtime.launchApplication({ action: 'taobao://' }, function(e) {
  24. console.log('Open system default browser failed: ' + e.message);
  25. });
  26. }
  27. }
  28. }
  29. };
  30. </script>

常用URLscheme

  1. [
  2. // 只在 ios 中生效
  3. {
  4. name: 'App Store',
  5. scheme: 'itms-apps://'
  6. },
  7. {
  8. name: '支付宝',
  9. pname: 'com.eg.android.AlipayGphone',
  10. scheme: 'alipay://'
  11. },
  12. {
  13. name: '淘宝',
  14. pname: 'com.taobao.taobao',
  15. scheme: 'taobao://'
  16. },
  17. {
  18. name: 'QQ',
  19. pname: 'com.tencent.mobileqq',
  20. scheme: 'mqq://'
  21. },
  22. {
  23. name: '微信',
  24. pname: 'com.tencent.mm',
  25. scheme: 'weixin://'
  26. },
  27. {
  28. name: '京东',
  29. pname: 'com.jingdong.app.mall',
  30. scheme: 'openApp.jdMobile://'
  31. },
  32. {
  33. name: '新浪微博',
  34. pname: 'com.sina.weibo',
  35. scheme: 'sinaweibo://'
  36. },
  37. {
  38. name: '优酷',
  39. pname: 'com.youku.phone',
  40. scheme: 'youku://'
  41. }
  42. ]

更多实用例子

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

  • 使用应用商店打开指定App,可用于引导评分
  • 强制使用应用宝打开指定App
  • 打开淘宝搜索页面。需要你要做淘宝客,需要向淘宝申请自己的scheme参数并传入。
  • 打开地图并指定地点
  • 打开qq并到指定聊天界面,可用于客服

    具体代码见下:
  1. <template>
  2. <view>
  3. <page-head title="通过scheme打开三方app示例"></page-head>
  4. <button class="button" @click="openBrowser('https://uniapp.dcloud.io/h5')">使用浏览器打开指定URL</button>
  5. <button class="button" @click="openMarket()">使用应用商店打开指定App</button>
  6. <button class="button" @click="openMarket('com.tencent.android.qqdownloader')">强制使用应用宝打开指定App</button>
  7. <button class="button" @click="openTaobao('taobao://s.taobao.com/search?q=uni-app')">打开淘宝搜索页面</button>
  8. <button class="button" @click="openMap()">打开地图并指定地点</button>
  9. <view class="uni-divider">
  10. <view class="uni-divider__content">打开QQ</view>
  11. <view class="uni-divider__line"></view>
  12. </view>
  13. <view class="uni-padding-wrap">
  14. <form @submit="openQQ">
  15. <view>
  16. <view class="uni-title">请输入聊天对象QQ号:</view>
  17. <view class="uni-list">
  18. <view class="uni-list-cell">
  19. <input class="uni-input" name="qqNum" type="number"/>
  20. </view>
  21. </view>
  22. </view>
  23. <view>
  24. <view class="uni-title">请选择QQ号类型:</view>
  25. <radio-group class="uni-flex" name="qqNumType">
  26. <label>
  27. <radio value="wpa" checked=""/>普通QQ号</label>
  28. <label>
  29. <radio value="crm" />营销QQ号(无需加好友直接聊天)</label>
  30. </radio-group>
  31. </view>
  32. <view class="uni-btn-v uni-common-mt">
  33. <button class="button" formType="submit">打开qq并到指定聊天界面</button>
  34. </view>
  35. </form>
  36. </view>
  37. </view>
  38. </template>
  39. <script>
  40. export default {
  41. data() {
  42. return {
  43. };
  44. },
  45. methods: {
  46. openBrowser(url){
  47. plus.runtime.openURL(url)
  48. },
  49. openMarket(marketPackageName) {
  50. var appurl;
  51. if (plus.os.name=="Android") {
  52. appurl = "market://details?id=io.dcloud.HelloH5"; //由于hello uni-app没有上Android应用商店,所以此处打开了另一个示例应用
  53. }
  54. else{
  55. appurl = "itms-apps://itunes.apple.com/cn/app/hello-uni-app/id1417078253?mt=8";
  56. }
  57. if (typeof(marketPackageName)=="undefined") {
  58. plus.runtime.openURL(appurl, function(res) {
  59. console.log(res);
  60. });
  61. } else{//强制指定某个Android应用市场的包名,通过这个包名启动指定app
  62. if (plus.os.name=="Android") {
  63. plus.runtime.openURL(appurl, function(res) {
  64. plus.nativeUI.alert("本机没有安装应用宝");
  65. },marketPackageName);
  66. } else{
  67. plus.nativeUI.alert("仅Android手机才支持应用宝");
  68. }
  69. }
  70. },
  71. openTaobao(url){
  72. plus.runtime.openURL(url, function(res) {
  73. uni.showModal({
  74. content:"本机未检测到淘宝客户端,是否打开浏览器访问淘宝?",
  75. success:function(res){
  76. if (res.confirm) {
  77. plus.runtime.openURL("https://s.taobao.com/search?q=uni-app")
  78. }
  79. }
  80. })
  81. });
  82. },
  83. openMap(){
  84. var url = "";
  85. if (plus.os.name=="Android") {
  86. var hasBaiduMap = plus.runtime.isApplicationExist({pname:'com.baidu.BaiduMap',action:'baidumap://'});
  87. var hasAmap = plus.runtime.isApplicationExist({pname:'com.autonavi.minimap',action:'androidamap://'});
  88. var urlBaiduMap = "baidumap://map/marker?location=39.968789,116.347247&title=DCloud&src=Hello%20uni-app";
  89. var urlAmap = "androidamap://viewMap?sourceApplication=Hello%20uni-app&poiname=DCloud&lat=39.9631018208&lon=116.3406135236&dev=0"
  90. if (hasAmap && hasBaiduMap) {
  91. plus.nativeUI.actionSheet({title:"选择地图应用",cancel:"取消",buttons:[{title:"百度地图"},{title:"高德地图"}]}, function(e){
  92. switch (e.index){
  93. case 1:
  94. plus.runtime.openURL(urlBaiduMap);
  95. break;
  96. case 2:
  97. plus.runtime.openURL(urlAmap);
  98. break;
  99. }
  100. })
  101. }
  102. else if (hasAmap) {
  103. plus.runtime.openURL(urlAmap);
  104. }
  105. else if (hasBaiduMap) {
  106. plus.runtime.openURL(urlBaiduMap);
  107. }
  108. else{
  109. url = "geo:39.96310,116.340698?q=%e6%95%b0%e5%ad%97%e5%a4%a9%e5%a0%82";
  110. plus.runtime.openURL(url); //如果是国外应用,应该优先使用这个,会启动google地图。这个接口不能统一坐标系,进入百度地图时会有偏差
  111. }
  112. } else{
  113. // iOS上获取本机是否安装了百度高德地图,需要在manifest里配置,在manifest.json文件app-plus->distribute->apple->urlschemewhitelist节点下添加(如urlschemewhitelist:["iosamap","baidumap"])
  114. plus.nativeUI.actionSheet({title:"选择地图应用",cancel:"取消",buttons:[{title:"Apple地图"},{title:"百度地图"},{title:"高德地图"}]}, function(e){
  115. console.log("e.index: " + e.index);
  116. switch (e.index){
  117. case 1:
  118. 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";
  119. break;
  120. case 2:
  121. url = "baidumap://map/marker?location=39.968789,116.347247&title=DCloud&src=Hello%20uni-app";
  122. break;
  123. case 3:
  124. url = "iosamap://viewMap?sourceApplication=Hello%20uni-app&poiname=DCloud&lat=39.9631018208&lon=116.3406135236&dev=0";
  125. break;
  126. default:
  127. break;
  128. }
  129. if (url!="") {
  130. plus.runtime.openURL( url, function( e ) {
  131. plus.nativeUI.alert("本机未安装指定的地图应用");
  132. });
  133. }
  134. })
  135. }
  136. },
  137. openQQ: function (e) {
  138. // console.log("e.detail.value: " + JSON.stringify(e.detail.value));
  139. // 没有校验qq号是否为空或合法数字,如果不是可用的qq号,启动qq后会停留在qq主界面
  140. plus.runtime.openURL('mqqwpa://im/chat?chat_type=' + e.detail.value.qqNumType + '&uin=' + e.detail.value.qqNum,function (res) {
  141. plus.nativeUI.alert("本机没有安装QQ,无法启动");
  142. });
  143. }
  144. }
  145. };
  146. </script>
  147. <style>
  148. .button {
  149. margin: 30upx;
  150. color: #007AFF;
  151. }
  152. </style>

给自己的App设置scheme

可在manifest中可配置。

Android配置方法

iOS配置方法

【uniapp 开发】uni-app 中如何打开外部应用的更多相关文章

  1. uni app中使用自定义图标库

    项目中难免会用到自定义图标,那在uni app中应该怎么使用呢? 首先, 将图标目录放在static资源目录下: 在main.js中引入就可以全局使用了 import '@/static/icon-o ...

  2. 分享 Ionic 开发 Hybrid App 中遇到的问题以及后期发布 iOS/Android 的方方面面

    此篇文章主要整理了最近在使用 Ionic 开发 Hybrid App 过程中遇到的一些疑难点以及后期发布生成 iOS 和 Android 版本过程中的种种问题. 文章目录 Ionic 简介和项目需求介 ...

  3. uni-app开发 uni.scss 样式的整体化设置

    今天在写uni-app设计的时候,界面图片.图标规格一直无法正常显示.查看了uni-app官网的代码注释后,发现了在style中设置<style lang="scss"> ...

  4. 解决IOS9 下在App中无法打开其他应用的问题

    打开 info.plist 文件 ,在根节点下添加下面代码即可,这是由于IOS9新的权限管理机制的问题 <key>LSApplicationQueriesSchemes</key&g ...

  5. uni app中关于图片的分包加载

    因为在项目中使用了大量的静态资源图片,使得主包体积过大, 而把这些图片全部放到服务器又有点麻烦,就想能不能把图片也分包,但是直接放在分包下的话导致图片资源找不到了, 在社区中看到大佬分享的十分有用,特 ...

  6. Android应用安全开发之浅谈网页打开APP

    一.网页打开APP简介 Android有一个特性,可以通过点击网页内的某个链接打开APP,或者在其他APP中通过点击某个链接打开另外一个APP(AppLink),一些用户量比较大的APP,已经通过发布 ...

  7. Android 当打开“开发人员模式”中的“不保留活动”后,程序应当怎么保持正常执行

    Android 当打开"开发人员模式"中的"不保留活动"后,程序应当怎么保持正常执行咧. .? 在这几天,我一直在纠结这个问题.从发现,程序出现这个问题,是由于 ...

  8. 微信不支持App下载的解决方案 微信跳转打开外部浏览器下载(苹果跳转商店下载)

    在微信中,打开app下载链接,或者使用微信扫一扫app下载二维码,都是无法下载app的. 因为腾讯为了自身利益,屏蔽了其他app直接在微信中下载.下面给分享下,找到的2种有效的解决方案. 方案:点击链 ...

  9. Android TV开发总结(七)构建一个TV app中的剧集列表控件

    原文:Android TV开发总结(七)构建一个TV app中的剧集列表控件 版权声明:我已委托"维权骑士"(rightknights.com)为我的文章进行维权行动.转载务必转载 ...

随机推荐

  1. TypeScript学习第二天:认识ts的数据类型

    目录 1,类型总览 2,基本类型 2.1,布尔 2.2,数字 2.3,字符串 2.4,Null 2.5,undefined 2.6,symbol 2.7,bigint 3,引用类型 3.1,数组 Ar ...

  2. 如何建立自己的代理IP池,减少爬虫被封的几率

    如何建立自己的代理IP池,减少爬虫被封的几率 在爬虫过程中,难免会遇到各种各样的反爬虫,运气不好,还会被对方网站给封了自己的IP,就访问不了对方的网站,爬虫也就凉凉. 代理参数-proxies 首先我 ...

  3. [ Skill ] 文件读写 & IO 句柄

    https://www.cnblogs.com/yeungchie/ 在 Skill 中使用一种叫做 ioport 类型的变量来操作文件.不过我一般更习惯称为 IO 句柄 (IO/File Handl ...

  4. Java入土--Java基础(二)

    Java基础(二) 接上一讲,我们接着来聊聊Java的一些基础知识,下一讲就会进行流程的控制. 类型转换 首先呢,是类型的转换,接上一个内容的数据类型,类型转换就是数据类型更进一步的应用. 由于Jav ...

  5. SQL学习日记

    目录 SQL学习日记 1. 常见的数据库对象 2. DDL 定义语句 3. DML 操作语句 4. DQL 查询语句 5. DCL 控制语句 SQL学习日记 1. 常见的数据库对象 对象名 关键字 描 ...

  6. Docker安装与基本命令

    docker安装 Ubuntu 更新apt包索引 sudo apt-get update 更新apt包索引 sudo apt-get upgrade 安装docker sudo apt-get ins ...

  7. async-validator 源码学习笔记(四):validator

    系列文章: 1.async-validator 源码学习(一):文档翻译 2.async-validator 源码学习笔记(二):目录结构 3.async-validator 源码学习笔记(三):ru ...

  8. 2022IDEA配置启动lilishop的swagger展示

    目录 一.概述 二.基本构建 三.Git 导入编译器 四.模块描述浅析 五.配置文档 1.注释配置文件 2.添加配置 3.暂时关闭权限 4.浏览器测试访问 5.其他需要修改模块 六.参考文献 结语 一 ...

  9. Python集成开发工具(IDE)推荐

    1.7 Python集成开发工具(IDE)推荐 1.7.1 Notepad++ Notepad++是Windows操作系统下的一套文本编辑器(软件版权许可证: GPL),有完整的中文化接口及支持多国语 ...

  10. Git初始化常用方法

    准备工作 安装git sudo apt install git 创建一个ssh密钥 如果已经有ssh密钥了,则这一步不要执行 ssh-keygen -t rsa -C '账号' 复制公钥内容 gedi ...