Как открыть настройки телефона при нажатии кнопки?

Я пытаюсь реализовать функцию в приложении, которая показывает предупреждение, когда интернет-соединение недоступно. Предупреждение имеет два действия ("ОК" и "Настройки"), когда пользователь нажимает на настройки, я хочу программно их отнести к настройкам телефона.

Я использую Swift и Xcode.

Ответ 1

Использование 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)
}

Swift 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)
}

Ответ 2

Swift 5

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

Swift 4

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

ПРИМЕЧАНИЕ: следующий метод работает для всех версий ниже iOS 11, для более высоких версий приложение может быть отклонено, так как это частный API

Иногда мы хотим привести пользователя к настройкам, отличным от настроек нашего приложения. Следующий метод поможет вам достичь этого:

Сначала настройте схемы URL в вашем проекте. Вы найдете это в Target → Info → URL Scheme. нажмите на кнопку + и введите prefs в URL Schemes

enter image description here

Свифт 3

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

стриж

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

Objective-C

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

и далее все доступные URL

  • префы: корень = Общие и путь = О
  • префы: корень = Общие и путь = ДОСТУПНОСТИ
  • префы: корень = 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
  • префы: корень = FACEBOOK
  • prefs: root = General & path = USAGE prefs: root = VIDEO
  • префы: корень = Общие и путь = Сеть /VPN
  • префы: корень = обои
  • префы: корень = WIFI
  • префы: корень = INTERNET_TETHERING
  • префы: корень = Телефон и путь = Blocked
  • префы: корень = DO_NOT_DISTURB

Примечание: настройки сети не будут открыты в симуляторе, но ссылка будет работать на реальном устройстве.

Ответ 3

В iOS 8+ вы можете сделать следующее:

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

Swift 4

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

Ответ 4

Используя подсказку @vivek, я разрабатываю класс utils на основе 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

Первый ответ от URL-адресов для конкретных приложений работал у меня на iOS 10.3.

if let appSettings = URL(string: UIApplicationOpenSettingsURLString + Bundle.main.bundleIdentifier!) {
    if UIApplication.shared.canOpenURL(appSettings) {
      UIApplication.shared.open(appSettings)
    }
  }

Ответ 6

App-Prefs:root=Privacy&path=LOCATION работал у меня для получения общих настроек местоположения. Примечание: работает только на устройстве.

Ответ 7

в ios10/Xcode 8 в симуляторе:

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

работы

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

нет.

Ответ 8

Я видел эту строку кода

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

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

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

Swift3

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

Заменить

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

Надеюсь, это поможет. Приветствия.

Ответ 9

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

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

Следующие шаги

Чтобы устранить эту проблему, перейдите в приложение, чтобы предоставить связанные функции с помощью общедоступных API-интерфейсов или удалить функциональные возможности, используя схему URL-адресов "prefs: root" или "App-Prefs: root".

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

Ответ 10

Swift 4.2, iOS 12

Метод open(url:options:completionHandler:) был обновлен, чтобы включить словарь не-nil options, который на этом посту содержит только одну возможную опцию типа 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, получило некоторые приложения, отклоненные из магазина.

Ответ 11

Добавление к @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)
    }
}

Ответ 12

SWIFT 4

Это может привести к вашим конкретным настройкам вашего приложения, если это то, что вы ищете.

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

Ответ 13

Как указано выше, @niravdesai сказал App-prefs. Я обнаружил, что App-Prefs: работает для тестируемых устройств iOS 9, 10 и 11. где prefs: работает только на iOS 9.

Ответ 14

В iOS 10 и Swift 3 используйте следующий код:

UIApplication.shared.open(URL.init(string: "App-Prefs:root=General")!, options: [:]) { (success) in
}