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),與本身趟坑的一些體會。