iOS 唤起APP之URL Scheme

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 唤起APP之URL Scheme相关的知识,希望对你有一定的参考价值。

参考技术A 简单的说,由于苹果选择使用沙盒机制来保障用户的隐私和安全,APP只能访问自己沙盒数据,但同时也阻碍了应用间合理的信息共享。因此苹果提供了一个可以在APP之间跳转的方法: URL Scheme 。如果你的APP需要其他APP访问某些功能或者数据,那么你需要在你的APP定义一个相应的 URL Scheme 。当别的APP使用 URL Scheme 进行访问时,系统会根据 URL Scheme 进行匹配,从而来拉起对应的APP。

如果想要更清晰的认识 URL Scheme 电话,我们需要了解下面几个概念:

这样一对比就容易很明白的理解出了URL Scheme的真正含义,它是为了在ios系统中定位对应的App然后执行对应的操作,复杂的URL Scheme还可以传递参数。

所以说了那么多,有一种跳转方式可以既满足跳转的动态需求,也可以灵活的传递参数。这种方式就是使用URL Scheme进行动态跳转。这也是我非常推荐的一种使用方式。并且在一些组件化开发的尝试中,这种跳转方式也带来了很多便利。

第三方应用可以通过①给自己发送 URL Scheme 请求来证明没有被劫持,如果没有收到自己的 URL Scheme,就可以及时给用户发送提醒;②利用 MobileCoreServices 服务中的 applicationsAvailableForHandlingURLScheme() 来查看所有注册了该 URL Schemes 的应用和处理顺序,从而检测自己、或者别人的 URL Scheme 是否被劫持。

注册自定义URL Scheme有两种方式

这两种注册方式本质上其实是一样的只是位置不同。

我们需要在APPdelegate中实现相应的代理方法:

iOS 9.0以下
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
iOS 9.0以上
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;

下面我们通过Safari来验证:

在应用中调用URL Scheme需要是以下方法:

iOS10.0以下使用该方法:
- (BOOL)openURL:(NSURL*)url NS_DEPRECATED_IOS(2_0, 10_0, "Please use openURL:options:completionHandler: instead") NS_EXTENSION_UNAVAILABLE_IOS("");
iOS10.0以上使用该方法:
- (void)openURL:(NSURL*)url options:(NSDictionary<UIApplicationOpenExternalURLOptionsKey, id> *)options completionHandler:(void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS("");
还有一个方法可以判断对应URL Scheme是否存在一般和上述方法一起使用:
- (BOOL)canOpenURL:(NSURL *)url NS_AVAILABLE_IOS(3_0);

下面来验证一下:

React Native之配置URL Scheme(iOS Android)

React Native之配置URL Scheme(iOS Android)

一,需求分析

 1.1,需要在网站中打开/唤起app,或其他app中打开app,则需要设置URL Scheme。比如微信的是:weixin://

二,URL Scheme介绍

2.1,URL Scheme是什么?

URL Scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。

苹果手机中的APP都有一个沙盒,APP就是一个信息孤岛,相互是不可以进行通信的。但是iOS的APP可以注册自己的URL Scheme,URL Scheme是为方便app之间互相调用而设计的。

URL Scheme必须能唯一标识一个APP,如果你设置的URL Scheme与别的APP的URL Scheme冲突时,你的APP不一定会被启动起来。因为当你的APP在安装的时候,系统里面已经注册了你的URL Scheme。 

2.2,URL Scheme应用场景

客户端应用可以向操作系统注册一个 URL scheme,该 scheme 用于从浏览器或其他应用中启动本应用。通过指定的 URL 字段,可以让应用在被调起后直接打开某些特定页面,比如商品详情页、活动详情页等等。也可以执行某些指定动作,如完成支付等。也可以在应用内通过 html 页来直接调用显示 app 内的某个页面。综上URL Scheme使用场景大致分以下几种:

  1. 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面
  2. H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面
  3. APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
  4. APP根据URL跳转到另外一个APP指定页面

2.3,URL Scheme的协议格式

完整的URL Scheme协议格式:

1 opengs://tasks:8088/tasksDetail?tasksId=102

通过上面的路径 Scheme、Host、port、path、query全部包含,基本上平时使用路径就是这样子的。

  1. opengs代表该Scheme 协议名称
  2. tasks代表Scheme作用于哪个地址域
  3. tasksDetail代表Scheme指定的页面
  4. tasksId代表传递的参数
  5. 8088代表该路径的端口号

三,URL Scheme配置

3.1,Android配置

URL Scheme的使用要先在AndroidManifest.xml中配置能接受Scheme方式启动的activity:

 1 <activity
 2 
 3          ...
 4 
 5             <!--要想在别的App上能成功调起App,必须添加intent过滤器-->
 6             <intent-filter>
 7                 <!--协议部分,随便设置-->
 8                 <data
 9                     android:host="tasks"
10                     android:path="/tasksDetails"
11                     android:port="8080"//可以不要
12                     android:scheme="opengs"/>
13                 <!--下面这几行也必须得设置-->
14                 <category android:name="android.intent.category.DEFAULT"/>
15                 <action android:name="android.intent.action.VIEW"/>
16                 <category android:name="android.intent.category.BROWSABLE"/>
17             </intent-filter>
18         </activity>

需要配置能被js调起,一定要配置下面这句

1  <category android:name="android.intent.category.BROWSABLE"/>
1  <!--必有项-->
2         <action android:name="android.intent.action.VIEW" />
3         <!--表示该页面可以被隐式调用,必须加上该项-->
4         <category android:name="android.intent.category.DEFAULT" />
5         <!--如果希望该应用可以通过浏览器的连接启动,则添加该项-->
6         <category android:name="android.intent.category.BROWSABLE" />

 

3.2,iOS配置

注册URL Scheme,即配置info.plist 文件即可

直接调用URL Scheme也可打开程序, URL identifier是可选的。

四,调用方式

4.1,web端调用

1 <a href="opengs://" onclick="openAppisLink()">打开APP ></a>

如果在2s还没打开app,则跳转到下载页面

 1 var appstore, ua = navigator.userAgent;
 2       if (ua.match(/Android/i)) {
 3         appstore = \'http://www.yingqigroup.top\';
 4       }
 5       if (ua.match(/iphone|ipod|ipad/)) {
 6         appstore = \'http://www.yingqigroup.top\';
 7       }
 8       function openAppisLink() {
 9         var clickedAt = +new Date;
10         // During tests on 3g/3gs this timeout fires immediately if less than 500ms.  
11         setTimeout(function () {
12           // To avoid failing on return to MobileSafari, ensure freshness!  
13           if ((+new Date - clickedAt) < 12000) {
14             window.location.href = appstore;
15           }
16         }, 3000);
17       }

4.2,app端调用(原生)

android

1 Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("opengs://"));
2   startActivity(intent);

ios

 1  NSString *url = @"opengs://";
 2 //    NSString *url = @"opengs://com.opengs.www";
 3 if ([[UIApplication sharedApplication]
 4      canOpenURL:[NSURL URLWithString:url]])
 5 {
 6     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
 7 }
 8 else
 9 {
10     NSLog(@"can not open URL scheme opengs");
11 }

 

以上是关于iOS 唤起APP之URL Scheme的主要内容,如果未能解决你的问题,请参考以下文章

React Native之配置URL Scheme(iOS Android)

ios外部链接或者app唤起自己的app

Android使用URL Scheme唤起APP

H5按钮唤起APP应用(IOS)或跳转至APPstore

iOS 唤起APP

Ios/Android h5 唤起本地APP