Как открыть настройки программно, как в приложении Facebook?
Мне нужно открыть настройки программно из моего приложения. Я искал через SO, но везде люди говорят, что это невозможно. Но сегодня я увидел, что это реализовано в приложении Facebook. Там есть кнопка на UIAlertView
и когда вы нажимаете на нее, вы открываете настройки. Так что это действительно возможно открыть настройки, я был свидетелем этого сам. Но как это сделать? Кто-нибудь знает, как это делает Facebook?
14 ответов
Вы не можете, нет вызова API для этого.
Только системные диалоги, диалоги от Apple Frameworks, могут открыть приложение настроек. В iOS 5 была схема URL приложения, чтобы открыть системный диалог, но Apple удалила его позже.
С выходом iOS 8 вы можете открыть диалог настроек на странице своих приложений.
if (&UIApplicationOpenSettingsURLString != NULL) {
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url];
}
else {
// Present some dialog telling the user to open the settings app.
}
На iOS 8 вы можете открыть Настройки программно!
Вот код:
- (void)openSettings
{
BOOL canOpenSettings = (&UIApplicationOpenSettingsURLString != NULL);
if (canOpenSettings) {
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url];
}
}
Если у вашего приложения есть собственный пакет настроек, откроются настройки с настройками вашего приложения. Если в вашем приложении нет набора настроек, отобразится главная страница настроек.
На iOS 8 вы можете открыть Настройки программно!
Вот список известных в настоящее время URL-адресов в приложении "Настройки":
- (void) openSettings
{
if (&UIApplicationOpenSettingsURLString != nil)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
else
NSLog(@"UIApplicationOpenSettingsURLString is not available in current iOS version");
}
- префы: корень = Общие и путь = О
- префы: корень = Общие и путь = ДОСТУПНОСТИ
- префы: корень =AIRPLANE_MODE
- префы: корень = Общие и путь =AUTOLOCK
- префы: корень = Общие и путь =USAGE/CELLULAR_USAGE
- префы: корень = Яркость
- префы: корень = Общие и путь =Bluetooth
- префы: корень = Общие и путь =DATE_AND_TIME
- префы: корень =FaceTime
- префы: корень = Общие
- префы: корень = General & путь =Keyboard
- префы: корень = ЗАМОК
- префы: корень = ЗАМОК & путь =STORAGE_AND_BACKUP
- префы: корень = General & путь = INTERNATIONAL
- Prefs: корень =LOCATION_SERVICES
- Prefs: корень = ACCOUNT_SETTINGS
- префы: корень = МУЗЫКА
- префы: корень = МУЗЫКА & путь =EQ
- префы: корень = МУЗЫКА & путь =VolumeLimit
- префы: корень = Общие и путь = Сеть
- префы: корень =NIKE_PLUS_IPOD
- Prefs: корневые = ПРИМЕЧАНИЯ
- префы: корень = NOTIFICATIONS_ID
- префы: корень = Телефон
- Prefs: корневые = Фотографии
- префы: корень = Общие и путь =ManagedConfigurationList
- префы: корень = Общие и путь = Сброс
- префы: корень = Звуки & путь = Мелодия
- префы: корень = Safari
- префы: корень = General & путь = помощник
- Prefs: корень = Звуки
- префы: корень = Общие и путь =SOFTWARE_UPDATE_LINK
- префы: корень = STORE
- префы: корень =TWITTER
- префы: корень = Общие и путь = ИСПОЛЬЗОВАНИЕ
- префы: корень = ВИДЕО
- префы: корень = Общие и путь = Сеть /VPN
- префы: корень = обои
- префы: корень =WIFI
- префы: корень =INTERNET_TETHERING
Ответ Вито Зива в Swift.
func openSettings() {
UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!, completionHandler: nil)
}
Предупреждение в приложении Facebook, к которому относится этот вопрос, является стандартным предупреждением, которое iOS отображает самостоятельно, когда вы устанавливаете для UIRequiresPersistentWiFi значение YES в файлах Info.plist и пользователь запускает ваше приложение без сетевого подключения.
Подводя итог обсуждения здесь:
- Нет URL-адреса, по которому вы можете перейти на корневой уровень приложения "Настройки".
- Вы можете отправить пользователя в раздел приложения в приложении " Настройки", используя UIApplicationOpenSettingsURLString в iOS 8.
- Ваше приложение может отображать то же оповещение, что и Facebook, открывающий корневой уровень приложения "Настройки", если для параметра UIRequiresPersistentWiFi установлено значение YES.
Памятка о prefs:root=
а также Prefs:root
,
Да, наше приложение было отклонено Apple из-за prefs:root=
а также App-Prefs:root
Схема URL сегодня (2018-06-29)
, Они являются частным API.
Для Swift 4,
Только UIApplication.openSettingsURLString является открытым API для открытия настроек.
if (&UIApplicationOpenSettingsURLString != NULL)
в iOS 8+ всегда ИСТИНА. Таким образом, вы можете редактировать так
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
}
(с новым openURL для iOS 10)
Если вы хотите открыть настройки приложения, вам нужен метод write с UIApplicationOpenSettingsURLString.
fileprivate func openSettings() {
UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!)
}
Если вам нужно будет открыть одну из многих настроек, вам нужно использовать эту функцию
fileprivate func openSettings() {
UIApplication.shared.open(URL(string:"App-Prefs:root=General")!)
}
Чтобы открыть настройки нашего собственного приложения в iOS 8 and later
, используйте следующий код.
- (void) openSettings
{
if(&UIApplicationOpenSettingsURLString != nil)
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
else
NSLog(@"UIApplicationOpenSettingsURLString is not available in current iOS version");
}
Для справки и подробного описания, пожалуйста, следуйте
Вот пример Swift 3 с UIAlertController и UIAlertAction.
func showSettingsPopup() {
let alertVC = UIAlertController(title: "Notifications disabled", message: "Please, turn on notifications if you want to receive a reminder messages.", preferredStyle: .alert)
let close = UIAlertAction(title: "Close", style: .destructive, handler: { (action) in
print("close action handler")
})
let openSettings = UIAlertAction(title: "Open settings", style: .default, handler: { (action) in
guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
return
}
if UIApplication.shared.canOpenURL(settingsUrl) {
UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
print("Settings are opened: \(success)")
})
}
})
alertVC.addAction(openSettings)
alertVC.addAction(close)
present(alertVC, animated: true, completion: nil)
}
if (&UIApplicationOpenSettingsURLString != NULL) {
UIAlertView_Blocks *alertView = [[UIAlertView_Blocks alloc] initWithTitle:NSLocalizedString(@"Camera Access Denied", nil)
message:NSLocalizedString(@"You must allow camera access in Settings", nil)
delegate:nil
cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
otherButtonTitles:NSLocalizedString(@"Open Settings", nil), nil];
[alertView showWithDissmissBlock:^(NSInteger buttonIndex) {
if (alertView.cancelButtonIndex != buttonIndex) {
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:url];
}
}];
}
else {
UIAlertView_Blocks *alertView = [[UIAlertView_Blocks alloc] initWithTitle:NSLocalizedString(@"Camera Access Denied", nil)
message:NSLocalizedString(@"You must allow camera access in Settings > Privacy > Camera", nil)
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK", nil)
otherButtonTitles:nil, nil];
[alertView showWithDissmissBlock:^(NSInteger buttonIndex) {
}];
}
Во многих приведенных здесь ответах я вижу использование "App-Prefs:root" "prefs:root", мы не должны использовать их в наших приложениях для открытия приложения настроек. Согласно Apple, это непубличная схема URL-адресов, и если мы будем ее использовать, наше приложение будет отклонено.
Вместо того, чтобы использовать prefs:
Просто используйте App-Prefs:
if ([[UIApplication sharedApplication] canOpenURL: [NSURL URLWithString: @"App-Prefs:root=WIFI"]]) {
[[UIApplication sharedApplication] openURL: [NSURL URLWithString:@"App-Prefs:root=WIFI"]];
}
,
Все здесь: https://medium.com/@thanhvtrn/how-to-open-settings-wifi-in-swift-on-ios-10-1d94cf2c2e60
if #available(iOS 10.0, *) {
if let url = URL(string: "App-Prefs:root=Privacy") {
UIApplication.shared.open(url, completionHandler: .none)
}
} else {
// Fallback on earlier versions
}
Открытие настроек конфиденциальности в приложении
Если вы используете Swift 3, это синтаксис
UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!, options: [:]) { (success) in
if success {
print("settings opened");
}
}
SWIFT 3
UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)