CoderHG.iOS征服iOS

iOS在App中打开设置中的指定模块(终)

2016-12-08  本文已影响1460人  CoderHG

感谢

昨天写了一篇iOS在App中打开设置中的指定模块,写完之后,正好用了iOS 10一下的设备测试了一下,误以为大功告成,感谢网友海泉的评论.才得知,iOS 10之后苹果已经废弃了之前打开设置的方法.
现将,我最终的得出的结论写在下面.

在看之前可以先看看这个大神的总结URL Scheme 列表,URL Scheme在后来的系统中被苹果改了.字母大写.

接下来,我会以在APP中打开Wi-Fi界面为影子编写.

打开APP的设置界面

iOS是不允许打开系统的设置的,但是能打开当前APP的设置.你会在很多的地方找到一下的代码:

// 打开系统的Wi-Fi界面,当系统大于10的时候直接打开当前App的设置界面
- (void)openWiFi {
    NSURL *url = [NSURL URLWithString:@"Prefs:root=WIFI"];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        // 系统的Wi-Fi界面
        [[UIApplication sharedApplication] openURL:url];
    } else {
        // 系统大于10的时候直接打开当前App的设置界面
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
    }
}

你可能也会兴高采烈的将上面的代码Copy到你的项目中,发现iOS 10以下是正常的,但是在iOS 10之后就出现问题了.你会有这样的发现,是跳出去了,闪现了一下设置界面,但是设置界面闪了了一下就不见了.切记:是设置界面.你还会发现当前的App没有闪退,只是在后台运行罢了.

为什么会这样呢?
就这个问题,我找啊找,找啊找,最后找到了答案.

在调用[NSURL URLWithString:UIApplicationOpenSettingsURLString]];之前需要先调用下面的代码注册:

     UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];

照办,果真好了,能正常跳转了.仔细一看,这不是在iOS 10的注册推送的方法么?这里我就不知道是为什么了.打开APP的设置界面,还必须要注册通知???????如果这个APP没有推送功能,也要注册??????那就这样吧,反正是苹果自己定的.

即使这样,但是很多的网友也是这样做的.其实,这样做也很不错的了.但是如果需求一定要让在APP中打开Wi-Fi列表呢?要知详细内容,请看下面分解.

坚决在iOS 10系统中打开系统的Wi-Fi界面(1)

那也是有方法的,代码如下:

// 私用API打开系统WIFI界面
- (void)privateAPIOpenWiFi {
    NSURL*url=[NSURL URLWithString:@"Prefs:root=WIFI"];
    Class LSApplicationWorkspace = NSClassFromString(@"LSApplicationWorkspace");
    [[LSApplicationWorkspace performSelector:@selector(defaultWorkspace)] performSelector:@selector(openSensitiveURL:withOptions:) withObject:url withObject:nil];
}

不用多说,看注释就知道了,这是一个私有的API.功能是实现了,但是不能上App Store. 突然之间想泪崩.

坚决在iOS 10系统中打开系统的Wi-Fi界面(2)

可以借助新出的TodayExtension来做,自己创建一个Target,然后拖一个按钮,然后拉一个事件,代码如下:

- (IBAction)btnClick:(id)sender {
    NSURL *url = [NSURL URLWithString:@"Prefs:root=WIFI"];
    [self.extensionContext openURL:url completionHandler:^(BOOL success) {
        NSLog(@"%@", success?@"成功":@"失败");
    }];
}

这个方法,确实不错.
但是,还是想上面说的一样.为了实现这么一个功能,我还要弄一个TodayExtension.这也太屌丝了.

其实后来我又在想,尽然这样可以,那在iOS的控制器中应该也可以把,毕竟控制器都是UIViewController.后来发现,在iOS中的控制器中.self.extensionContext 是nil.所以不行.

别忘了,我的目的是在APP中打开系统的WiFi列表界面.

** 后来更新的方法 **

// 在iOS 10以上打开WIFI列表
- (void)openWIFIiOS10 {
    NSURL *url = [NSURL URLWithString:@"app-Prefs:root=WIFI"];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    }
}

看看接下来的方案吧

坚决在iOS 10系统中打开系统的Wi-Fi界面

这里就不用写了,直接看这篇文章.NetworkExtension.最终我选择了这个方法.预祝一切顺利.

写在最后的话

幸好我昨天写了这篇文章:iOS在App中打开设置中的指定模块,然后网友海泉评论了我,否则我还不知道这些,还会一直蒙在鼓里.再次感谢!

其实,在这过程中我漫山遍野的找了很多东西.这也暴露了自己的很多弱点.有时间,写点东西还是很不错的.虽然写得很简陋.



与优秀的人在一起,能让自己变得更优秀.


上一篇下一篇

猜你喜欢

热点阅读