一、几种不同的跳转
1、我们在应用中跳转系统设置界面的方法:
在iOS8及以上的系统中,我们可以这样设置:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
2、应用间的跳转
参考:关于iOS应用的跳转
比方说,从A应用跳转到B应用。
- 在B应用中注册跳转的URL(这个URL你随便写,我这只是个示例)
- 在A中添加白名单, iOS9开始必须在info.plist文件中添加白名单LSApplicationQueriesSchemes才可以跳转 否者报错
- 在A应用中打开(在需要跳转的地方加上下面的代码,注意URL要跟在上一步中注册的一致才能打开喔)
//iOS10之后,隐私政策有了改变,需要用新的方法打开跳转应用的URL
NSURL *url = [NSURL URLWithString:@"APPSkip://" ];
if ([[UIDevice currentDevice].systemVersion floatValue]>=10.0) {
[[UIApplication sharedApplication]openURL:url options:@{} completionHandler:^(BOOL success) {
}];
}else{
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
}
3、打开应用的具体界面(接2、)
A和B项目里的设置同2.
代码设置:
- 在B项目里设置打开具体界面的代码
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
NSString *urlString = url.absoluteString;
if ([urlString containsString:@"RedVC"]) {
NextViewController *vc = [[NextViewController alloc]init];
vc.view.backgroundColor = [UIColor redColor];
UIViewController *rootVC = self.window.rootViewController;
[rootVC presentViewController:vc animated:YES completion:^{
}];
}else if ([urlString containsString:@"BlueVC"]){
NextViewController *vc = [[NextViewController alloc]init];
vc.view.backgroundColor = [UIColor blueColor];
UIViewController *rootVC = self.window.rootViewController;
[rootVC presentViewController:vc animated:YES completion:^{
}];
}
return YES;
}
- 在A项目里打开的B项目具体页面的调用代码
- (IBAction)toFriend:(UIButton *)sender {
NSURL *url = [NSURL URLWithString:@"APPSkip://RedVC" ];
if ([[UIDevice currentDevice].systemVersion floatValue]>=10.0) {
[[UIApplication sharedApplication]openURL:url options:@{} completionHandler:^(BOOL success) {
if (success) {
NSLog(@"success");
}else{
NSLog(@"failure");
}
}];
}else{
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
}
}
- (IBAction)toFriendCircle:(UIButton *)sender {
NSURL *url = [NSURL URLWithString:@"APPSkip://BlueVC" ];
if ([[UIDevice currentDevice].systemVersion floatValue]>=10.0) {
[[UIApplication sharedApplication]openURL:url options:@{} completionHandler:^(BOOL success) {
}];
}else{
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
}
}
我在想,既然系统的APP都支持URL跳转,那我们自己的应用是否支持这种简单的用URL跳转的方式呢?
于是,我试着在B项目里面(像在A项目一样调用)
- (IBAction)buttonClick:(UIButton *)sender {
NSURL *url = [NSURL URLWithString:@"APPSkip://BlueVC" ];
if ([[UIDevice currentDevice].systemVersion floatValue]>=10.0) {
[[UIApplication sharedApplication]openURL:url options:@{} completionHandler:^(BOOL success) {
}];
}else{
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
}
}
但是报了一个错误
2017-04-24 17:21:58.641 APPSkip[10443:7204359] -canOpenURL: failed for URL: "APPSkip://BlueVC" - error: "This app is not allowed to query for scheme APPSkip"
需要在B项目,把自己的URL加入白名单(LSApplicationQueriesSchemes
我把这个拼出来,下次设置的时候可以直接复制粘贴)
重新运行,就可以正常跳转了,nice!
二、这种跳转方式的优势和弊端(只是个人拙见啊,我只能想到这么多了,欢迎道友补充指正)
1、优点:
- 从别的应用跳转到本应用的时候可以指定具体界面,而不是固定跳转到主界面,对于像微信,QQ这样的,可能别的应用需要接入咱们的应用,这种情况来说,还是很适用(也就是说开放性比较好吧)
2、缺点:
- 你要在AppDelegate里面引入所有的UIViewController,并且指定跳转,也就是说初始化所有的UIViewController,内存常驻量就会比较大,当项目逐渐大了之后,就会产生性能瓶颈。
3、解决对ViewController的引用依赖
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
NSString *urlString = url.absoluteString;
if ([urlString containsString:@"RedVC"]) {
Class class = NSClassFromString(@"NextViewController");
UIViewController* vc = (UIViewController*)[[class alloc]init];
vc.view.backgroundColor = [UIColor redColor];
UIViewController *rootVC = self.window.rootViewController;
[rootVC presentViewController:vc animated:YES completion:^{
}];
}else if ([urlString containsString:@"BlueVC"]){
Class class = NSClassFromString(@"NextViewController");
UIViewController* vc = (UIViewController*)[[class alloc]init];
vc.view.backgroundColor = [UIColor blueColor];
UIViewController *rootVC = self.window.rootViewController;
[rootVC presentViewController:vc animated:YES completion:^{
}];
}
return YES;
}
这样一来就解决了引用依赖的问题
咱们可以用OC的runtime反射调用的方法解决引用依赖的问题
Class cls = NSClassFromString(@"BookDetailComponent");
id obj = [[cls alloc] init];
return id;
}
下一步,我们重点解决应用内用URL跳转,传参数的问题,等一篇文章,我们在一起探讨一下