感謝
昨天寫了一篇iOS在App中打開設置中的指定模塊,寫完之后,正好用了iOS 10一下的設備測試了一下,誤以為大功告成,感謝網(wǎng)友海泉的評論.才得知,iOS 10之后蘋果已經(jīng)廢棄了之前打開設置的方法.
現(xiàn)將,我最終的得出的結論寫在下面.
在看之前可以先看看這個大神的總結URL Scheme 列表,URL Scheme在后來的系統(tǒng)中被蘋果改了.首字母大寫.
接下來,我會以在APP中打開Wi-Fi界面為影子編寫.
打開APP的設置界面
iOS是不允許打開系統(tǒng)的設置的,但是能打開當前APP的設置.你會在很多的地方找到一下的代碼:
// 打開系統(tǒng)的Wi-Fi界面,當系統(tǒng)大于10的時候直接打開當前App的設置界面
- (void)openWiFi {
NSURL *url = [NSURL URLWithString:@"Prefs:root=WIFI"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
// 系統(tǒng)的Wi-Fi界面
[[UIApplication sharedApplication] openURL:url];
} else {
// 系統(tǒng)大于10的時候直接打開當前App的設置界面
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
}
你可能也會興高采烈的將上面的代碼Copy到你的項目中,發(fā)現(xiàn)iOS 10以下是正常的,但是在iOS 10之后就出現(xiàn)問題了.你會有這樣的發(fā)現(xiàn),是跳出去了,閃現(xiàn)了一下設置界面,但是設置界面閃了了一下就不見了.切記:是設置界面.你還會發(fā)現(xiàn)當前的App沒有閃退,只是在后臺運行罷了.
為什么會這樣呢?
就這個問題,我找啊找,找啊找,最后找到了答案.
在調用[NSURL URLWithString:UIApplicationOpenSettingsURLString]];之前需要先調用下面的代碼注冊:
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];
照辦,果真好了,能正常跳轉了.仔細一看,這不是在iOS 10的注冊推送的方法么?這里我就不知道是為什么了.打開APP的設置界面,還必須要注冊通知???????如果這個APP沒有推送功能,也要注冊??????那就這樣吧,反正是蘋果自己定的.
即使這樣,但是很多的網(wǎng)友也是這樣做的.其實,這樣做也很不錯的了.但是如果需求一定要讓在APP中打開Wi-Fi列表呢?要知詳細內容,請看下面分解.
堅決在iOS 10系統(tǒng)中打開系統(tǒng)的Wi-Fi界面(1)
那也是有方法的,代碼如下:
// 私用API打開系統(tǒng)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.功能是實現(xiàn)了,但是不能上App Store. 突然之間想淚崩.
堅決在iOS 10系統(tǒng)中打開系統(tǒng)的Wi-Fi界面(2)
可以借助新出的TodayExtension來做,自己創(chuàng)建一個Target,然后拖一個按鈕,然后拉一個事件,代碼如下:
- (IBAction)btnClick:(id)sender {
NSURL *url = [NSURL URLWithString:@"Prefs:root=WIFI"];
[self.extensionContext openURL:url completionHandler:^(BOOL success) {
NSLog(@"%@", success?@"成功":@"失敗");
}];
}
這個方法,確實不錯.
但是,還是想上面說的一樣.為了實現(xiàn)這么一個功能,我還要弄一個TodayExtension.這也太屌絲了.
其實后來我又在想,盡然這樣可以,那在iOS的控制器中應該也可以把,畢竟控制器都是UIViewController.后來發(fā)現(xiàn),在iOS中的控制器中.self.extensionContext 是nil.所以不行.
別忘了,我的目的是在APP中打開系統(tǒng)的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系統(tǒng)中打開系統(tǒng)的Wi-Fi界面
這里就不用寫了,直接看這篇文章.NetworkExtension.最終我選擇了這個方法.預祝一切順利.
寫在最后的話
幸好我昨天寫了這篇文章:iOS在App中打開設置中的指定模塊,然后網(wǎng)友海泉評論了我,否則我還不知道這些,還會一直蒙在鼓里.再次感謝!
其實,在這過程中我漫山遍野的找了很多東西.這也暴露了自己的很多弱點.有時間,寫點東西還是很不錯的.雖然寫得很簡陋.
- 通過乞討而得來的技術,永遠做不到自力更生.
- 但是不要忘了,時時刻刻向優(yōu)秀的人學習.
與優(yōu)秀的人在一起,能讓自己變得更優(yōu)秀.