前言

接到上级任务,需要给app新增一个检测版本更新的功能(299$账号 不上App Store)。
本文不讨论如何实现一个更新检测功能。

设计思路

1、新建一个继承NSObject的子类。
2、调用网络接口,将服务器版本号与本地版本号对比,得出是否需要弹出更新提示。
3、因为最低版本支持iOS8,所以使用iOS8新出的api UIAlertViewController。

那么问题来了,要弹出UIAlertViewController就必须使用如下方法,该方法又是UIViewController的方法,总不能外部传个ViewController进来吧?

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ __nullable)(void))completion NS_AVAILABLE_IOS(5_0); 

解决方法

//获取当前屏幕显示的UIViewController 
//objc写法
- (UIViewController *)currentViewController {

    UIViewController * result;
    UIWindow * window = [UIApplication sharedApplication].keyWindow;

    if (window.windowLevel != UIWindowLevelNormal) {

        NSArray * windows = [UIApplication sharedApplication].windows;
        for (UIWindow * tmpWin in windows) {

            if (tmpWin.windowLevel == UIWindowLevelNormal) {
                window = tmpWin;
                break;
            }

        }
    }

    UIView * frontView = window.subviews.firstObject;
    UIResponder * nextResponder = frontView.nextResponder;

    if ([nextResponder isKindOfClass:[UIViewController class]]) {
        result = (UIViewController *)nextResponder;
    }
    else {
        result = window.rootViewController;
    }

    return result;
}
//获取当前屏幕显示的UIViewController 
//swift 写法
func currentViewController() -> UIViewController? {

    var result : UIViewController?
    var window = UIApplication.shared.keyWindow

    if window?.windowLevel != UIWindowLevelNormal {

        let windows = UIApplication.shared.windows
        for tmpWin in windows {

            if tmpWin.windowLevel == UIWindowLevelNormal {
                window = tmpWin
                break
            }

        }

    }

    let frontView = window?.subviews.first
    let nextResponder = frontView?.next

    if (nextResponder?.isKind(of: UIViewController.self))! {
        result = nextResponder as! UIViewController?
    }
    else{
        result = window?.rootViewController
    }

    return result
}

================= 2017.03.10更新 =================

针对在rootViewController的viewDidLoad里调用UIApplication.shared.keyWindow时会出现keyWindow为nil的情况作出解释

keyWindow设置过程
1、初始化AppDelegate的window。
2、初始化rootViewController。
3、设置window的rootViewController。
4、调用[self.window makeKeyAndVisible]方法设置window为keyWindow并让window显示在屏幕上。此时keyWindow才不为nil。