Як відкрити налаштування телефону, коли натиснути кнопку?


160

Я намагаюся реалізувати функцію в додатку, який показує попередження, коли підключення до Інтернету недоступне. Сповіщення має дві дії (ОК та Налаштування). Кожен раз, коли користувач натискає налаштування, я хочу перенести їх у налаштування телефону.

Я використовую Swift та Xcode.

Відповіді:


301

Використання UIApplication.openSettingsURLString

Оновлення для Swift 5.1

 override func viewDidAppear(_ animated: Bool) {
    let alertController = UIAlertController (title: "Title", message: "Go to Settings?", preferredStyle: .alert)

    let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in

        guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else {
            return
        }

        if UIApplication.shared.canOpenURL(settingsUrl) {
            UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                print("Settings opened: \(success)") // Prints true
            })
        }
    }
    alertController.addAction(settingsAction)
    let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
    alertController.addAction(cancelAction)

    present(alertController, animated: true, completion: nil)
}

Швидкий 4.2

override func viewDidAppear(_ animated: Bool) {
    let alertController = UIAlertController (title: "Title", message: "Go to Settings?", preferredStyle: .alert)

    let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in

        guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
            return
        }

        if UIApplication.shared.canOpenURL(settingsUrl) {
            UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                print("Settings opened: \(success)") // Prints true
            })
        }
    }
    alertController.addAction(settingsAction)
    let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
    alertController.addAction(cancelAction)

    present(alertController, animated: true, completion: nil)
}

Як я це втілю? @Marius Fanu
Solomon Ayoola

це за допомогою iOS8 @Marius Fanu
Solomon Ayoola

@AyoolaSolomon Я оновив свою відповідь, щоб додати попередження про viewDidAppearметод, за допомогою кнопки SettingsіCancel
Marius Fanu

2
Ні, я не думаю. Щоб перейти до вашого додатку, ваша програма повинна впровадити власну схему URL-адрес та зателефонувати на дзвінок UIApplication.sharedApplication().openURL(yourCustomURL)із поточного додатка, але ви не маєте цього доступу через додаток Налаштування
Маріус Фану,

5
@PersianBlue правильний в iOS 10.1.1, це не вдалося запустити додаток Налаштування.
Майкл Гаріто

237

⚠️ Будьте уважні!

Ця відповідь заснована на незадокументованих API, і нещодавно (з iOS12) компанія Apple відкидає програми з таким підходом.

Оригінальна відповідь нижче

Швидкий 5

UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil)

Швидкий 4

UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!, options: [:], completionHandler: nil)

ПРИМІТКА. Наступний метод працює для всіх версій нижче iOS 11, для більш високих версій додаток може бути відхилено, оскільки це приватний API

Іноді ми хочемо перенаправити користувача до налаштувань, відмінних від наших. Наступний метод допоможе вам досягти цього:

Спочатку налаштуйте схеми URL-адрес у своєму проекті. Ви знайдете його в Цільовій -> Інформація -> Схемі URL. натисніть кнопку + та введіть префікси у схемах URL-адрес

введіть тут опис зображення

Швидкий 5

UIApplication.shared.open(URL(string: "App-prefs:Bluetooth")!)

Швидкий 3

UIApplication.shared.open(URL(string:"App-Prefs:root=General")!, options: [:], completionHandler: nil)

Швидкий

UIApplication.sharedApplication().openURL(NSURL(string:"prefs:root=General")!)

Ціль-С

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=General"]];

нижче наведено всі доступні URL-адреси

** У IOS <12 **

  • prefs: root = Загальне & шлях = Про
  • prefs: root = Загальне & шлях = ДОСТУПНІСТЬ
  • prefs: root = AIRPLANE_MODE
  • prefs: root = Загальне & шлях = AUTOLOCK
  • prefs: root = Загальне & шлях = USAGE / CELLULAR_USAGE
  • префс: корінь = Яскравість
  • префс: root = Bluetooth
  • prefs: root = Загальне & шлях = DATE_AND_TIME
  • префс: root = FACETIME
  • префс: корінь = Загальне
  • prefs: root = Загальне & шлях = Клавіатура
  • префс: корінь = КАСТЛ
  • prefs: root = CASTLE & path = STORAGE_AND_BACKUP
  • prefs: root = Загальне & шлях = МІЖНАРОДНИЙ
  • prefs: root = LOCATION_SERVICES
  • prefs: root = ACCOUNT_SETTINGS
  • префс: корінь = МУЗИКА
  • prefs: root = МУЗИКА & шлях = EQ
  • prefs: root = MUSIC & path = VolumeLimit
  • prefs: root = Загальне & шлях = Мережа
  • prefs: root = NIKE_PLUS_IPOD
  • prefs: root = ПРИМІТКИ
  • prefs: root = NOTIFICATIONS_ID
  • prefs: root = Телефон
  • prefs: root = Фотографії
  • prefs: root = General & path = ManagedConfigurationList
  • prefs: root = Загальний & шлях = Скинути
  • prefs: root = Звуки та шлях = Мелодія звучання
  • префс: корінь = Сафарі
  • prefs: root = Загальний & шлях = Помічник
  • префс: корінь = Звуки
  • prefs: root = General & path = SOFTWARE_UPDATE_LINK
  • префс: корінь = ЗБЕРІГАТИ
  • префс: root = TWITTER
  • префс: root = FACEBOOK
  • prefs: root = General & path = USAGE prefs: root = VIDEO
  • prefs: root = Загальний & шлях = Мережа / VPN
  • prefs: root = Шпалери
  • префс: корінь = WIFI
  • prefs: root = INTERNET_TETHERING
  • prefs: root = Телефон і шлях = Заблоковано
  • prefs: root = DO_NOT_DISTURB

