Bir düğme tıklandığında telefon ayarlarını nasıl açabilirim?


160

İnternet bağlantısı olmadığında bir uyarı gösteren bir Uygulamada bir özellik uygulamaya çalışıyorum. Uyarının iki eylemi vardır (Tamam ve Ayarlar), bir kullanıcı ayarları her tıkladığında, bunları programlı olarak telefon ayarlarına götürmek istiyorum.

Swift ve Xcode kullanıyorum.

Yanıtlar:


302

kullanma UIApplication.openSettingsURLString

Swift 5.1 Güncellemesi

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

Hızlı 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)
}

Bunu nasıl uygularım? @Marius Fanu
Solomon Ayoola

iOS8 @Marius Fanu kullanarak
Solomon Ayoola

@AyoolaSolomon ve düğmesiyle viewDidAppearyönteme uyarı eklemek için cevabımı güncelledimSettingsCancel
Marius Fanu

2
Hayır, sanmıyorum. Uygulamanıza gitmek için, uygulamanız özel bir URL şeması UIApplication.sharedApplication().openURL(yourCustomURL)uygulamalı ve geçerli uygulamadan aramalıdır, ancak Ayarlar uygulamasından bu erişime sahip değilsiniz
Marius Fanu

5
@PersianBlue, iOS 10.1.1'de doğrudur, bu Ayarlar uygulamasını başlatamaz.
Michael Garito

237

⚠️ Dikkatli ol!

Bu yanıt belgesiz API'lara dayanıyor ve son zamanlarda (iOS12'den beri) Apple bu yaklaşımla uygulamaları reddediyor.

Orijinal cevap aşağıda

Hızlı 5

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

Hızlı 4

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

NOT: Aşağıdaki yöntem iOS 11'in altındaki tüm sürümler için geçerlidir, daha yüksek sürümler için uygulama özel bir API olduğu için reddedilebilir

Bazen bir kullanıcıyı uygulama ayarlarımız dışındaki ayarlara yönlendirmek isteriz. Aşağıdaki yöntem bunu başarmanıza yardımcı olacaktır:

İlk olarak, projenizdeki URL Şemalarını yapılandırın. Hedef -> Bilgi -> URL Şemasında bulabilirsiniz. + düğmesini tıklayın ve URL Şemalarına tercihler yazın

resim açıklamasını buraya girin

Hızlı 5

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

Hızlı 3

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

hızlı

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

Objective-C

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

ve aşağıdakilerin tümü kullanılabilir URL'lerdir

** IOS <12'de **

  • prefs: Kök = Genel & yol = Hakkında
  • prefs: Kök = Genel & yol = ACCESSIBILITY
  • prefs: Kök = AIRPLANE_MODE
  • prefs: Kök = Genel & yol = AUTOLOCK
  • prefs: Kök = Genel & yol = KULLANIM / CELLULAR_USAGE
  • prefs: Kök = Parlaklık
  • prefs: Kök = Bluetooth
  • prefs: Kök = Genel & yol = DATE_AND_TIME
  • prefs: Kök = FaceTime
  • prefs: Kök = Genel
  • prefs: Kök = Genel & yol = Klavye
  • prefs: Kök = KALESİ
  • prefs: Kök = KALESİ & yolu = STORAGE_AND_BACKUP
  • prefs: Kök = Genel & yol = ULUSLARARASI
  • prefs: Kök = LOCATION_SERVICES
  • prefs: Kök = ACCOUNT_SETTINGS
  • prefs: Kök = MÜZİK
  • prefs: Kök = MÜZİK & yol = EQ
  • prefs: Kök = MÜZİK & yol = VolumeLimit
  • prefs: Kök = Genel & yol = Ağ
  • prefs: Kök = NIKE_PLUS_IPOD
  • prefs: Kök = NOTLAR
  • prefs: Kök = NOTIFICATIONS_ID
  • prefs: Kök = Telefon
  • prefs: Kök = Fotoğraflar
  • prefs: Kök = Genel & yol = ManagedConfigurationList
  • prefs: Kök = Genel & yol = Sıfırlama
  • prefs: Kök = Sesler & yol = Zil
  • prefs: Kök = Safari
  • prefs: Kök = Genel & yol = Yardımcısı
  • prefs: Kök = Sesler
  • prefs: Kök = Genel & yol = SOFTWARE_UPDATE_LINK
  • prefs: Kök = MAĞAZA
  • prefs: Kök = TWITTER
  • prefs: Kök = FACEBOOK
  • prefs: root = Genel & yol = USAGE prefs: root = VIDEO
  • prefs: Kök = Genel & yol = Ağ / VPN
  • prefs: Kök = Duvar Kağıdı
  • prefs: Kök = WIFI
  • prefs: Kök = INTERNET_TETHERING
  • prefs: Kök = Telefon & yol = Engellenen
  • prefs: Kök = DO_NOT_DISTURB

