Scheme的理解
我们都知道,苹果系统使用沙盒机制来保障用户的隐私和安全,一个App只能访问自己的沙盒,不能访问其他app的信息。这样保证了app的用户的信息的同时,也阻碍了不同的App 之间的信息交流。所以苹果提供了一个可以在App之间跳转的方法:URL Scheme。一个App可以设置自己的URL Scheme,另外的App可以使用这个URL Scheme,然后通过系统的OpenURL来打开该App。就像网页一样,通过一个网址来跳转到另一个网址。
URL的样式
protocol://hostname[:port]/path/[;parameters][?query]#fragment
- protocol(Scheme) :协议名称,例如 http、https,和你自己定义的 Scheme。
- hostname:域名或ip地址,例如 www.baidu.com 就是域名;110.242.68.3就是IP地址。
- port:端口号,例如 www.baidu.com:80后面的80就是端口号,80是默认端口号,一般不显示。
- path:路径,表示主机上的目录或文件路径。例如:https://fanyi.baidu.com/translate。
- query:可选项,用于传递参数,由?符号开始,&符号隔开,参数名和值用=符号相连。例如:https://www.baidu.com/s?ie=utf-8&wd=ios。
举例如下:
shemeUseApp://ipOrYuming:8080/path?param1=xxx¶m2=yyy
设置Scheme的注意点
- URL Scheme必须能唯一标识一个APP。
- 如果你设置的URL Scheme与别的APP的URL Scheme冲突时,你的APP不一定会被启动起来。
注册URL Scheme
-
打开工程,点击项目名称,找到
info
条目,在info
条目下,找到URL Types
-
在
URL Types
处点击“+”号,新增一个URLTypes
,然后填写identifier
和URL Schemes
.- identifier:URL Identifier是自定义的 URL scheme 的名字,一般采用反转域名的方法保证该名字的唯一性。例如:
com.xxxx.schemeUse
。 - URL Schemes:为自己的app定义的schemes。使用另外的app调起自己的app时,使用这个参数,其格式为:
schemeUseApp://
- identifier:URL Identifier是自定义的 URL scheme 的名字,一般采用反转域名的方法保证该名字的唯一性。例如:
验证App的调起
使用上述所说的schemeUseApp://
在浏览器中进行测试。本文使用的是模拟器,在浏览器中输入schemeUseApp://
,点击搜索。
-
如果手机上没有还没有安装app,是找不到的,safari提示的时候是以网址的形式进行提醒,“Safari浏览器打不开该网页,因为网址无效。”
-
手机上已经安装了App的情况下,是可能正常调起。
不同应用之间,带参数的跳转
在跳转的 URL scheme
中可以添加参数,比如:shemeUseApp://ipOrYuming:8080/path?param1=xxx¶m2=yyy
。
在工程的AppDelegate.m
文件中,重写方法- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
,并在方法中进行URL的分析拆解,就可以得到相关的参数。
其程序表现如下:
AppDelegation.m
中的openURL
方法中的打印结果为:
2022-05-09 15:04:35.544398+0800 schemeUse[6268:326999] url : shemeuseapp://ipOrYuming:8080/path?param1=xxx¶m2=yyy
2022-05-09 15:04:35.544524+0800 schemeUse[6268:326999] URL scheme:shemeuseapp
2022-05-09 15:04:35.544580+0800 schemeUse[6268:326999] URL host: ipOrYuming
2022-05-09 15:04:35.544632+0800 schemeUse[6268:326999] URL port: 8080
2022-05-09 15:04:35.544695+0800 schemeUse[6268:326999] URL path: /path
2022-05-09 15:04:35.544739+0800 schemeUse[6268:326999] URL query: param1=xxx¶m2=yyy