URL Scheme与openURL

URL Schemes

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

 

在safari中打开

注册了URL Schemes的应用,用safari浏览器也是能够打开的。用这个能够来验证应用是否设置了想要的URL Schemes
方法:直接在safari的地址栏输入testapp://, enter就能够打开了spa

 

canOpenURL

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 Schems传递数据

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间的数据传递。

如下是这三个回调的区别:

  • 3个回调的功能基本同样,都是在别人经过URL Schemes打开应用的时候会执行的。
    不一样之处:
  • A回调是在iOS2.0的时候推出的,参数只有url
  • B回到是在iOS4.2的时候推出的,参数有url sourceApplication annotation.
  • C回调是iOS9.0的时候推出的,参数有url optionsoptions有下面几个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
  • 这几个回调是有优先级的。C>B>A。也就是说,若是你3个回调都实现了,那么程序只会执行C回调。其余回调是不会执行的。(固然,iOS9如下只会执行B回调)。

 

最后,在接入多个sdk的时候,sdk之间可能会重写openurl方法,可能会致使A把B盖住了,B的openurl回调再也调用不起来。

举个例子,项目接入了shareSDK和facebookSDK,就发现facebookSDK的登陆回调一直拉不起来。

如何验证这一点,能够在回调处打断点,以下图:

若是根本断不到,多半就是被别的干掉了,搜下项目里还有没有相似的AppController里也实现了这个函数,看看别的sdk是怎么干掉的,要么作取舍,要么花力气作兼容。

 

整理自(http://www.jianshu.com/p/0811ccd6a65d),与本身趟坑的一些体会。

相关文章
相关标签/搜索