Android 中 QQ 和 微信打开第三方应用
获取当前浏览器
可以用 navigation.userAgent 来区分当前的运行环境(当前测试手机:vivo x20)
QQ(Android)
Mozilla/5.0 (Linux; Android 8.1.0; vivo X20A Build/OPM1.171019.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045120 Mobile Safari/537.36 V1_AND_SQ_8.2.6_1320_YYB_D QQ/8.2.6.4370 NetType/WIFI WebP/0.3.0 Pixel/1080 StatusBarHeight/72 SimpleUISwitch/0QQ(iPhone)
Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/17C54 QQ/8.2.6.700 V1_IPH_SQ_8.2.6_1_APP_A Pixel/1125 MiniAppEnable Core/WKWebView Device/Apple(iPhone X) NetType/WIFI QBWebViewType/1 WKType/1微信(Android)
Mozilla/5.0 (Linux; Android 8.1.0; vivo X20A Build/OPM1.171019.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/67.0.3396.87 XWEB/1169 MMWEBSDK/191201 Mobile Safari/537.36 MMWEBID/946 MicroMessenger/7.0.10.1580(0x27000AFD) Process/toolsmp NetType/WIFI Language/zh_CN ABI/arm64微信(iPhone)
Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.10(0x17000a21) NetType/WIFI Language/zh_CNQQ浏览器(Android)
Mozilla/5.0 (Linux; U; Android 8.1.0; zh-cn; vivo X20A Build/OPM1.171019.011) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/10.1 Mobile系统浏览器(Android)
Mozilla/5.0 (Linux; Android 8.1.0; vivo X20A Build/OPM1.171019.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36 VivoBrowser/7.4.12.4Firefox(PC)
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0Chrome(PC)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36
另外
MAC 电脑
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko)iPad
Mozilla/5.0 (iPad; CPU OS 13_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148
区分不同浏览器
navigator.userAgent
- 含有 Mobile 则是移动端,否则是PC端浏览器。
- 含有 Android 的是安卓,含有 iPhone 的是 iPhone。
- 含有 QQ 的是 QQ 或 QQ浏览器。
- 含有 MicroMessenger 的是微信。
const type = document.getElementById("type");
const ua = window.navigator.userAgent;
let isAndroid = ua.includes("Android");
let isIPhone = ua.includes("iPhone");
let isWX = ua.includes("MicroMessenger");
let isQQ = ua.includes("QQ");
if(isAndroid) {if(isWX) {type.innerHTML = "安卓 微信";} else {type.innerHTML = "安卓 其它";}
} else if(isIPhone) {if(isQQ) {type.innerHTML = "IOS QQ";} else {type.innerHTML = "IOS 其它";}
}
现象
由于 Android 和 iPhone 的实现方式,包括现象都是不同的。所以下面分类讨论。
Android
QQ(Android)
QQ 和 浏览器 通过预设好的 intent-filter 是可以打开第三方应用的(无论此时第三方应用是否已开启,均能打开)
微信(Andorid)
由于微信在5.0.3以后,考虑到安全问题,就禁用了微信浏览器里打开别的app,所以无法直接在微信里打开第三方的APP。
虽然无法直接打开,但有以下几个代替方案:
序号 | 实现方式 | 缺点 |
---|---|---|
1 | 跳转应用宝的下载页面,应用宝会根据是否已安装,来切换下载或打开的页面 | 此种打开方式无法传递参数 |
2 | 引导用户在浏览器里打开当前网页,因为微信虽然禁止了android:scheme跳转,但是浏览器都是支持的 | 操作有些繁琐,需要前端添加提示蒙版 |
3 | 应用实现浏览器意图,同样引导用户右上角选择浏览器打开,然后选中本应用 | 该应用的性质被改为浏览器,任何网址选择用浏览器打开都会出现本应用的选项 |
4 | 分享小程序,然后通过小程序API打开应用 | 哔哩哔哩的做法,但实现小程序需要人力物力 |
5 | 网易云音乐居然有办法直接打开自己的APP(实现原理未知) | 弊端是如果网易云音乐APP没被打开或进程被滑动杀死,此时是不会自动打开的 |
6 | 应用实现浏览器意图(但对意图的 host 或 port 做限制)当然同样需要引导用户选择右上角,通过浏览器打开。但非本应用的链接,选择浏览器打开时,就不会出现本应用的提示了 |
打开应用宝页面
- 如果未安装该应用,则会自动跳转到下载页面
- 若已安装,则显示为应用封面和并包含打开按钮
分享为小程序,在小程序中打开
iPhone
微信
实现方式
前端页面
主要是用 a 标签来打开应用
<html><head><meta charset="utf8"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0,user-scalable=0" /><title>跳转到第三方APP</title><style>body {font-size: 16px;}h1,h2,div,a {display:block;margin: 1rem;}</style><script>function showUserAgent() {const userAgent = document.getElementById("userAgent");userAgent.innerHTML = window.navigator.userAgent;}function showType() {const type = document.getElementById("type");const ua = window.navigator.userAgent;const mobile = {};mobile.isAndroid = ua.includes("Android");mobile.isIPhone = ua.includes("iPhone");mobile.isWX = ua.includes("MicroMessenger");mobile.isQQ = ua.includes("QQ");window.mobile = mobile;if(mobile.isAndroid) {if(mobile.isWX) {type.innerHTML = "安卓 微信";} else {type.innerHTML = "安卓 其它";}} else if(mobile.isIPhone) {if(mobile.isQQ) {type.innerHTML = "IOS QQ";} else {type.innerHTML = "IOS 其它";}}}function openApp(url) {document.location = url;setTimeout( function() {if(window.mobile.isAndroid) {if(confirm( '您还未安装这个应用,是否现在去应用宝下载该应用?'))document.location = "https://itunes.apple.com/";} else if(window.mobile.isIPhone)if(confirm( '您还未安装这个应用,是否现在去AppStore下载该应用?'))document.location = "https://cftweb.3g.qq.com/qqappstore/index";}, 1000);}window.onload = ()=>{showUserAgent();showType();}</script></head><body><h1>navigator.userAgent</h1><div id="userAgent"></div><h2 id="type"></h2><h1>Android</h1><a href="#" onclick="openApp('open://host/links?data=test')">QQ和浏览器打开APP</a><h1>IOS</h1><a href="#" onclick="openApp('fastlion://host.test.com')">打开第三方APP</a></body>
</html>
Android
intnet 匹配规则
- Action 匹配只要有一个与Intent中携带Action相同即可
- Intent默认会携带"android.intent.category.DEFAULT",所以隐式启动的组件必须包含
<category android:name="android.intent.category.DEFAULT" />
- Category 匹配要包含全部Intent中携带Category
- Data 用于指定数据,通常是URI格式。和 Action 一样,匹配只要有一个与Intent中携带Data相同即可
在 AndroidManifest.xml 添加如下意图过滤器
<activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><!-- 接收微信、QQ右上角,用浏览器打开的意图 --> <data android:scheme="https" /><data android:scheme="http" /><!-- 接收QQ、浏览器链接点击后,直接打开的意图(data的参数可以随意) --><dataandroid:scheme="open"android:host="com.open.url"android:port="8888"android:path="/appLinks" /></intent-filter>
</activity>
打开应用的两种意图
QQ和浏览器直接打开
- intent
intent://com.open.url:8888/appLinks?data=test#Intent;scheme=open;launchFlags=0x10000000;component=<应用包名>/.activity.MainActivity;i.fling_action_key=2;l.appShareID=-1;S.preAct=QQBrowserActivity;S.leftViewText=%E8%BF%94%E5%9B%9E;l.preAct_elapsedRealtime=14362619;i.fling_code_key=208902589;S.url=http%3A%2F%2F192.168.1.248%3A5500%2Findex.html;l.preAct_time=1582515805501;B.h5_ark_is_from_share=false;end
- uri
uri = open://com.open.url:8888/appLinks?data=test
- intent
微信右上角,使用浏览器打开
- intent
intent://<网页地址>:5500/index.html?from=singlemessage#Intent;scheme=http;launchFlags=0x10000000;package=<应用包名>;component=<应用包名>/.activity.MainActivity;end
- uri
uri = http://<网页地址>:5500/index.html?from=singlemessage
- intent
在 MainActivity 中处理这些意图
/*** 自定义的打开应用的协议*/
public static final String SCHEME_OPEN = "open";
/*** 网页*/
public static final String SCHEME_HTTP = "http";
/*** 加密网页*/
public static final String SCHEME_HTTPS = "https";@Override
protected void onCreate(Bundle savedInstanceState) {onNewIntent(getIntent());
}@Override
protected void onNewIntent(Intent intent) {if (intent != null) {Uri uri = intent.getData();if(uri != null) {String url = uri.toString();if(url.startsWith(Constant.SCHEME_OPEN)) {webBusiness.loadUrl(url.replace("Constant.SCHEME_OPEN", "https"));deal = true;} else if(url.startsWith(Constant.SCHEME_HTTP)) {webBusiness.loadUrl(url);deal = true;}}}
}
iPhone
iOS 可以使用 Universal links(微信可以,QQ不行) 或 自定义协议(微信、QQ均可)打开应用。
常用软件 | URL Scheme | Bundle identifier |
---|---|---|
mqq:// | ||
微信 | weixin:// | |
腾讯微博 | TencentWeibo:// | |
淘宝 | taobao:// | |
支付宝 | alipay:// | |
微博 | sinaweibo:// | |
QQ浏览器 | mqqbrowser:// | com.tencent.mttlite |
uc浏览器 | dolphin:// | com.dolphin.browser.iphone.chinese |
百度地图 | baidumap:// | com.baidu.map |
实现方式
在“项目” -> “info” -> “URL Types”中,新增一个URL Schemes。
其实只要通过上面的配置就可以打开应用了。但有时我们还要传递参数进来,然后程序根据参数调用不同的功能或打开不同的页面。我们可在 AppDelegate.swift 中的如下方法里获取参数,并做相应的处理。
func application(_ app: UIApplication, open url: URL,options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {if url.host == nil {return true;}//获取来源应用的Identifierprint("来源App:\(options[UIApplicationOpenURLOptionsKey.sourceApplication]!)")//获取url以及参数let urlString = url.absoluteStringlet queryArray = urlString.components(separatedBy: "/")print(urlString)let alertController = UIAlertController(title: "参数如下",message: "\(queryArray[2]) \(queryArray[3])",preferredStyle: .alert)let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)alertController.addAction(cancelAction)self.window!.rootViewController!.present(alertController, animated: true,completion: nil)return true
}
Android 中 QQ 和 微信打开第三方应用相关推荐
- android qq分组展开,Android仿qq分组管理的第三方库
本文实例为大家分享了Android仿qq分组管理的第三方库,供大家参考,具体内容如下 下面先看效果 我们点击展开与折叠分组的功能在库里面是已经封装好的,只能把它已入到项目中,就可以直接用了,十分的方便 ...
- android 仿QQ,微信群组里的@功能,支持@多人,并能一键删除,能获取上传对应的id(修改版)
首先注明该文章是借签别人的博客,原文博文地址点击打开链接 android 仿QQ,微信群组里的@功能,支持@多人,并能一键删除,能获取上传对应的id 这个需求来源:本人做集成环信聊天时,项目需要@功能 ...
- 手机QQ和微信打开网址 自动跳转到浏览器打开的代码
手机QQ和微信打开网址 自动跳转到浏览器打开的代码 <script src="https://open.mobile.qq.com/sdk/qqapi.js?_bid=152″> ...
- android仿微信图片上传进度,Android开发之模仿微信打开网页的进度条效果(高仿)...
一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下 "仿微信打开网页的进度条效果",你会看到有很多类似的文章,不过他们有个共同点,就是实 ...
- android仿微信 进度条,Android开发之模仿微信打开网页的进度条效果(高仿)
一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下 "仿微信打开网页的进度条效果" ,你会看到有很多类似的文章,不过他们有个共同点,就是 ...
- iOS 微信打开第三方应用(微信跳转第三方app)(Universal Links)
iOS应用可以使用 URL Schemes 进行应用间的跳转或实现网页打开应用的功能,这种跳转是协议跳转. 要应用间能跳转就要遵循URL Schemes协议. 要网页跳转应用网页就要遵循URL Sch ...
- 关于Android类似qq和微信那种在桌面图标右上角更新数字的研究
记录下这个需求的研究 写的超级随意 大家凑合看 不懂再问 一起探讨 因为我们的产品也需要有即时通讯了 消息更新不可避免 首先 要实现这个功能 当然是要借助系统的Launcher. 而谷歌并 ...
- 手把手教会你Android手机QQ和微信防撤回
如今QQ和微信都能撤回消息,当对方撤回了消息,想看又看不了,是不是很想知道对方撤回了什么?接下来我就来教会大家阻止对方QQ撤回的消息和查看微信撤回的消息. 1.首先,手机需要获取root权限(目前有很 ...
- Android中如何使用代码打开各种类型的文件
介绍 本篇用于介绍Android中如何打开各种类型的文件,如:音乐文件(mp3.wav.ogg等).视频文件(3gp.mp4等).图片文件(jpg.png.gif等).安装包(apk).文档(txt. ...
最新文章
- Akka的Hello World(一)Akka的Actor架构
- Spring事物详解和传播行为
- 使用Adobe Audition生成基本音频
- mysql学习之路三(转)
- linux将文件的第二列求和,awk实现第一列相乘,第二列求和,并相加 - 米扑博客...
- HDU - 4780费用流
- IT人:如何预防久坐伤身?
- application配置和profile隔离配置(转)
- android qq 微信绑定,QQ或微信互联快捷登录怎么绑定微信提醒?
- 《论持久战》的主要原则
- im2col运算 - 一种卷积优化算法
- [ROS2基础]launch 文件和多节点进程
- error: Failed dependencies: 	perl(Data::Dumper) is needed by MySQL-server-5.6.46-1.el7.x8
- mysql cbrt函数_ES6 数值的扩展
- MySQL数据库——复杂查询(二)
- EKL日志平台架构概括
- 单源最短路径(1):Dijkstra算法
- html中的文本在指定位置换行
- 预编译及预处理的理解
- 移动营销哪家强?微库为上万家品牌服务的营销启示
热门文章
- 自定义linux桌面,教您6个自定义Ubuntu桌面的步骤
- 牛年第一瓜!阿里女员工被骗500多万!初中文化水平男子,滴滴开豪车,诈骗4000多万被判无期!...
- 微型计算机8字节,八位字节是什么意思
- 微信小程序调试webview_关于微信小程序webview的使用
- RSS是什么,RSS怎么玩,RSS原理是什么
- DDD的创新思想:开发即设计思想
- NIXIE_TUBE
- 二次开发手册——百家CMS微商城说明文档(5)
- rasp 系统_Java RASP技术详细介绍及应用「附RASP参考资料」
- 腾讯发布叮当助手,人工智能语音助手将赋能智能电视