Як відкрити Налаштування програмно, як у програмі Facebook?


75

Мені потрібно програмно відкрити Налаштування з моєї програми. Я шукав через SO, але скрізь люди кажуть, що це неможливо. Але сьогодні я побачив, що це реалізовано у програмі Facebook. На кнопці є кнопка, UIAlertViewі коли ви натискаєте її, відкриваєте Налаштування. Тож справді це можливо, щоб відкрити Налаштування, я сам був свідком цього. Але як це зробити? Хтось знає, як це робить Facebook?


Зауважте, що програма Facebook відкрита і повністю доступна на github.
Султан

Facebook не показував це сповіщення, це зробила ОС. Це трапляється за певних обставин, таких як увімкнення режиму польоту чи вимкнення WiFi, і ОС пропонує вам відкрити Налаштування та змінити його.
Guy Kogus

9
@Sulthant зауважте, що програма Facebook не є відкритим кодом. Є лише SDK.
MatterGoal


Відвідайте цю відповідь для Swift 3: http://stackoverflow.com/a/34024467/5391914
Хамед

Відповіді:


57

Ви не можете, для цього немає виклику 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.
}

5
ну, але Facebook ВИКОНАВ
Андрій Чернуха

3
Це тому, що вони дуже тісно співпрацюють з Apple та інтегрованою там службою Apple у iOS. Це не означає, що ви можете це зробити! Можливо, їм навіть дозволять викликати якийсь приватний API, щоб відкрити програму налаштувань.
rckoenes

3
Я майже впевнений, що це просто звичайна частина програми, ЩО БУДЕ ПОДИВАТИСЯ на сторінку налаштувань. Ти знаєш?
Fattie

9
Привіт, хлопці, на iOS 8 можливо відкрити Налаштування програмно, див. Мою відповідь
Vito Ziv

2
@VitoZiv це правда, але коли було задано це запитання, моя відповідь була правильною.
rckoenes

139

На iOS 8 ви можете програмно відкрити Налаштування!

Ось код:

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

Якщо у вашої програми є власний пакет налаштувань, відкриються налаштування, що відображають налаштування вашого додатка. Якщо у вашому додатку немає набору налаштувань, відобразиться головна сторінка налаштувань.


@BeemerFan не лише сторінка налаштувань власного додатка.
rckoenes

3
Хтось знає, як відкрити лише додаток Налаштування, а не сторінку окремих налаштувань? Facebook відкриває програму «Налаштування», не переходячи на окрему сторінку налаштувань.
Пей

7
Увага: Якщо ви не встановили пакет налаштувань, цей код все одно відкриває налаштування програми (із "Сповіщеннями" та "Використовувати стільникові дані"), а не загальні налаштування.
MatterGoal

1
як можна видалити налаштування програми, щоб вона відкривала загальні налаштування? Це вже є в ios8, коли ви встановлюєте програму.
vatti

2
Підкажіть, будь ласка, як видалити пакет налаштувань програми в xcode? Я завжди
переходжу

33

На iOS 8 ви можете програмно відкрити Налаштування!

Ось список відомих на даний момент URL-адрес у програмі Налаштування:

- (void) openSettings
{
if (&UIApplicationOpenSettingsURLString != nil)
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
else
    NSLog(@"UIApplicationOpenSettingsURLString is not available in current iOS version");
}    
  • prefs: root = Загальне & шлях = Про
  • prefs: root = Загальне & шлях = ДОСТУПНІСТЬ
  • prefs: root = AIRPLANE_MODE
  • prefs: root = Загальні & шлях = AUTOLOCK
  • prefs: root = Загальне & шлях = ВИКОРИСТАННЯ / КЛІТОВИЙ_ВИКОРИСТАННЯ
  • prefs: root = Яскравість
  • prefs: root = Загальні & шлях = Bluetooth
  • prefs: root = Загальне & шлях = DATE_AND_TIME
  • prefs: root = FACETIME
  • prefs: root = Загальне
  • prefs: root = Загальне & path = Клавіатура
  • prefs: root = ЗАМОК
  • prefs: root = CASTLE & path = STORAGE_AND_BACKUP
  • prefs: root = Загальне & шлях = МІЖНАРОДНИЙ
  • prefs: root = LOCATION_SERVICES
  • prefs: root = ACCOUNT_SETTINGS
  • prefs: root = MUSIC
  • prefs: root = MUSIC & path = EQ
  • prefs: root = MUSIC & path = VolumeLimit
  • prefs: root = Загальне & path = Мережа
  • prefs: root = NIKE_PLUS_IPOD
  • prefs: root = ПРИМІТКИ
  • prefs: root = NOTIFICATIONS_ID
  • prefs: root = Телефон
  • prefs: root = Фотографії
  • prefs: root = Загальне & path = ManagedConfigurationList
  • prefs: root = Загальні & шлях = Скинути
  • prefs: root = Звуки & шлях = Рінгтон дзвінка
  • prefs: root = Safari
  • prefs: root = Загальні & шлях = Помічник
  • prefs: root = Звуки
  • prefs: root = Загальні & шлях = SOFTWARE_UPDATE_LINK
  • prefs: root = STORE
  • prefs: root = TWITTER
  • prefs: root = Загальні & шлях = ВИКОРИСТАННЯ
  • prefs: root = ВІДЕО
  • prefs: root = Загальне & path = Мережа / VPN
  • prefs: root = Шпалери
  • prefs: root = WIFI
  • prefs: root = INTERNET_TETHERING

