iOS在App中打開設置中的指定模塊(終)

感謝

昨天寫了一篇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)秀.


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容