怎么唤醒APP

脚下大面积的唤醒APP方式有二种:

  • URL Scheme

URL Scheme是iOS,Android平台都匡助,只需求原生APP开发时登记scheme
那么用户点击到此类链接时,会自动唤醒APP,借助于URL Router建制,则还足以跳转至指定页面。比如:

<!-- 唤醒APP并跳转至指定的path页面 -->
<a href="<scheme>://<path>?<params>=<value>">打开APP</a>

<!-- JS设置iframe src跳转至指定的path页面 -->
//创建一个隐藏的iframe
var ifr = document.createElement('iframe');
ifr.src = '<scheme>://<path>?<params>=<value>';
ifr.style.display = 'none';
document.body.appendChild(ifr);
//记录唤醒时间
var openTime = +new Date();
window.setTimeout(function(){
    document.body.removeChild(ifr);
    //如果setTimeout 回调超过2500ms,则弹出下载
    if( (+new Date()) - openTime > 2500 ){
        window.location = '指定的下载页面';
    }
},2000)

那种方法是当期使用最广大,也是最简便的,然则急需手机,APP扶助URL Scheme
优点: 开发开销低,绝半数以上都协助,web-native商讨制定也简要。
缺点:
错误处理意况因阳台不一样,难以统一处理,部分APP会间接跳错误页(比如Android
Chrome/41,iOS中老版的Lofter);也部分停留在原页面,但弹出提醒“不能够开拓网页”(比如iOS7);iOS8以及最新的Android
Chrome/43 目前都是直接停留在当前页,不会跳出错误提示。
帮忙处境:
iOS在实际上利用中,腾讯系的微信,QQ明确不准利用,iOS9将来Safari不再接济通过js,iframe等来触发scheme跳转,并且还投入了认可机制,使得通过js超时机制来自动唤醒APP的措施为主不可用;Android平台则相继app厂商差距很大,比如Chrome从25及然后就同Safari意况一致。

  • Android intent

那是Android平台独有的,使用办法如下:

intent:
HOST/URI-path // Optional host 
#Intent; 
  package=[string]; 
  action=[string]; 
  category=[string]; 
  component=[string]; 
  scheme=[string]; 
end; 

此间的HOST/URI-path, 与常见http URL 的host/path书写形式相同,
package是Android
APP的包名,其他参数如action、category、component不是很精晓,
有趣味能够去询问法定文档。代码如下:

<!-- 唤醒APP并跳转至指定的path页面 -->
<a href="intent://<role>/<path>#Intent;scheme=<scheme>;package=com. domain;end"">打开APP</a>

万一手机能匹配到相应的APP,则会平昔打开;如没有安装,则会跳到手机默许的运用集团,比如谷歌(Google)原生系统Nexus
5,将会直接跳到GooglePlay,对于国内各厂商定制过的种类,则跳转到各自的默许使用商店,或者弹出商店供拔取。intentscheme绝对圆满的少数是,提供一个开辟败北去向URL的选项,能够因而点名参数S.browser_fallback_url来指定去向URL。比如打开APP动作,即使打开败北,则跳转到APP下载页,那对于国内的卓绝网络环境,依然挺有用的。

  • Safari内置APP广告条

在页面Head中追加如下meta
添加智能App广告条,可以自动判断是还是不是已安装使用,只好用来Safari,在第三方拔取中就十分了。

<meta"apple-itunes-app"content"app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL"
  • Android Chrome内置APP安装提醒

其一是Mobile Chrome 43
beta新参预的特性,在用户浏览某一个网站频仍后,假诺Chrome发现该站点有原生APP,则会提示用户下载原生APP,此项特征开发者无法干预,完全是谷歌(Google)的推荐作为。

  • Universal Links

在二零一五年的WWDC大会上,Apple推出了iOS 9的一个效应:Universal
Links通用链接。如若你的App接济Universal
Links,那就可以访问HTTP/HTTPS链接直接唤起APP进入具体页面,不要求任何额外判断;就算未安装App,访问此通用链接时,可以一个自定义网页。

