无论是安卓还是 iOS,应用之间的跳转最常用的就是 URL Scheme,比如打电话和发短信给 100086,可以在浏览器的地址栏输入以下的信息:
1 2 3 |
tel://100086 sms://100086 |
我们来测试下通过 URL Scheme 实现应用之间的跳转和传递参数。首先新建一个工程,编写一个应用 A,然后在 Info.plist 添加相应的 URL_Scheme,添加方法如下图,新建一个 URL types 数组,再新建 item 字典,在 item 下新建相应的 URL_Scheme 名称,名称可以注册多个。
然后在 AppDelegate 添加方法,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { // 接受传过来的参数 NSLog(@"sourceApplication: %@", sourceApplication); NSLog(@"URL scheme:%@", [url scheme]); NSLog(@"URL url:%@", [url absoluteString]); NSLog(@"URL query: %@", [url query]); UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"打开 test" message:[url query] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; return YES; } |
然后在浏览器上输入:
1 2 |
exchen://test?go=www.baidu.com |
sourceApplication 参数是调用者的 Bundle ID, url 参数是具体的 URL 信息,输出的信息如下:
1 2 3 4 5 |
2019-03-28 20:40:58.008728+0800 URLSchemeTest[2329:205132] sourceApplication: com.apple.mobilesafari 2019-03-28 20:40:58.008934+0800 URLSchemeTest[2329:205132] URL scheme:exchen 2019-03-28 20:40:58.008990+0800 URLSchemeTest[2329:205132] URL url:exchen://test?go=www.baidu.com 2019-03-28 20:40:58.009028+0800 URLSchemeTest[2329:205132] URL query: go=www.baidu.com |
除了在浏览器上输入,在应用之间跳转可以使用 [UIApplication OpenURL:],比如再建一个工程编写应用 B,调用 openURL 可以跳转到应用 A,能够通过 URL 传递参数。
1 2 3 4 5 6 7 8 |
NSString *str = @"exchen://test?go=www.baidu.com"; NSString *url = [NSURL URLWithString:str]; //首先使用 canOpenURL 判断下是否能打开 if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; } |
苹果一共给了三个回调,参数分别如下:
1 2 3 4 |
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED; - (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; - (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 |
第一个回调是在 iOS 2.0 的时候推出的,参数只有 url。
第二个回调是在 iOS 4.2 的时候推出的,参数有 url、sourceApplication、 annotation。
第三个回调回调是 iOS 9.0的时候推出的,参数有 url、options。
转载请注明:exchen's blog » iOS URL Scheme 应用之间的跳转