一、什么是scheme?
我们知道在ios的程序中,由于沙盒的限制,导致程序之间相互隔离,没有一个有效的办法进行相互通信。但是也不是完全不可能实现,我们可以通过scheme url来实现程序间的通信。
典型的应用就是支付宝,新浪分享,微信分享。当你在一个网页中进行浏览的时候,如果你已经安装了支付宝的话,你点击支付功能的话,就通过设置的scheme url跳转到支付宝的支付界面。
二、配置scheme
如何实现像支付宝那样的功能呢,很简单,通过在ios程序中添加自定义协议(scheme)。在你的应用中的info.plist文件中添加URL Type节点。这个节点包括:这个程序所支持的自定义协议名称,像 http、ftp 这种,一般我们可以设置为程序英文名称,像淘宝客户端中就设置了 taobao,这样 taobao:// 这个形式的 URL 就会关联到淘宝客户端的 App。
注意:亲测对于那个Identifier,目前不知道用处是什么,希望网友给出指正。url scheme 就是要你在其他程序中要回调的url。
三、使用safari或者其他程序调用你自定义的的scheme
使用模拟器调用应用的步骤:
1. 在 Xcode 中运行应用
2. 一旦应用被安装,自定义 URL scheme 就会被注册
3. 通过模拟器的硬件菜单中选择 Home 来关闭应用
4. 启动 Safari
5. 在浏览器地址栏输入之前定义的 URL scheme(如下)
这样你就可以在浏览器中通过你自定义的scheme调用你的app。
当然你也可以在另外一个app中通过你自定义的scheme调用的你的app。实现步骤:
- (void)showScheme:(UIButton *)button {
NSString *customURL = @"iosApp://";
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:customURL]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
} else {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Test" message:nil preferredStyle:UIAlertControllerStyleAlert];
....
}
}
代码中我们可以通过检测url是不是被定义,如果定义了直接打开url,否则提示未定义。
通过自定义 URL Scheme 向应用传递参数(回调函数)
有时你需要通过自定义 URL 向应用中传递参数。让我们看看该如何完成这个工作。
NSURL 作为从一个应用调用另一个的基础,遵循 RFC 1808 (Relative Uniform Resource Locators) 标准。 因此你所熟悉的基于网页内容的 URL 格式在这里也适用。
在自定义了 URL scheme 的应用中,app delegate 必须实现以下方法:
在AppDelegate中可以实现下面的两个方法
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
说明:
(1)上面的两个函数作用是一致的只是参数不同而已,函数的返回值是BOOL,如果为YES表示可以打开,NO表示不可以打开应用程序
(2)参数可以通过[url query]来获取,比如使用的是devzeng://?token=123abct®istered=1那么通过[url query]获取到的值是token=123abct®istered=1,然后可以通过这些数据再作相应的处理.
(3)调用的应用程序的Bundle ID可以通过sourceApplication参数获取
(4)通过[url scheme]可以获取到请求的URL Scheme,比如是通过devzeng://打开的那么[url scheme]的值就是devzeng。可以通过不同的参数来判断来源的合法性
从一个应用传递参数到另一个的诀窍是通过 URL。例如,假设我们使用以下的 URL scheme,想传递一个名为 “token”的参数和一个标识注册状态的标志,我们可以像这样创建一个 URL:
第三方URL:
wb2239427625://response?id=C3316AD8-74C0-4B26-9EEF-3A6ECEBF21FF&sdkversion=2.5
在 web 开发中,字符串 ?token=123abct®istered=1 被称作查询询串(query string)。
示例:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
if ([sourceApplication isEqualToString:@"com.devzeng.demo.urlscheme"])
{
NSLog(@"调用的应用程序的Bundle ID是: %@", sourceApplication);
NSLog(@"URL scheme:%@", [url scheme]);
NSLog(@"URL query: %@", [url query]);
return YES;
}
else
{
return NO;
}
}