美文网首页
Android 应用间跳转

Android 应用间跳转

作者: 未子涵 | 来源:发表于2020-06-19 11:31 被阅读0次

    关于跳转应用的方式

    https://www.jianshu.com/p/862885bd8ea2

    1. URL Scheme(android / iOS)
      • Android中又叫DeepLinks
    2. applinks(android)/ Universal links(iOS)
    3. intent(android only,package related)

    其实,1、2都可以认为是广义上的scheme方式,只是applinks将scheme限定为"http/https"。

    原生App Links功能

    官方介绍

    1. 目的是通过你的网站的链接(Scheme方式下不是真正的链接)直接跳转你的应用,因此它需要一个JSON文件,用于验证你的网站和intent-filter之间的关系,只有系统找到了这个文件,才会将你的应用作为指定URLs的默认handler:
    https://domain.name/.well-known/assetlinks.json
    
    • 这里的domain.name就是配置在intent-filter中的host
    1. 和DeepLink的区别是不会弹出系统框,询问用户使用哪个应用打开,而是直接打开你的应用
    1. 只支持Android 6.0以上
    2. DeepLink 与 AppLink的区别
    deeplink.png

    实现

    1. 特定的intent-filter:
    <activity ...>
        <intent-filter android:autoVerify="true">
            <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="www.example.com" />
            <data android:scheme="https" />
        </intent-filter>
    </activity>
    
    1. 针对每一个满足上述形式的intent-filter,要求其host都能下载到验证文件:
    https://hostname/.well-known/assetlinks.json
    

    对于moblink来说,就是:

    https://z.t4m.cn/.well-known/assetlinks.json
    
    • 注:必须所有的host都能找到对应的验证文件,系统才会将你的应用作为这些URL的默认handler,否则你的应用不会被当做是任何一个URL的默认handler,此时系统会进入标准处理模式,也就是会弹框询问。

    Digital Asset Links

    [{
      "relation": ["delegate_permission/common.handle_all_urls"],
      "target": {
        "namespace": "android_app",
        "package_name": "com.example",
        "sha256_cert_fingerprints":
     ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
      }
    }]
    
    • fingerprints支持多个,以方便支持多个应用版本,比如debug和release
    • Associating a website with multiple apps(可行)
    • Associating multiple websites with a single app(可行)
    • 如何创建一个Statement List
    确认Digital Asset Links文件

    使用以下命令确认:

    https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://domain.name:optional_port&relation=delegate_permission/common.handle_all_urls
    

    对于moblink来说,就是:

    https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://z.t4m.cn&relation=delegate_permission/common.handle_all_urls
    

    页面输出为:


    validate.png

    测试DeepLinks和AppLinks

    使用以下命令验证

    adb shell am start -W -a android.intent.action.VIEW -d <URI> <PACKAGE>
    // 以下命令无法验证DeepLink,除非你的DeepLink配了android.intent.category.BROWSABLE
    adb shell am start -W -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "http://domain.name:optional_port"
    
    • -W:打印出更详细的日志
    • <PACKAGE>可以不填,DeepLink本来也和package没有关系
    测试Moblink的Applinks功能

    Create Deep Links to App Content

    比如验证moblink demo的applink功能,输入:

    adb shell am start -W -a android.intent.action.VIEW -d "http://z.t4m.cn/YfyIV3" com.mob.moblink.demo
    // 或者
    adb shell am start -W -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "http://z.t4m.cn/YfyIV3"
    
    Starting: Intent { act=android.intent.action.VIEW dat=http://z.t4m.cn/... pkg=com.mob.moblink.demo }
    Status: ok
    Activity: com.mob.moblink.demo/.ActivityC
    ThisTime: 206
    TotalTime: 12951
    WaitTime: 448
    Complete
    
    • linkId需使用真实的,否则MobLinkActivity无法通过linkId从服务器获取到场景数据,也就无法跳转目标Activity了

    上述命令执行时通过sharesdklog可以监测到MobLinkActivity启动时的intent为:

    uri: http://z.t4m.cn/YfyIV3, 
    intent:Intent { act=android.intent.action.VIEW dat=http://z.t4m.cn/... flg=0x10000000 pkg=com.mob.moblink.demo cmp=com.mob.moblink.demo/com.mob.moblink.MobLinkActivity }, 
    activity:com.mob.moblink.MobLinkActivity@e660546
    
    测试Moblink的Scheme跳转功能

    比如验证moblink demo的Scheme跳转功能,输入:

    adb shell am start -W -a android.intent.action.VIEW -d "mlink://com.mob.moblink.demo" com.mob.moblink.demo
    
    Starting: Intent { act=android.intent.action.VIEW dat=mlink://com.mob.moblink.demo pkg=com.mob.moblink.demo }
    Status: timeout
    Activity: com.sec.android.app.launcher/.activities.LauncherActivity
    WaitTime: 12383
    Complete
    
    • 由于uri中没有带param过来,MobLinkActivity启动后无法通过param解析出path和params(事实上sdk内部逻辑判断该uri不含有正常的scene数据,根本不会进入后续跳转逻辑),导致无法跳转目标Activity

    上述命令执行时通过sharesdklog可以监测到MobLinkActivity启动时的intent为:

    uri: mlink://com.mob.moblink.demo, 
    intent:Intent { act=android.intent.action.VIEW dat=mlink://com.mob.moblink.demo flg=0x10000000 pkg=com.mob.moblink.demo cmp=com.mob.moblink.demo/com.mob.moblink.MobLinkActivity },
    activity:com.mob.moblink.MobLinkActivity@87f5b67
    

    当然,也可以输入完整的scheme以测试是否能恢复场景

    以下面的链接为例:

    http://z.t4m.cn/YfyIV3
    

    它跳转时对应的scheme为(其中的params参数可以使用urlEncoded,也可以不用):

    adb shell am start -W -a android.intent.action.VIEW -d "mlink://com.mob.moblink.demo/?params=37x0iEF6LcBM/hr6GOXjw82fCtOFrtiBeUTABWGrR96E4pp/JUMxv+CBhT/lAMdRMX84308An4nlzWU7toUs2K1eeA66ycfjTR+PHJ51RRfMWOnoflYGnVGzaIpmLrTcDYwGDS54zwgMU6PSzI8Kc6x83S6JbGqCH+w9PkeBOtfqPy5pp+pXyfQ5M+k9eopdcw7LfJb1zISWRMeTY44ojJ4C5evJYXc+d8ZaypoywIDFQfYpZZ4F/YER8/bFZbwJDbYMjz5NZvusxVq8/EO+dX97aCZAy0kswNK34VIHAoWxkEd4ZJdgQggRpKaHHfK9biVupeWU4k7sI6CI1XMIQY1B3kLqUkT8EXd0+q06Dgg=" com.mob.moblink.demo
    

    运行后就可以正常拉起应用并还原,控制台输出:

    Status: ok
    Activity: com.mob.moblink.demo/.ActivityC
    ThisTime: 479
    TotalTime: 36809
    WaitTime: 1054
    Complete
    

    相关文章

      网友评论

          本文标题:Android 应用间跳转

          本文链接:https://www.haomeiwen.com/subject/purvxktx.html