2
Чи можете ви зробити посилання на будь-яке офіційне джерело Apple для цього, чи це було виявлено шляхом якихось досліджень?
Joey Carson

1
виглядає як більшість з них більше не працюють в ІС 10 stackoverflow.com/questions/38064557 / ...
wyu

6
Просто замініть префікси на App-Prefs для iOS 10. Наведений вище код працює для iOS 8,9,10.
Сталін Пушпарай

1
"App-Prefs: root = Privacy & path = Location" специфічно для Location Services.
Дічен

1
Ваш додаток буде відхилено яблуком за використання преф: root
Helam

20

Відповідь Віто Зів у Свіфті.

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

}

як дістатися до налаштувань wifi, щоб користувач знову підключився до wifi, перебуваючи в програмі?
JMStudios.jrichardson

1
@ JMStudios.jrichardson, поки цього немає. Тільки налаштування програми
alexey.metelkin

1
openURL тепер застарілий у Swift3, у когось є оновлений приклад для цього?
Джефф

13

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

Підсумовуючи дискусію тут:

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

>>> розділ вашого додатка "Налаштування" <<< Якою є поведінка, коли ви не вказали settings.bundleпрограму? Я виявив, що при запуску через Xcode ця URL-адреса переводить мене на сторінку налаштувань верхнього рівня. Але через TestFlight він переходить на мою (порожню) дочірню сторінку налаштувань програми. Але я не створив settings.bundle, і в моєму .appпродукті його немає ...
pkamb

Що стосується того самого, що робить facebook, це має бути правильною відповіддю. UIRequiresPersistentWiFiце те, що я шукав для відображення попередження. Однак, хтось знає, чи можете ви програматично запускати його під час виконання замість того, щоб використовувати info.plist? @Richard Venable, чи є у вас метод, який ви можете викликати, щоб ви могли насправді скористатися цим, коли натискаєте певну кнопку?
user3832583

11

Пам’ятка про prefs:root=та Prefs:root.

Так, наше додаток було відхилено Apple , завдяки prefs:root=і App-Prefs:rootсхемами URL сьогодні (2018-06-29). Вони є приватним API.

Відхилено Apple


Для Swift 4,

Лише UIApplication.openSettingsURLString є загальнодоступним API для відкриття налаштувань.


14 серпня 2018 р. - Нашу програму щойно було відхилено за використання цієї програми. Це було у вихідній кодовій базі 3 випуски, перш ніж вони нарешті відхилили нас за це.
Cameron E

Ви знайшли тут якесь рішення?
Sukeshj

Ні. Я використовую UIApplication.openSettingsURLStringзараз і прошу свого начальника змінити специфікацію інтерфейсу для цієї проблеми.
AechoLiu

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)


5

Якщо ви хочете відкрити налаштування програми, вам потрібен метод запису за допомогою UIApplicationOpenSettingsURLString.

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

Якщо вам потрібно, відкриється одне з багатьох налаштувань, вам потрібно скористатися цією функцією

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

Не використовуйте "App-Prefs: root = General" у своїх програмах. Це яблуко відхилить ваш додаток за використання непублічної URL-адреси у вашому додатку. Моя була відновлена
Раві Кумар,

3

Щоб відкрити налаштування нашого власного додатку 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


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

1

Ось приклад 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)
}

0
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
    }

Відкриття налаштувань конфіденційності в додатку



0

У багатьох з наведених тут відповідей я бачу використання "App-Prefs: root" "prefs: root", ми не повинні використовувати їх у наших програмах, щоб відкрити програму налаштувань. Відповідно до Apple, це непублічна схема URL-адрес, і якщо ми її використовуємо, наш додаток буде відхилено.


-1

SWIFT 3

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

openURL застарів у swift 3, вам слід використовувати open (URL (рядок: UIApplicationOpenSettingsURLString)!, options: [:], completeHandler: {_ in})
Даміан Дудич,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.