URL Schemes是苹果给出的用来跳转到系统应用或者跳转到别人的应用的一种机制。同时还能够在应用之间传数据。浏览器
设置一个URL Schemes:选中App工程->Info->URL Types里添加,能够添加多个。app
在Info.plist里是这样的:函数
打开App的代码是这样的:ui
1 NSURL *url = [NSURL URLWithString:@"testapp://"]; 2 [[UIApplication sharedApplication] openURL:url];
若是两个应用有URL Schemes是相同的,后安装的应用的URL Schemes会把早安装的应用的URL Schemes覆盖掉。url
注册了URL Schemes的应用,用safari浏览器也是能够打开的。用这个能够来验证应用是否设置了想要的URL Schemes
方法:直接在safari的地址栏输入testapp://
, enter就能够打开了spa
canOpenURL
方法判断可否打开这个url,而后再用openURL
方法打开该URL的。这样能够带来更好的用户体验。code
1 if ([[UIApplication sharedApplication] canOpenURL:url]) { 2 [[UIApplication sharedApplication] openURL:url]; 3 }
iOS9的时候苹果增强了权限,只有在info.plist文件中加入了URL Schemes白名单才能使用canOpenURL:
方法来判断是否能打开该url。该白名单的上限是50个。blog
白名单在这添加(图中是接入FacebookSDK后添加的项):it
对应的Info.plist:io
URL Schemes除了能够用来打开APP以外,还能够用来在两个App之间传递少许的数据。
1 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED; 2 3 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED; 4 5 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0); // no equiv. notification. return NO if the application can't open for some reason
url能够这么写:testapp://www.abc.com/abc?title=hello&content=helloworld,以上三个方法的url就会接收到后面的参数信息,这样就实现了app间的数据传递。
如下是这三个回调的区别:
url
。url
sourceApplication
annotation
.url
options
。options
有下面几个key // Keys for application:openURL:options: UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsSourceApplicationKey NS_AVAILABLE_IOS(9_0); // value is an NSString containing the bundle ID of the originating application UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsAnnotationKey NS_AVAILABLE_IOS(9_0); // value is a property-list typed object corresponding to what the originating application passed in UIDocumentInteractionController's annotation property UIKIT_EXTERN NSString *const UIApplicationOpenURLOptionsOpenInPlaceKey NS_AVAILABLE_IOS(9_0); // value is a bool NSNumber, set to YES if the file needs to be copied before use
最后,在接入多个sdk的时候,sdk之间可能会重写openurl方法,可能会致使A把B盖住了,B的openurl回调再也调用不起来。
举个例子,项目接入了shareSDK和facebookSDK,就发现facebookSDK的登陆回调一直拉不起来。
如何验证这一点,能够在回调处打断点,以下图:
若是根本断不到,多半就是被别的干掉了,搜下项目里还有没有相似的AppController里也实现了这个函数,看看别的sdk是怎么干掉的,要么作取舍,要么花力气作兼容。
整理自(http://www.jianshu.com/p/0811ccd6a65d),与本身趟坑的一些体会。