优点:

  • 唯一性:不像自定义的scheme,因为它选取专业的HTTP/HTTPS链接到你的web站点,所以它不会被其余的app所注解.别的,Custom
    URL scheme 因为是自定义的商谈,所以在尚未安装 app
    的意况下是心有余而力不足直接打开的,而Universal
    Links本身是一个HTTP/HTTPS链接,所以有更好的包容性;
  • 安全:当用户的手机上设置了您的app,那么iOS将去你的网站上去下载你上传上去的印证文件(这一个评释文件宣称了APP可以打开哪些类型的http链接)。因为只有你自己才能上传文件到你网站的根目录,所以您的网站和您的app之间的涉嫌是平安的;
  • 可变:当用户手机上尚未设置你的app的时候,Universal
    Links也能够工作。假诺你愿意,在平素不安装APP的时候,用户点击链接,会在safari中突显你网站的内容;
  • 简单:一个URL链接,可以同时功效于网站和app,可以定义统一的web-native协议;
  • 私有:此外APP可以在不必要精晓是还是不是安装了的场所下和您的APP相互通讯;

缺点:

  • 只帮助iOS9及以上系统;当使用Universal
    Link打开APP之后,状态栏右上角会出现链接地址,点击它会撤消Universal
    Link,需率领用户重新利用Safari再一次打开该链接,弹出Safari内置APP广告条,再点击打开重新开启Universal
    Link。

iOS9开启Universal Links