На IOS 13

  • Прикладні програми: Загальні та шлях = Про
  • Настроювання програм: AIRPLANE_MODE
  • Пристрої програми: Загальні та шлях = AUTOLOCK
  • Настроювання програм: Bluetooth
  • Настроювання програм: Загальні та шлях = DATE_AND_TIME
  • Додаток до програми: FACETIME
  • Додаткові програми: Загальні
  • Прикладні налаштування: Загальні та шлях = Клавіатура
  • Додаток для додатків: CASTLE
  • Настроювання програм: CASTLE & path = STORAGE_AND_BACKUP
  • Прикладні програми: Загальні та шлях = МІЖНАРОДНИЙ
  • Додаток до програми: МУЗИКА
  • Додаток до програми: ПРИМІТКИ
  • Префікс програми: NOTIFICATIONS_ID
  • Додаткові програми: Телефон
  • Додаткові програми: Фотографії
  • Прикладні налаштування: Загальні та шлях = ManagedConfigurationList
  • Настроювання програм: Загальні та шлях = Скидання
  • Пристрої програми: Звуки та шлях = Мелодія дзвінка
  • Додаткові програми: Звуки
  • Настроювання програм: Загальні та шлях = SOFTWARE_UPDATE_LINK
  • Додаток до програми: STORE
  • Додаток до програми: Шпалери
  • Додаткові програми: WIFI
  • Настроювання програм: INTERNET_TETHERING
  • Префікс програми: DO_NOT_DISTURB

    Не перевірений

  • Додаток до програми: TWITTER (??)

  • Додаткові програми: FACEBOOK (??)
  • Настроювання програм: NIKE_PLUS_IPOD (??)

Примітка. Налаштування мережі не буде відкрито в тренажері, але посилання працюватиме на реальному пристрої.


7
Це не працює з iOS 10. Разом з тим же кодом на iOS 9.3. і він працював, працював на iOS 10, а він не став (незалежно від того, яка URL-адреса використовується)
Gruntcakes

18
Для iOS 10 використовуйте App-Prefsзамість prefsсхеми рядок URL. наприкладApp-Prefs:root=WIFI
Десмонд DAI

8
нещодавно дав додаток на розгляд, щоб випустити його в App Store, і Apple відмовилася від нього через використання "prefs: root" або "App-Prefs: root". Я використовував його для відкриття налаштувань wifi, коли у користувача немає підключення до Інтернету.
Марсель Т

21
Оскільки iOS 12 виходить незабаром, Apple відхиляє додаток, до якого входять такі попередні налаштування. Будь ласка, пам’ятайте про це. Навіть мій додаток теж відхилили
Thiha Aung

8
НЕ використовуйте App-Prefsабо prefs:rootоскільки це приватні API, і, якщо вам не пощастить, ваш додаток буде відхилено.
Tejas K

45

В iOS 8+ ви можете зробити наступне:

 func buttonClicked(sender:UIButton)
    {
        UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString))
    }

Швидкий 4

    let settingsUrl = URL(string: UIApplicationOpenSettingsURLString)!
    UIApplication.shared.open(settingsUrl)

16
Це перенесе вас до налаштувань програми, як я можу перенести їх на сторінку загальних налаштувань або ще краще до розділу здоров’я?
Туз Зелений

2
Свіфт 3 -UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
Авів Бен Шабат

@AceGreen Ви потрапили до розділу охорони здоров’я?
Саад

Як відкрити програму "Налаштування"? "Домашня сторінка" його
Даніель Спрінгер

без "!" знакURL(string: UIApplication.openSettingsURLString).map { UIApplication.shared.open($0, options: [:], completionHandler: nil) }
обер

21

Використовуючи підказку @ vivek, я розробляю клас утилітів на основі Swift 3 , сподіваюся, ви оціните!

