Как открыть Настройки программно, как в приложении Facebook?

Мне нужно открыть программы программно из моего приложения. Я искал SO, но везде люди говорят, что это невозможно. Но сегодня я увидел, что он реализован в приложении Facebook. Там кнопка на UIAlertView, и когда вы нажмете на нее, вы откроете Настройки. Так что действительно можно открыть Настройки, я сам это видел. Но как это сделать? Кто-нибудь знает, как это делает Facebook?

Ответ 1

Вы не можете, для вызова API нет.

Только системные диалоги, диалоги из Apple Framework, могут открыть приложение настроек. В 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.
}

Ответ 2

На iOS 8 вы можете программно открывать настройки!

Вот код:

- (void)openSettings
{
    BOOL canOpenSettings = (&UIApplicationOpenSettingsURLString != NULL);
    if (canOpenSettings) {
        NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        [[UIApplication sharedApplication] openURL:url];
    }
}

Если ваше приложение имеет собственный набор настроек, настройки будут открыты, показывая настройки ваших приложений. Если ваше приложение не имеет набора настроек, будет отображаться страница основных настроек.

Ответ 3

На iOS 8 вы можете программно открывать настройки!

Вот список известных в настоящее время URL-адресов в приложении "Настройки":

- (void) openSettings
{
if (&UIApplicationOpenSettingsURLString != nil)
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
else
    NSLog(@"UIApplicationOpenSettingsURLString is not available in current iOS version");
}    
  • префы: корень = General & путь = О
  • префы: корень = General & путь = ДОСТУПНОСТИ
  • префы: корень = AIRPLANE_MODE
  • префы: корень = General & путь = AUTOLOCK
  • префы: корень = General & путь = USAGE/CELLULAR_USAGE
  • префы: корень = Яркость
  • префы: корень = General & путь = Bluetooth
  • префы: корень = General & путь = DATE_AND_TIME
  • префы: корень = FaceTime
  • префы: корень = Общие
  • префы: корень = General & путь = Клавиатура
  • префы: корень = ЗАМОК
  • префы: корень = ЗАМОК & путь = STORAGE_AND_BACKUP
  • префы: корень = General & путь = INTERNATIONAL
  • префы: корень = LOCATION_SERVICES
  • префы: корень = ACCOUNT_SETTINGS
  • префы: корень = МУЗЫКА
  • префы: корень = МУЗЫКА & путь = EQ
  • префы: корень = МУЗЫКА & путь = VolumeLimit
  • префы: корень = General & путь = сети
  • префы: корень = NIKE_PLUS_IPOD
  • Prefs: корень = ПРИМЕЧАНИЯ
  • префы: корень = NOTIFICATIONS_ID
  • префы: корень = Телефон
  • префы: корневые = Фотографии
  • префы: корень = General & путь = ManagedConfigurationList
  • префы: корень = General & путь = Reset
  • префы: корень = Звуки & путь = Мелодия
  • префы: корень = Safari
  • префы: корень = General & путь = Assistant
  • префы: корень = Звуки
  • префы: корень = General & путь = SOFTWARE_UPDATE_LINK
  • префы: корень = STORE
  • префы: корень = TWITTER
  • префы: корень = General & путь = ИСПОЛЬЗОВАНИЕ
  • префы: корень = ВИДЕО
  • префы: корень = General & путь = Сеть /VPN
  • префы: корень = обои
  • префы: корень = WIFI
  • префы: корень = INTERNET_TETHERING

Ответ 4

Ответ Вито Зива в Свифт.

func openSettings() {
    UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!, completionHandler: nil)

}

Ответ 5

Предупреждение в приложении Facebook, на которое ссылается этот вопрос, - это стандартное предупреждение , которое iOS отображает сам, когда вы устанавливаете UIRequiresPersistentWiFi в YES в ваших файлах Info.plist, и пользователь запускает ваше приложение без сетевого подключения.

Подводя итог обсуждению здесь:

  • Нет URL-адреса, который можно использовать для доступа к корневому уровню приложения "Настройки" .
  • Вы можете отправить пользователя в свой раздел приложения в приложении "Настройки" , используя UIApplicationOpenSettingsURLString в iOS 8.
  • Ваше приложение может отображать те же предупреждения, что и Facebook, что открывает корневой уровень приложения "Настройки" , установив UIRequiresPersistentWiFi в "YES".

Ответ 6

Памятка о prefs:root= и Prefs:root.

Да, наше приложение было отклонено Apple из-за prefs:root= и App-Prefs:root схема URL сегодня (2018-06-29). Они являются частным API.

Rejected by Apple


Для Swift 4,

Только UIApplication.openSettingsURLString является открытым API для открытия настроек.

Ответ 7

 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)

Ответ 8

Если вам нужны открытые параметры приложения, вам нужен метод записи с помощью UIApplicationOpenSettingsURLString.

fileprivate func openSettings() {
  UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!)      
}

Если вам нужно открыть одну из многих настроек, вам нужно использовать эту функцию

fileprivate func openSettings() {
  UIApplication.shared.open(URL(string:"App-Prefs:root=General")!)
}

Ответ 9

Чтобы открыть настройки нашего собственного приложения в 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

Ответ 10

 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) {
            }];
        }

Ответ 11

Вот пример 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)
}

Ответ 12

Если вы используете Swift 3, это синтаксис

UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!, options: [:]) { (success) in
    if success {
        print("settings opened");
    }
}

Ответ 13

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
    }

Открытие настроек конфиденциальности в приложении

Ответ 15

какие-либо объективные решения этой проблемы?

Ответ 16

Во многих ответах, приведенных здесь, я вижу использование "App-Prefs: root", "prefs: root", мы не должны использовать их в наших приложениях, чтобы открыть приложение настроек. Согласно Apple, это непубличная схема URL, и если мы ее используем, наше приложение будет отклонено.

Ответ 17

SWIFT 3

UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)