第一,你必须有一个域名,且那一个域名的网站要求帮助https,然后所有网站的上传到.well-known目录的权力(那几个权力是为了上传一个Apple指定的文本apple-app-site-association),有了这一个先决条件才可以延续下边的步子:

  • 创造一个json格式的命名为apple-app-site-association文本,注意这几个文件必须没有后缀名,文件名必须为“`apple-app-site-association“!!!

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "9JA89QQLNQ.com.apple.wwdc", 
                "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"]
            },
            {
                "appID": "ABCD1234.com.apple.wwdc", 
                "paths": [ "*" ]
            }
        ]
    }
}

说明: appID = teamId.yourapp’s bundle identifier
paths =
APP协理的门道列表,唯有那几个指定的路线的链接,才能被APP所拍卖,大小写敏感。举个例子,假如你的网站是www.domain.com,你的path写的是”/support/*”,那么当用户点击www.domain.com/support/<path>?<params>=<value>,就足以唤醒APP了,相反www.domain.com/other就不会。其余Apple为了有利于开发者,提供了一个网址来证实我们编辑的这些apple-app-site-association是还是不是合法有效。

  • 激活Xcode工程中的Associated Domains力量,在内部的Domains中填入你想帮衬的域名(那里不是不管填的,是足以支撑您须要的Universal
    Links的域名),
    必须以applinks:为前缀,例如:applinks:www.domain.comApple将会在适当的时候,从那个域名请求apple-app-site-association文件。注意:当你打开Associated Domains后,Xcode会在你的工程中添加.entitlements文件,并且登录开发者中央,能够见见Associated Domains处于Enable状态。

  • AppDelegate里心想事成如下代理方法:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler {
    // NSUserActivityTypeBrowsingWeb 由Universal Links唤醒的APP
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        NSURL *webpageURL = userActivity.webpageURL;
        NSString *host = webpageURL.host;
        if ([host isEqualToString:@"yohunl.com"]) {
            //进行我们需要的处理
        } else {
            [[UIApplication sharedApplication]openURL:webpageURL];
        }
    }
    return YES;
}

至此APP已经打开Universal Links,可以经过链接唤醒APP,并跳转至指定页面了。

  • Android App Links

在二〇一五年的谷歌(Google) I/O大会上,Android M公布了一个新特征:App
Links
让用户在点击一个常备web链接的时候可以打开指定APP的指定页面,前提是以此APP已经安装还要经过了证实,否则会显示一个开拓确认选项的弹出框。在牵动deep
linking上谷歌和Apple可谓英雄所见略同,优缺点也大概相同,只帮忙Android
M以上系统。

举手投足互联时代,很多网络服务都会同时具有网站以及移动客户端,很多个人认为APP的能辅助建立更牢固的用户关系,于是时常会收下各个从浏览器、webview、短信、甚至是在其他APP中唤醒APP的营业必要。

先决条件:
  1. 注册一个域名
  • 域名的SSL通道

  • 有着上传JSON文件到域名的能力

  • Android Studio 1.3 Preview 及以上

  • Gradle 版本 — com.android.tools.build:gradle:1.3.0-beta3 及以上

  • 设置 compileSdkVersion 为 android-MNC 及以上

  • buildToolsVersion — 23.0.0 rc2 及以上

  • 创制一个json格式的web-app关联文件,如assetlinks.json,上传到web端

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "example.com.puppies.app",
    "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"]
  }
  },
  {
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "example.com.monkeys.app",
    "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"]
  }
}]

其中
package_name: manifest中扬言的包名。
sha256_cert_fingerprints: 可以运用如下命令生成APP的sha256指纹签名

// keystore中持有app release keys的app路径。
// 这个路径依赖于项目设置,因此不同的app是不同的。
keytool -list -v -keystore my-release-key.keystore

上传这一个文件到服务器的.well-known/assetlinks.json,为了幸免事后每个app链接请求都访问网络,安卓只会在app安装的时候检查那几个文件。

  • 创制一个甩卖App Links的activity,那个activity的目标是为着贯彻一种那样的建制:负责捕获与分析深度链接,同时转载用户到正确的视图。同时配备激活App Links能力,如下所示:

<activity
  android:name="com.your.app.activity.ParseDeepLinkActivity"
  android:alwaysRetainTaskState="true"
  android:launchMode="singleTask"
  android:noHistory="true"
  android:theme="@android:style/Theme.Translucent.NoTitleBar">

  // 此处激活 App Links
  <intent-filter android:autoVerify="true">
    // 注意yourdomain.com 与 www.yourdomain.com 被看成两个不同的域名,因此你需要为每个域名添加一对http和https
    <data android:scheme="http" android:host="yourdomain.com" />
    <data android:scheme="https" android:host="yourdomain.com" />
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
  </intent-filter>
</activity>
  • 实现App Linksactivity的拍卖逻辑

public class ParseDeepLinkActivity extends Activity {
  public static final String PRODUCTS_DEEP_LINK = "/products";
  public static final String XMAS_DEEP_LINK = "/campaigns/xmas";

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Extrapolates the deeplink data
    Intent intent = getIntent();
    Uri deeplink = intent.getData();

    // Parse the deeplink and take the adequate action 
    if (deeplink != null) {
      parseDeepLink(deeplink);
    }
  }

  private void parseDeepLink(Uri deeplink) {
    // The path of the deep link, e.g. '/products/123?coupon=save90'
    String path = deeplink.getPath();

    if (path.startsWith(PRODUCTS_DEEP_LINK)) {
      // Handles a product deep link
      Intent intent = new Intent(this, ProductActivity.class);
      intent.putExtra("id", deeplink.getLastPathSegment()); // 123
      intent.putExtra("coupon", deeplink.getQueryParameter("coupon")); // save90
      startActivity(intent);
    } else if (XMAS_DEEP_LINK.equals(path)) {
      // Handles a special xmas deep link
      startActivity(new Intent(this, XmasCampaign.class));
    }  else {
      // Fall back to the main activity
      startActivity(new Intent(context, MainActivity.class));
    }
  }
}

至此APP已经打开App Links,可以经过链接唤醒APP,并跳转至指定页面了。

APP服务化理念

所谓APP的服务化就是运用唤醒功效将APP的一定页面做为一个单身的劳务或者内容,通过一定的渠道和载体传播出去,并且可以像传统的网页链接这样被一键唤醒。

更加多关于APP服务化理念,推荐大家看看这篇文章

这就是说移动平台提供了怎么唤醒APP的办法吗?

营业推广场景

  • 微信、QQ等 -> 唤醒APP
    用户通过某APP分享了一条链接至微信或QQ,用户B点开该链接后,会指引用户B打开该APP或者下载该APP。
  • 浏览器 -> 唤醒APP
    用户A通过浏览器打开了某APP的M站或者官网,倘若检测到A来自手机端,则会指引用户打开该APP或者下载该APP。
  • 短信、邮件、二维码等 -> 唤醒APP
    用户A打开了某APP的放手短信,邮件或者扫描二维码等,会指点用户打开该APP或者下载该APP。
  • 其他APP -> 唤醒APP
    用户A通过第三方APP分享了(任何能够分享音讯的品台或工具:IM或者短信等)一条链接至用户B,用户B点开该链接后,链接会指点用户B打开指定APP或者下载指定APP。

Android M开启Universal Links

开启Android App Links的法子也大体同iOS一致:

后记

小结以上各个方案,唤醒能力就好像都不是很周详,从短期技术方平素看都是Deep
Links,都必要

  • 一个协理HTTPS的web站

但面对移动互连网大潮中海量APP的唤起能力急需,一定会有创业企业来做那件事,比如国外的HoKoLinks,国内的魔窗,是自己造轮子,依旧用轮子,各有利弊。

相关文章

网站地图xml地图