最全⾯的h5唤起app技术deeplink⽅案
前⾔
唤醒⽅式:
1、URL Schemes
2、android appLink
3、chrome intent
1、DeepLink实践URL Schemes⽅式
a、需要在l⽂件进⾏配置
<activity
android:name=".ui.activity.SplashActivity"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@style/NormalSplash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!--DeepLink h5唤醒app配置-->
<intent-filter>
<!--ACTION_VIEW:⽀持被检索-->
<action android:name="android.intent.action.VIEW" />
<!--CATEGORY_DEFAULT:响应隐式Intent-->
<category android:name="android.intent.category.DEFAULT" />
<!--CATEGORY_BROWSABLE:可被Web浏览器唤起-->
<category android:name="android.intent.category.BROWSABLE" />
<!--data:⼀个或多个,必须含有scheme标签,决定被唤起的URL格式-->
<data
android:host="app.puxinwangxiao"
android:scheme="pxwxstudent" />
<!--
<data
android:host="app.puxinwangxiao"
android:scheme="pxwxstudent"
android:pathPrefix="/pxwx"/>
<data
android:host="app.puxinwangxiao"
android:scheme="pxwxstudent"
android:path="/pxwx/user"/>
-->
</intent-filter>
</activity>
注意:
App可以配置多个⽀持唤起的Activity
Activity可以⽀持被多个URL唤起
若⼀个App配置了多个⽀持唤起的Activity,它们的scheme和host⼀般⼀致,然后通过path、pathPrefix等进⾏定向区分b、被唤起后解析URL数据
Uri数据的解析可以在Activity中通过getIntent().getData()实现
@Override
public void onCreate(Bundle savesInstanceState){
setContentView(R.layout.activity_splash);
// 尝试获取WebApp页⾯上过来的URL
Uri uri = getIntent().getData();
if (uri != null) {
// scheme部分
String Scheme();
// host部分
String Host();
// 访问路径
String Path();
//参数
Set<String> QueryParameterNames();
}
}
c、在h5页⾯上,通过如下⽅式使⽤:
<!--1.通过a标签打开,点击标签是启动-->
<!-- 注意这⾥的href格式 -- >
<a href="pxwxstudent://app.puxinwangxiao">open android app</a>
<!--2.通过iframe打开,设置iframe.src即会启动-->
<iframe src="pxwxstudent://app.puxinwangxiao"></iframe>
<!--3.直接通过window.location 进⾏跳转-->
window.location.href= "pxwxstudent://app.puxinwangxiao";
d、在原⽣App中唤起通过Intent⽅式
Intent intent = new Intent();
intent.setData(Uri.parse("pxwxstudent://app.puxinwangxiao/"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
2、DeepLink实践Android AppLink⽅式
a、Android AppLink介绍
Android M以上版本可以通过AppLinks,让⽤户在点击⼀个链接时跳转到App的指定页⾯;
前提是这个App已经安装并经过验证。
App Links的最⼤的作⽤,就是可以避免从页⾯唤醒App时出现的选择浏览器选项框;
前提是必须注册相应的Scheme,就可以实现直接打开关联的App。
Android App Links有以下⼏点好处:
安全性/特殊性:由于Android App Links使⽤了HTTP/HTTPS URL的⽅式向开发者的服务器进⾏连接认证,所以其他应⽤⽆法使⽤我们的链接
⽆缝的⽤户体验:当⽤户未安装我们的应⽤时,由于使⽤的是HTTP/HTTPS URL,会直接打开⼀个⽹页,我们可以在这个⽹页中展⽰应⽤介绍等,⽽不是显⽰404或者是其他错误页⾯
⽀持Instant Apps:可以使⽤App Links直接打开⼀个未安装的Instant App
⽀持Google Search或其他浏览器:⽤户可以直接在Google Search/Google Assistant/⼿机浏览器/屏幕
搜索中直接通过点击⼀个URL来打开我们的指定页⾯
b、Android AppLink集成
创建intent filter
Android Studio 2.3以后提供了App Links Assistant来帮助开发者快速在l中创建需要配置的intent filter,使⽤App Links Assistant 有以下⼏个步骤:
点击Android Studio的菜单栏中的Tools > App Links Assistant
点击Open URL Mapping Editor,然后在对话框底部点击+去添加⼀个新的URL mapping
在弹出的Add URL Mapping对话框中输⼊对应的内容,包括Host、Path、Activity, 输⼊完成后点击OK
注:App Link ⽀持多个域名
使⽤App Links Assistant在manifest⽂件中⾃动⽣成的内容如下:
<activity
android:name=".ui.activity.SplashActivity"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@style/NormalSplash">
<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" />
<data
android:scheme="http"
android:host="resource.puxinwangxiao"
android:path="/pxwx" />
</intent-filter>
</activity>
检查URL Mapping是否配置正确
App Links Assistant提供了检查URL Mapping是否配置正确的快捷⽅式,操作如下:
点击Open URL Mapping Editor,然后在Check URL Mapping对话框中输⼊URL,当输⼊⼀个能够成功匹配到Acitivty的URL后,输⼊框下⽅会显⽰This URL maps to xxxxx(app)
处理App Links进⼊应⽤的场景
通过App Links Assistant -> Select Activity选择之前配置的URL对应的Activity, 点击Insert Code即可在onCreate⽅法中插⼊获取从App Links跳转⽽来的URL的代码,⽣成代码如下
// ATTENTION: This was auto-generated to handle app links.
Intent appLinkIntent = getIntent();
String appLinkAction = Action();
Uri appLinkData = Data();
检查assetlinks.json是否上传成功
通过App Links Assistant -> Open Digital Asset Links File Generator -> Generate Digital Asset Links file的⽅式⽣成assetlinks.json⽂件,然后将该⽂件放置到正确的域名地址中。
通过App Links Assistant -> Open Digital Asset Links File Generator -> Generate Digital Asset Links file -> Link and Verify可以检测是否正确的在服务器中放置配置⽂件,检测成功的话,显⽰如下图:
如果要让⽹站和不同的应⽤关联起来
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.pxwx.student",
"sha256_cert_fingerprints":
["BD:EF:57:3D:01:D0:32:79:6E:32:73:18:32:E2:36:B9:35:1B:9C:7D:0F:F0:B0:A9:BE:91:18:CE:27:1A:D8:4C"]
}
},
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.pxwx.assistant",
"sha256_cert_fingerprints":
["BD:EF:57:3D:01:D0:32:79:6E:32:73:18:32:E2:36:B9:35:1B:9C:7D:0F:F0:B0:A9:BE:91:18:CE:27:1A:D8:4C"]
}
}]
注意:path、 pathPrefix、 pathPattern 之间的区别
path ⽤来匹配完整的路径,这⾥将 path 设置为 /assistant/download.html 才能够进⾏匹配;
pathPrefix ⽤来匹配路径的开头部分,拿上⾯的 Uri 来说,这⾥将 pathPrefix 设置为 /assistant 就能进⾏匹配了;
pathPattern ⽤表达式来匹配整个路径,这⾥需要说下匹配符号与转义。
3、Chrome Intent⽅式实现从浏览器启动应⽤
在很多应⽤中需要我们从浏览器中直接启动应⽤,⼤多数采⽤的是上⾯提到的第⼀种scheme的⽅式,问题是如果⼿机中没有应⽤,该url会跳转到⼀个错误的界⾯。
google官⽅在chrome中推出了⼀种Android Intents的⽅式来实现应⽤启动,通过在iframe中设置src为
intent:HOST/URI-path // Optional host
#Intent;
package=[string];
action=[string];
category=[string];
component=[string];
scheme=[string];
end;
mainfest⽂件中定义要启动的activity
<activity
android:name=".ui.activity.SplashActivity"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@style/NormalSplash">
<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" />
<data
android:host="app.puxinwangxiao"
android:scheme="pxwxstudent" />
</intent-filter>
</activity>
定义⼀个a标签为
<a href="intent://app.puxinwangxiao/#Intent;scheme=pxwxstudent;x;end">open Android App</a>
在浏览器中点击a标签,就可以启动应⽤程序的对应activity了.
如果⼿机中没有相应的应⽤,防⽌跳转到错误页⾯,将a标签设置为
<a href="intent://app.puxinwangxiao/#Intent;scheme=pxwxstudent;x;S.browser_fallback_url=www.puxinwangxiao;end">open Android App</a>这样如果没有对应应⽤,该链接就会跳转到S.browser_fallback_url指定的url上。
4、总结:
1、URL Scheme兼容性
URL Scheme只需要原⽣App开发时注册Scheme即可,⽤户点击此类链接时,会⾃动唤醒App,并借助URL Router机制跳转到指定页⾯。
URL Scheme兼容性⾼,但却存在许多限制:
国内各个⼚商浏览器差异很⼤,当要被唤醒的⽬标App未安装时,这个链接很容易出错。
当注册有多个Scheme相同的时候,⽬前是没有办法区分的。
不⽀持从其他App中的UIWebView中跳转到⽬标App。
被部分主流平台禁⽌,、微博、QQ浏览器、⼿机百度中都已经被禁⽌使⽤。
由于这些限制的存在,安卓发布了⾃⼰的第⼆套⽅案:Android的App Links。
2、App Links兼容性
App links在国内的⽀持还不够,部分安卓浏览器并不⽀持跳转⾄App,⽽是直接在浏览器上打开对应页⾯。
系统询问是否打开对应App时,假如⽤户选择“取消”并且选中了“记住此操作”,那么⽤户以后就⽆法再跳转App。
3、chrome intent兼容性
google通过chrome浏览器启动的优化⽅案;
很多第三⽅浏览器会拦截掉chrome intent启动应⽤的请求
三种⽅案都有各⾃的兼容性,这⼏项技术是基于系统平台的,每个系统版本的迭代后,配置⽅式都会有
网页app新的变化,国内的第三⽅平台也提供了专项功能,毕竟是专门做这个的,兼容性也都经受过市场验证,懒得⾃⼰研究的,可以直接集成使⽤,参考下。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论