iOS SDK 开发总结

四、SDK 接口设计之SDK 入口页面的跳转

2019-03-06  本文已影响5人  TankXie

按照 SDK 是否有界面来进行分类,我们开发的 SDK 无外乎就两类:

从接口设计角度,前者比较复杂,本文介绍如何设计 外部APP 页面到 SDK 内部页面的跳转。

1. 跳转分析

iOS 页面呈现,最常用的方式有两类:

设计的时候有以下几个点需要注意:

2. 跳转的最终方案

在我们的 SDK 中,进入 SDK 页面有两种主流方案:

我们诸多 SDK 中,两种方式都有用到,本文讲解后者。

由于 SDK 中涉及到页面 push,最终选择的方案是在 APP 的调用页面,present navigation controller,将 SDK 的首页设置为 navigation controller 的 root ViewController。

3. 跳转相关细节

SDK 鉴权

先对外部传入的参数进行校验,权限查询,这一步骤通过之后,才能进入下一步骤。

获取 APP 调用 SDK 的 ViewController

基本思路是,获取当前 APP keyWindow 的 rootViewController,然后分类逐层找到最上层的 ViewController。

#pragma mark - private method
// 获取应用当前界面,调用SDK的界面
- (UIViewController*)topViewController {
    return [self topViewControllerWithRootViewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}
- (UIViewController*)topViewControllerWithRootViewController:(UIViewController*)rootViewController {
    
    if ([rootViewController isKindOfClass:[UITabBarController class]]) {
        NSLog(@"root:UITabBarController");
        UITabBarController* tabBarController = (UITabBarController*)rootViewController;
        return [self topViewControllerWithRootViewController:tabBarController.selectedViewController];
        
    } else if ([rootViewController isKindOfClass:[UINavigationController class]]) {
        NSLog(@"root:UINavigationController");
        UINavigationController* navigationController = (UINavigationController*)rootViewController;
        return [self topViewControllerWithRootViewController:navigationController.visibleViewController];
        
    } else if (rootViewController.presentedViewController) {
        NSLog(@"root:rootViewController.presentedViewController");
        UIViewController* presentedViewController = rootViewController.presentedViewController;
        return [self topViewControllerWithRootViewController:presentedViewController];
        
    } else {
        NSLog(@"root:rootViewController");
        return rootViewController;
        
    }
}

跳转

通过上面步骤,获取到 rootViewController ,然后在 rootViewController 基础上进行跳转。

WBNavigationController *nav = [[WBNavigationController alloc] initWithRootViewController:[self getTargetViewController]];
[rootViewController presentViewController:nav animated:NO completion:nil];

其中,WBNavigationController 继承自 UINavigationController;
SDK 中包含多个业务,不同业务进入的页面不一样,getTargetViewController 方法获取当次业务对应的目标页面。

上一篇 下一篇

猜你喜欢

热点阅读