由于apple沙盒机制的限制,App之间的文件系统是不能相互访问的,也就是说A是不能访问B的文件数据的,好在apple可以通过openURL的方式打开另外一个App并向被打开者App传递数据,这里有一个相当于协议头的URL Schems,那么什么是URL Schems呢?
为方便app之间互相调用而设计的。你可以通过一个类似URL的链接,通过系统的OpenURl来打开该app,并可以传递一些参数。每个URL必须能唯一标识一个APP,如果你设置的URL与别的APP的URL冲突,此时,你的APP不一定会被调用起来,原因是当APP在安装的时候就已经在系统里面注册了此APP的URL Scheme,如果你的一致但是是后安装的,那么系统不会调用你的APP,因为你的APP设置的URL scheme被覆盖了,当然系统的APP的URL Scheme是优先级高的(比如电话、短信),不用想着能覆盖系统APP的URL Scheme的注册调用.
比如我们在使用微信或者支付宝支付的时候,支付成功后支付宝需要打开我们自己开发的app,并将支付结果带回到我们的App内部,这其中就涉及到使用URL Schems传递数据了,比如一个URL Schems:tel://123456789, 这里的"tel"就是统一资源定位符中的协议头,它代表你可以打开配置了协议头是"tel"的app,当然了,这就是iPhone系统电话的scheme,
如何配置url schems呢?
A要打开B 就需要在A工程中配置LSApplicationQueriesSchemes中配置B的协议头比如"openB",然后在B工程中的"URL Types"里面加入自己的协议头"openB",在要打开的时候做安全判断:
NSURL *uploadURl = [NSURL URLWithString:@"openB://paramsToB"];
if ([[UIApplication sharedApplication] canOpenURL:uploadURl]) {
[[UIApplication sharedApplication] openURL:uploadURl];
} else {
NSLog(@"失败!");
}
在B工程中的这里可以看到A传过来的数据:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
NSLog(@"url = %@ -- sourceApplication = %@ -- annotation = %@",url,sourceApplication,annotation);
if ([sourceApplication rangeOfString:@"com.bunbleIdentifier.A"].length) {
//被A打开的
//数据存在于URL当中
}
return YES;
}
比如在做微信支付里面就需要配置微信的白名单,并且还要讲自己的bundleId给微信开发者后台,便于在微信支付成功之后在这个方法里面处理- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
将支付结果带回我们自己开发的App
作者:mrChan1234