IOS 13'te

  • App-prefs: Genel & yol = Hakkında
  • App-prefs: AIRPLANE_MODE
  • App-prefs: Genel & yol = AUTOLOCK
  • App-prefs: Bluetooth
  • App-prefs: Genel & yol = DATE_AND_TIME
  • App-prefs: FaceTime
  • App-prefs: Genel
  • App-prefs: Genel & yol = Klavye
  • App-prefs: KALESİ
  • App-prefs: KALESİ & yolu = STORAGE_AND_BACKUP
  • App-prefs: Genel & yol = ULUSLARARASI
  • App-prefs: MÜZİK
  • App-prefs: NOTLAR
  • App-prefs: NOTIFICATIONS_ID
  • App-prefs: Telefon
  • App-prefs: Fotoğraflar
  • App-prefs: Genel & yol = ManagedConfigurationList
  • App-prefs: Genel & yol = Sıfırlama
  • App-prefs: Sesler & yol = Zil
  • App-prefs: Sesler
  • App-prefs: Genel & yol = SOFTWARE_UPDATE_LINK
  • App-prefs: MAĞAZA
  • App-prefs: Duvar kağıdı
  • App-prefs: WIFI
  • App-prefs: INTERNET_TETHERING
  • App-prefs: DO_NOT_DISTURB

    Test edilmedi

  • Uygulama tercihleri: TWITTER (??)

  • Uygulama tercihleri: FACEBOOK (??)
  • Uygulama tercihleri: NIKE_PLUS_IPOD (??)

Not: Ağ ayarı bir simülatörde açılmaz, ancak bağlantı gerçek bir cihazda çalışır.


7
Bu iOS 10 ile çalışmaz. İOS 9.3'te aynı kodu çalıştırın. ve işe yaradı, iOS 10'da çalıştı ve hangi
URL'nin

18
İOS 10 için, URL dizesinin şeması App-Prefsyerine kullanın prefs. ör.App-Prefs:root=WIFI
Desmond DAI

8
kısa süre önce bir uygulamayı App Store'da yayınlamak için incelemeye girdi ve Apple "prefs: root" veya "App-Prefs: root" kullanımı nedeniyle uygulamayı reddetti. Kullanıcının internet bağlantısı olmadığında wifi ayarlarını açmak için kullandım.
Marcel T

21
İOS 12 yakında piyasaya çıktığından beri Apple bu tür bir tercih içeren uygulamayı reddetti. Lütfen bunun farkında ol. Uygulamam bile reddedildi
Thiha Aung

8
KULLANMAYIN App-Prefsveya prefs:rootbunlar özel API'ler olduğundan ve çok şanslı değilseniz uygulamanız reddedilir.
Tejas K

45

İOS 8 ve sonraki sürümlerinde aşağıdakileri yapabilirsiniz:

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

Hızlı 4

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

16
Bu sizi uygulamaya özgü ayarlara götürür, bunları genel ayarlar sayfasına nasıl yönlendirebilirim, hatta sağlık bölümüne daha iyi nasıl getirebilirim?
Ace Green

2
Swift 3 -UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
Aviv Ben Shabat

@AceGreen bunu sağlık bölümüne yaptınız mı?
Saad

Yalnızca Ayarlar uygulamasını nasıl açarsınız? "Ana Sayfa"
Daniel Springer

"!" olmadan işaretiURL(string: UIApplication.openSettingsURLString).map { UIApplication.shared.open($0, options: [:], completionHandler: nil) }
ober

21

@ Vivek'in ipucunu kullanarak Swift 3 tabanlı bir utils sınıfı geliştiriyorum , umarım takdir edersiniz!

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

}

Bu, API'lerin kesin olarak değişeceği ve bir kez ve çok hızlı bir şekilde yeniden düzenleyebileceğiniz için çok yararlıdır!


5
Bu elma incelemesinden geçebilir mi?
L_Sonic

Biraz daha iyi hale getirmek için bir şey daha ekleyeceğim. Enum'da, urlString adıyla String türünde bir değişken yapabilirsiniz. Sonra "App-Prefs: root =" = self.rawValue döndürün. Bu temelde appPath ve statik özel izin ihtiyacını ortadan kaldıracaktır. Şerefe.
mn1


2
bu mesajı uygulamadan aldığımız için çalışmaz: "Uygulamanız özel bir varlık olan" prefs: root = "herkese açık olmayan URL şemasını kullanıyor. Herkese açık olmayan API'ların kullanımına App Store'da izin verilmiyor çünkü bu API'ların değişmesi durumunda kötü bir kullanıcı deneyimine yol açabilir.Bu uygulamanın gelecekteki gönderilerinde herkese açık olmayan API'ları kullanmaya veya gizlemeye devam etmek Apple Developer hesabınızın sonlandırılmasına ve ilişkili tüm uygulamaların Uygulamadan kaldırılmasına neden olabilir saklayın."
CodeOverRide

1
@L_Sonic hayır inceleme geçmeyecek ve eğer öyleyse, ileride basacağınız güncellemelerde rastgele işaretlenebilir
RP Carson


12