import Foundation
import UIKit

public enum PreferenceType: String {

    case about = "General&path=About"
    case accessibility = "General&path=ACCESSIBILITY"
    case airplaneMode = "AIRPLANE_MODE"
    case autolock = "General&path=AUTOLOCK"
    case cellularUsage = "General&path=USAGE/CELLULAR_USAGE"
    case brightness = "Brightness"
    case bluetooth = "Bluetooth"
    case dateAndTime = "General&path=DATE_AND_TIME"
    case facetime = "FACETIME"
    case general = "General"
    case keyboard = "General&path=Keyboard"
    case castle = "CASTLE"
    case storageAndBackup = "CASTLE&path=STORAGE_AND_BACKUP"
    case international = "General&path=INTERNATIONAL"
    case locationServices = "LOCATION_SERVICES"
    case accountSettings = "ACCOUNT_SETTINGS"
    case music = "MUSIC"
    case equalizer = "MUSIC&path=EQ"
    case volumeLimit = "MUSIC&path=VolumeLimit"
    case network = "General&path=Network"
    case nikePlusIPod = "NIKE_PLUS_IPOD"
    case notes = "NOTES"
    case notificationsId = "NOTIFICATIONS_ID"
    case phone = "Phone"
    case photos = "Photos"
    case managedConfigurationList = "General&path=ManagedConfigurationList"
    case reset = "General&path=Reset"
    case ringtone = "Sounds&path=Ringtone"
    case safari = "Safari"
    case assistant = "General&path=Assistant"
    case sounds = "Sounds"
    case softwareUpdateLink = "General&path=SOFTWARE_UPDATE_LINK"
    case store = "STORE"
    case twitter = "TWITTER"
    case facebook = "FACEBOOK"
    case usage = "General&path=USAGE"
    case video = "VIDEO"
    case vpn = "General&path=Network/VPN"
    case wallpaper = "Wallpaper"
    case wifi = "WIFI"
    case tethering = "INTERNET_TETHERING"
    case blocked = "Phone&path=Blocked"
    case doNotDisturb = "DO_NOT_DISTURB"

}

enum PreferenceExplorerError: Error {
    case notFound(String)
}

open class PreferencesExplorer {

    // MARK: - Class properties -

    static private let preferencePath = "App-Prefs:root"

    // MARK: - Class methods -

    static func open(_ preferenceType: PreferenceType) throws {
        let appPath = "\(PreferencesExplorer.preferencePath)=\(preferenceType.rawValue)"
        if let url = URL(string: appPath) {
            if #available(iOS 10.0, *) {
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
            } else {
               UIApplication.shared.openURL(url)
            }
        } else {
            throw PreferenceExplorerError.notFound(appPath)
        }
    }

}

Це дуже корисно, оскільки API точно зміниться, і ви можете зробити рефактор один раз і дуже швидко!


5
Чи пройде це огляд яблук?
L_Sonic

Я збираюся додати ще одну річ, щоб зробити її трохи кращою. У перерахунку ви можете зробити змінну типу String з назвою urlString. Потім поверніть "App-Prefs: root =" = self.rawValue. Це в основному усуне потребу в appPath та статичному приватному дозволі. Ура.
mn1

Налаштування сповіщень не відкривається на iOS 11.
Метін Аталай

2
це не працюватиме, оскільки ми отримали це повідомлення від програми: "Ваш додаток використовує неприлюдну схему URL-адрес" prefs: root = ", яка є приватною особою. Використання непублічних API не дозволяється в App Store, оскільки це може призвести до поганого досвіду роботи користувачів, якщо ці API змінюються. Продовження використання або приховування непублічних API в майбутніх поданнях цього додатка може призвести до закриття вашого акаунта Apple Developer, а також до видалення всіх пов’язаних програм із додатка Магазин ".
CodeOverRide

1
@L_Sonic ні, він не пройде огляд, і якщо це станеться, він може потрапити випадковим чином, позначений у будь-яких майбутніх оновленнях, які ви натискаєте
RP Carson



7

в ios10 / Xcode 8 в тренажері:

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

працює

UIApplication.shared.openURL(URL(string:"prefs:root=General")!)

не.


Чи був NSпрефікс був видалений в прошивці 10?
JC Rocamonde

2
Це працюватиме лише у тому випадку, якщо у вашому додатку є файл .bundle (ваші налаштування програми)
Sophy Swicz

@Sophy Swicz HOw я можу додати .bundle файл?
розробник

1
@Developer github.com/phynet/SettingBundleiOSProject також, налаштування вашого додатка - це всі сервіси, які дозволяє використовувати ваш додаток, і показані в Загальних -> налаштуваннях вашого додатка
Sophy Swicz

7

