感谢
昨天写了一篇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中打开设置中的指定模块,然后网友海泉评论了我,否则我还不知道这些,还会一直蒙在鼓里.再次感谢!
其实,在这过程中我漫山遍野的找了很多东西.这也暴露了自己的很多弱点.有时间,写点东西还是很不错的.虽然写得很简陋.
- 通过乞讨而得来的技术,永远做不到自力更生.
- 但是不要忘了,时时刻刻向优秀的人学习.
与优秀的人在一起,能让自己变得更优秀.
网友评论
摘出那句特定的话:指明"App-Prefs:root" 也是不可以使用的
remove the functionality using the "prefs:root" or "App-Prefs:root" URL scheme.
下面是审核原文:
Guideline 2.5.1 - Performance - Software Requirements
Your app uses the "prefs:root=" non-public URL scheme, which is a private entity. The use of non-public APIs is not permitted on the App Store because it can lead to a poor user experience should these APIs change.
Continuing to use or conceal non-public APIs in future submissions of this app may result in the termination of your Apple Developer account, as well as removal of all associated apps from the App Store.
Next Steps
To resolve this issue, please revise your app to provide the associated functionality using public APIs or remove the functionality using the "prefs:root" or "App-Prefs:root" URL scheme.
If there are no alternatives for providing the functionality your app requires, you can file an enhancement request.
if ([[UIApplication sharedApplication] canOpenURL:appSettingURL]) {
[[UIApplication sharedApplication] openURL:appSettingURL];
} 只能跳转自己App的设置页面