美文网首页iOS SDK 开发总结
四、SDK 接口设计之SDK 入口页面的跳转

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

作者: TankXie | 来源:发表于2019-03-06 11:11 被阅读5次

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

  • 带有 UI 界面的 SDK,我们开发的大部分 SDK 都是这一类
  • 不带有 UI 界面的 SDK,比如 token 计算的 SDK

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

1. 跳转分析

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

  • present ViewController
  • navigation controller push ViewController
  • 使用 UIWindow

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

  • 外部 APP 调用页面类型未知,调用 SDK 的有可能是普通的 ViewController,也有可能是 navigation controller ,还有可能是一个 tabbar ViewController,...
  • 不能污染外部的页面,退出 SDK 的时候要还原全局设置,比如 status bar 的隐藏和显示状态,status bar 的 UI 风格是浅色还是深色,页面是否常亮,...

2. 跳转的最终方案

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

  • 使用 UIWindow 呈现 SDK
  • 使用 present 方式,SDK 内部页面用 navigation controller 管理

我们诸多 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 方法获取当次业务对应的目标页面。

相关文章

网友评论

    本文标题:四、SDK 接口设计之SDK 入口页面的跳转

    本文链接:https://www.haomeiwen.com/subject/uhazuqtx.html