Я бачив цей рядок коду

UIApplication.sharedApplication() .openURL(NSURL(string:"prefs:root=General")!)

не працює, він не працював для мене в ios10 / Xcode 8, лише невелика різниця коду, будь ласка, замініть це на

UIApplication.sharedApplication().openURL(NSURL(string:"App-Prefs:root=General")!)

Швидкий3

UIApplication.shared.openURL(URL(string:"prefs:root=General")!)

Замінити

UIApplication.shared.openURL(URL(string:"App-Prefs:root=General")!)

Сподіваюся, це допомагає. Ура.


1
Причини: додаток відхилено
ergunkocak

7

слово попередження: схеми prefs:rootабо App-Prefs:rootURL вважаються приватним API. Apple може відхилити ваш додаток, якщо ви їх використовуєте, ось що ви можете отримати під час подання програми:

Ваш додаток використовує непублічну схему URL-адрес "prefs: root =", яка є приватною особою. Використання непублічних API не дозволяється в App Store, оскільки це може призвести до поганої роботи користувачів у разі зміни цих API. Продовження використання або приховування непублічних API в майбутніх поданнях цього додатка може призвести до припинення роботи вашого акаунта Apple Developer, а також до видалення всіх пов’язаних програм із App Store.

Наступні кроки

Щоб вирішити цю проблему, перегляньте свій додаток, щоб надати пов’язану функціональність за допомогою загальнодоступних API або видаліть функціональність за допомогою URL-схеми "prefs: root" або "App-Prefs: root".

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


Немає підтримуваного способу відкрити "Налаштування" на "сторінці" Wi-Fi / Мова / Місцезнаходження. Те, що це працювало в iOS 9, - це помилка, яку виправили в iOS 10. Для отримання додаткової інформації зверніться до forums.developer.apple.com/message/186656#186656
Mohit Kumar

6

Швидкий 4.2, iOS 12

open(url:options:completionHandler:)Метод був оновлений , щоб включити не-нільполугруппу варіанти словника, який , як цей пост містить тільки один можливий варіант типу UIApplication.OpenExternalURLOptionsKey(в даному прикладі).

@objc func openAppSpecificSettings() {

    guard let url = URL(string: UIApplication.openSettingsURLString),
        UIApplication.shared.canOpenURL(url) else {
            return
    }

    let optionsKeyDictionary = [UIApplication.OpenExternalURLOptionsKey(rawValue: "universalLinksOnly"): NSNumber(value: true)]

    UIApplication.shared.open(url, options: optionsKeyDictionary, completionHandler: nil)

}

Явна побудова URL-адреси, наприклад з "App-Prefs", AFAIK отримала деякі програми, відхилені з магазину.


Я підтверджую це, додаток було добре з "App-Prefs" раніше, але після Спеціальної події Apple моє оновлення отримало відхилення, повернувшись до UIApplicationOpenSettingsURLString.
Віталій

5

Додавання до @Luca Davanzo

iOS 11, деякі параметри дозволів переміщені до шляху програми:

Підтримка iOS 11

 static func open(_ preferenceType: PreferenceType) throws {
    var preferencePath: String
    if #available(iOS 11.0, *), preferenceType == .video || preferenceType == .locationServices || preferenceType == .photos {
        preferencePath = UIApplicationOpenSettingsURLString
    } else {
        preferencePath = "\(PreferencesExplorer.preferencePath)=\(preferenceType.rawValue)"
    }

    if let url = URL(string: preferencePath) {
        if #available(iOS 10.0, *) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(url)
        }
    } else {
        throw PreferenceExplorerError.notFound(preferencePath)
    }
}

2
чи може це пройти Apple Review? Я маю на увазі, чи призведе це до відхилення програми?
Аакаш Дейв

4
коли я запускаю цей код, я просто переносить мене на сторінку налаштувань. Не конкретна вкладка налаштувань у ній.
Аакаш Дейв

2

SWIFT 4

Це може зайняти конкретні налаштування вашого додатка, якщо це те, що ви шукаєте.

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

дякую ... у мене це працює ... але я хочу змінити налаштування програм, які є іншими розробниками. Наприклад, натисніть кнопку і змініть налаштування Push-повідомлення Facebook, щоб вони не повідомляли під час зустрічі. Я припускаю, що можуть бути рішення MDM ... чи ні.
IrishGringo

@IrishGringo - єдиний спосіб змінити налаштування програми Facebook - це користувач сам відкривати налаштування програми Facebook, перейшовши через Загальні налаштування >> Сповіщення >> Facebook
BennyTheNerd

0

Як було сказано вище @niravdesai App-prefs. Я виявив, що App-Prefs:працює як для iOS 9, 10, так і 11. пристроїв, протестованих. де як prefs:працює лише на iOS 9.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.