Как открыть настройки программно, как в приложении 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.

Отклонено Apple


Для 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");
}

Для справки и подробного описания, пожалуйста, следуйте

Открытие приложения Настройки программно в iOS 8

Вот пример 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)!)
Другие вопросы по тегам