UIApplication扩展

接口部分

@interface UIApplication (Extend)

-(void)_openUrl:(NSURL *)url;

-(void)_openUrl:(NSURL *)url options:(NSDictionary<UIApplicationOpenExternalURLOptionsKey, id> *)options completionHandler:(void (^ __nullable)(BOOL success))completion;

-(nullable UIViewController *)getTopViewController:(UIViewController *)viewController;

-(nullable UIViewController *)rootViewController;
-(nullable UIViewController *)visibleViewController;

@end

实现部分

@implementation UIApplication (Extend)

-(void)_openUrl:(NSURL *)url
{
    if ([self canOpenURL:url]) {
        if (@available(iOS 10, *)) {
            [self openURL:url options:@{} completionHandler:^(BOOL success) {}];
        }
        else
        {
            [self openURL:url];
        }
    }
}
-(void)_openUrl:(NSURL *)url options:(NSDictionary<UIApplicationOpenExternalURLOptionsKey, id> *)options completionHandler:(void (^ __nullable)(BOOL success))completion
{
    if ([self canOpenURL:url]) {
        if (@available(iOS 10, *)) {
            [self openURL:url options:options completionHandler:completion];
        }
        else
        {
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                BOOL res = [self openURL:url];
                dispatch_async(dispatch_get_main_queue(), ^{
                    completion(res);
                });
            });
        }
    }
    else
    {
        completion(NO);
    }
}

-(UIViewController *)getTopViewController:(UIViewController *)viewController
{
    if (viewController == nil) {
        return nil;
    }
    else if ([viewController isKindOfClass:[UINavigationController class]])
    {
        UINavigationController *navVC = (UINavigationController *)viewController;
        return [self getTopViewController:navVC.visibleViewController];
    }
    else if ([viewController isKindOfClass:[UITabBarController class]])
    {
        UITabBarController *tabVC = (UITabBarController *)viewController;
        return [self getTopViewController:tabVC.selectedViewController];
    }
    else if (viewController.presentedViewController){
        return [self getTopViewController:viewController.presentedViewController];
    }
    else
    {
        return viewController;
    }
}
-(nullable UIViewController *)rootViewController
{
    return self.delegate.window.rootViewController;
}
-(nullable UIViewController *)visibleViewController
{
    UIViewController *rootVC = [self rootViewController];
    return [self getTopViewController:rootVC];
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容