App-Prefs:root=Privacy&path=LOCATIONgenel konum ayarlarına ulaşmak için benim için çalıştı. Not: yalnızca bir cihazda çalışır.


12
Bu reddedildi
Daniel Springer

7

simülatörde ios10 / Xcode 8'de:

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

İşler

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

değil.


Has NSönek iOS 10'da kaldırıldı?
JC Rocamonde

2
Bu yalnızca uygulamanızda .bundle dosyası (uygulama tercihleriniz) varsa çalışır
Sophy Swicz

@Sophy Swicz .bundle dosyasını nasıl ekleyebilirim?
Geliştirici

1
@Developer github.com/phynet/SettingBundleiOSProject ayrıca, uygulama ayarlarınız, uygulamanızın kullanmasına izin veren tüm hizmetlerdir ve Genel -> uygulamanızın ayarları içinde gösterilir
Sophy Swicz

7

Bu kod satırını gördüm

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

çalışmıyor, benim için ios10 / Xcode 8'de işe yaramadı, sadece küçük bir kod farkı, lütfen bunu değiştirin

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

swift3

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

İle değiştirin

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

Umarım yardımcı olur. Şerefe.


1
Nedenler: Uygulama reddedildi
ergunkocak

7

uyarı kelimesi: prefs:rootveya App-Prefs:rootURL şemaları özel API olarak kabul edilir. Bunları kullanırsanız Apple uygulamanızı reddedebilir, uygulamanızı gönderirken alabileceğiniz şeyler şunlardır:

Uygulamanız, özel bir varlık olan "prefs: root =" herkese açık olmayan URL şemasını kullanıyor. Herkese açık olmayan API'ların kullanımına App Store'da izin verilmez, çünkü bu API'ların değişmesi durumunda kötü bir kullanıcı deneyimine yol açabilir. Bu uygulamanın gelecekteki gönderilerinde herkese açık olmayan API'ları kullanmaya veya gizlemeye devam etmek, Apple Geliştirici hesabınızın feshedilmesine ve ilişkili tüm uygulamaların App Store'dan kaldırılmasına neden olabilir.

Sonraki adımlar

Bu sorunu çözmek için lütfen uygulamanızı, genel API'ları kullanarak ilişkili işlevselliği sağlayacak şekilde değiştirin veya "prefs: root" veya "App-Prefs: root" URL şemasını kullanarak işlevselliği kaldırın.

Uygulamanızın gerektirdiği işlevselliği sağlamak için alternatif yoksa bir geliştirme isteği gönderebilirsiniz.


Ayarları Wi-Fi / Dil / Konum 'sayfasına' açmanın desteklenen bir yolu yok '. Bunun iOS 9'da çalıştığı gerçeği, iOS 10'da düzeltilen bir hatadır. Daha fazla bilgi için lütfen forums.developer.apple.com/message/186656#186656
Mohit Kumar

6

Swift 4.2, iOS 12

open(url:options:completionHandler:)Yöntem olmayan bir nil seçenekler bu yazının sadece tip olası bir seçenek içeren, sözlüğe dahil etmek güncellenmiştir UIApplication.OpenExternalURLOptionsKey(örnekte).

@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)

}

"App-Prefs" gibi bir URL'yi açıkça oluşturmak, AFAIK'in mağazadan bazı uygulamaları reddettiğini gösterdi.


Bunu onaylıyorum, uygulama daha önce "App-Prefs" ile iyiydi, ancak Apple'ın Özel Etkinliğinden sonra güncellemem reddedildi, UIApplicationOpenSettingsURLString'e geri döndü.
Vitalii

5

@Luca Davanzo'ya ekleniyor

iOS 11, bazı izin ayarları uygulama yoluna taşındı:

iOS 11 Desteği

 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
bu Apple Review üzerinden geçebilir mi? Demek istediğim, bu uygulama reddine yol açacak mı?
Aakash Dave

4
Bu kodu çalıştırdığımda, beni sadece ayarlar sayfasına götürüyorum. İçindeki belirli ayarlar sekmesi değil.
Aakash Dave

2

SWIFT 4

Bu, aradığınız şeyse uygulamanızın özel ayarlarını alabilir.

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

teşekkürler ... Bu çalışmam var ... ama diğer geliştiricilerin uygulamalarındaki ayarları değiştirmek istiyorum. Örneğin, bir düğmeye basın ve facebook'un Anlık bildirim ayarlarını bir toplantı sırasında mesajlaşmayacak şekilde değiştirin. MDM çözümleri olabileceğini tahmin ediyorum ... ya da değil.
IrishGringo

@IrishGringo, Facebook uygulamasının ayarlarını değiştirmenin tek yolu, kullanıcının Genel Ayarlar >> Bildirimler >> Facebook
BennyTheNerd

0

Yukarıdaki gibi @ niravdesai dedi App-prefs. App-Prefs:Test edilen hem iOS 9, 10 hem de 11. cihazlar için işe yaradığını buldum . nereye kadar prefs:yalnızca iOS 9 üzerinde çalışır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.