一 注册 URL Scheme
1.设置URL Scheme
在safari地址栏中输入:URL Schemes://identifier (例如:iOSEnterURL://com.Demo.www)就可以打开注册了URL Schemes的APP的。
其中URL Schemes是必填的,identifier是选填
- 一般情况下,是会调用先安装的app。但是iOS的系统app的URL Scheme肯定是最高的。所以我们定义URL Scheme的时候,尽量避开系统app已经定义过的URL Scheme
2. 在appdelegate中编写代码
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
//打开链接会走这个方法
return YES;
}
#else
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation{
//打开链接会走这个方法
return YES;
}
#endif
二 打开其他应用
2.1 应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。否则报错:
This app is not allowed to query for scheme…
2.2 相关API
// iOS10 以及以后
- (void)openURL:(NSURL*)url options:(NSDictionary *)options
completionHandler:(void (^ __nullable)(BOOL success))completion;
// iOS10 以前
- (void)openURL:(NSURL*)url;
url:打开APP的URL
options:可选字典参数。参数可以为空,也可以下边的参数
- 空字典:可以达到openURL:一样的行为
- @{}
- UIApplicationOpenURLOptionUniversalLinksOnly:如果这个要打开的URL有效,并且在应用中配置它布尔值为true(YES)时才可以打开,否则打不开。
- 例如:@{UIApplicationOpenURLOptionUniversalLinksOnly : @YES}
- 空字典:可以达到openURL:一样的行为
completion:执行成功后completionhandler在主队列中回调。如果你并不关心它的返回状态也可以传空。
相关代码
//[self openScheme:@"iOSEnterURL://"];
- (void)openScheme:(NSString *)scheme {
UIApplication *application = [UIApplication sharedApplication];
NSURL *URL = [NSURL URLWithString:scheme];
//iOS 10 以后
if ([application respondsToSelector:@selector(openURL:options:completionHandler:)]) {
//1 如果这个要打开的URL有效,并且在应用中配置它布尔值为true(YES)时才可以打开,否则打不开
NSDictionary *options = @{UIApplicationOpenURLOptionUniversalLinksOnly : @YES};
//2 此时与openURL功能相似
// NSDictionary *options =@{}
[application openURL:URL options:options
completionHandler:^(BOOL success) {
NSLog(@"Open %@: %d",scheme,success);
}];
} else {
if ([application canOpenURL:URL]) {
BOOL success = [application openURL:URL];
NSLog(@"Open %@: %d",scheme,success);
}
}
}