Bagaimana cara membuka pengaturan ponsel ketika tombol diklik?

160

Saya mencoba menerapkan fitur di App yang menunjukkan peringatan ketika koneksi internet tidak tersedia. Peringatan itu memiliki dua tindakan (OK dan Pengaturan), setiap kali pengguna mengklik pengaturan, saya ingin membawanya ke pengaturan telepon secara terprogram.

Saya menggunakan Swift dan Xcode.

Solomon Ayoola
sumber

Jawaban:

301

Menggunakan UIApplication.openSettingsURLString

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

Cepat 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
sumber
Bagaimana saya menerapkannya? @Marius Fanu
Solomon Ayoola
menggunakan iOS8 @Marius Fanu
Solomon Ayoola
@AyoolaSolomon Saya sudah memperbarui jawaban saya untuk menambahkan peringatan pada viewDidAppearmetode, dengan tombol SettingsdanCancel
Marius Fanu
2
Tidak, kurasa tidak. Untuk menuju ke aplikasi Anda, aplikasi Anda harus menerapkan skema URL khusus, dan memanggil UIApplication.sharedApplication().openURL(yourCustomURL)dari aplikasi saat ini, tetapi Anda tidak memiliki akses dari aplikasi Pengaturan
Marius Fanu
5
@PersianBlue benar di iOS 10.1.1 ini gagal meluncurkan aplikasi Pengaturan.
Michael Garito
237

⚠️ Berhati-hatilah!

Jawaban ini didasarkan pada API tidak berdokumen dan baru-baru ini (sejak iOS12) Apple menolak aplikasi dengan pendekatan ini.

Jawaban asli di bawah ini

Cepat 5

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

Cepat 4

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

CATATAN: Metode berikut ini berfungsi untuk semua versi di bawah iOS 11, untuk versi yang lebih tinggi aplikasi mungkin ditolak karena ini adalah API pribadi

Terkadang kami ingin membawa pengguna ke pengaturan selain pengaturan aplikasi kami. Metode berikut akan membantu Anda mencapai itu:

Pertama, konfigurasikan Skema URL di proyek Anda. Anda akan menemukannya di Target -> Info -> Skema URL. klik tombol + dan ketik prefs di Skema URL

masukkan deskripsi gambar di sini

Cepat 5

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

Cepat 3

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

Cepat

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

Objektif-C

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

dan berikut ini semua URL yang tersedia

** Di iOS <12 **

  • prefs: root = Umum & jalur = Tentang
  • prefs: root = Umum & jalur = ACCESSIBILITY
  • prefs: root = AIRPLANE_MODE
  • prefs: root = Umum & jalur = AUTOLOCK
  • prefs: root = Umum & jalur = USAGE / CELLULAR_USAGE
  • prefs: root = Brightness
  • prefs: root = Bluetooth
  • prefs: root = Umum & jalur = DATE_AND_TIME
  • prefs: root = FACETIME
  • prefs: root = Umum
  • prefs: root = Umum & jalur = Keyboard
  • prefs: root = CASTLE
  • prefs: root = CASTLE & path = STORAGE_AND_BACKUP
  • prefs: root = Umum & jalur = INTERNASIONAL
  • prefs: root = LOCATION_SERVICES
  • prefs: root = ACCOUNT_SETTINGS
  • prefs: root = MUSIK
  • prefs: root = MUSIK & jalur = EQ
  • prefs: root = MUSIK & jalur = VolumeLimit
  • prefs: root = Umum & jalur = Jaringan
  • prefs: root = NIKE_PLUS_IPOD
  • prefs: root = CATATAN
  • prefs: root = NOTIFICATIONS_ID
  • prefs: root = Telepon
  • prefs: root = Foto
  • prefs: root = Umum & jalur = ManagedConfigurationList
  • prefs: root = Umum & jalur = Reset
  • prefs: root = Suara & jalur = Nada Dering
  • prefs: root = Safari
  • prefs: root = Umum & jalur = Asisten
  • prefs: root = Suara
  • prefs: root = Umum & jalur = SOFTWARE_UPDATE_LINK
  • prefs: root = STORE
  • prefs: root = TWITTER
  • prefs: root = FACEBOOK
  • prefs: root = Umum & path = USAGE prefs: root = VIDEO
  • prefs: root = Umum & jalur = Jaringan / VPN
  • prefs: root = Wallpaper
  • prefs: root = WIFI
  • prefs: root = INTERNET_TETHERING
  • prefs: root = Telepon & jalur = Diblokir
  • prefs: root = DO_NOT_DISTURB

Di iOS 13

  • Pre-app: Umum & jalur = Tentang
  • Pre-aplikasi: AIRPLANE_MODE
  • Pre-app: Umum & jalur = AUTOLOCK
  • App-prefs: Bluetooth
  • Pre-app: Umum & jalur = DATE_AND_TIME
  • App-prefs: FACETIME
  • App-prefs: Umum
  • Pre-app: Umum & jalur = Keyboard
  • App-prefs: CASTLE
  • Pre-app: CASTLE & path = STORAGE_AND_BACKUP
  • Pre-app: Umum & jalur = INTERNASIONAL
  • Pre-aplikasi: MUSIK
  • App-prefs: CATATAN
  • Pre-app: NOTIFICATIONS_ID
  • App-prefs: Telepon
  • Pre-aplikasi: Foto
  • Pre-app: Umum & jalur = ManagedConfigurationList
  • Pre-app: Umum & jalur = Reset
  • App-prefs: Sounds & path = Ringtone
  • App-prefs: Suara
  • Pre-app: Umum & jalur = SOFTWARE_UPDATE_LINK
  • App-prefs: STORE
  • App-prefs: Wallpaper
  • App-prefs: WIFI
  • Pre-app: INTERNET_TETHERING
  • Pre-aplikasi: DO_NOT_DISTURB

    Tidak diuji

  • App-prefs: TWITTER (??)

  • App-prefs: FACEBOOK (??)
  • Pre-aplikasi: NIKE_PLUS_IPOD (??)

Catatan: Pengaturan jaringan tidak akan dibuka dalam simulator, tetapi tautan akan berfungsi pada perangkat nyata.

vivek takrani
sumber
7
Ini tidak berfungsi dengan iOS 10. Menjalankan kode yang sama di iOS 9.3. dan itu berhasil, berjalan di iOS 10 dan tidak (terlepas dari url mana yang digunakan)
Gruntcakes
18
Untuk iOS 10, gunakan App-Prefssebagai ganti dari prefsstring URL. misalnyaApp-Prefs:root=WIFI
Desmond DAI
8
baru-baru ini memberikan aplikasi untuk dirilis di App Store, dan Apple menolaknya karena penggunaan "prefs: root" atau "App-Prefs: root". Saya menggunakannya untuk membuka pengaturan wifi, ketika pengguna tidak memiliki koneksi internet.
Marcel T
21
Sejak iOS 12 segera keluar, Apple menolak aplikasi yang menyertakan pref. Harap berhati-hati. Bahkan aplikasi saya juga ditolak
Thiha Aung
8
JANGAN gunakan App-Prefsatau prefs:rootkarena ini adalah API pribadi, dan kecuali Anda sangat beruntung aplikasi Anda akan ditolak.
Tejas K
45

Di iOS 8+ Anda dapat melakukan hal berikut:

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

Cepat 4

    let settingsUrl = URL(string: UIApplicationOpenSettingsURLString)!
    UIApplication.shared.open(settingsUrl)
Kristen
sumber
16
Ini membawa Anda ke pengaturan khusus aplikasi, bagaimana cara membawanya ke halaman pengaturan umum atau bahkan lebih baik ke bagian kesehatan?
Ace Green
2
Swift 3 -UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
Aviv Ben Shabat
@AceGreen apakah Anda berhasil ke bagian kesehatan?
Saad
Bagaimana Anda membuka hanya aplikasi Pengaturan? "Home page"
Daniel Springer
tanpa "!" tandatanganiURL(string: UIApplication.openSettingsURLString).map { UIApplication.shared.open($0, options: [:], completionHandler: nil) }
ober
21

Menggunakan petunjuk @ vivek, saya mengembangkan kelas utilitas berdasarkan Swift 3 , harap Anda menghargai!

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

}

Ini sangat membantu karena API akan berubah dengan pasti dan Anda dapat melakukan refactor sekali dan sangat cepat!

Luca Davanzo
sumber
5
Apakah ini akan melalui tinjauan apel?
L_Sonic
Saya akan menambahkan satu hal lagi untuk membuatnya sedikit lebih baik. Di enum, Anda bisa membuat variabel tipe String dengan nama urlString. Kemudian kembalikan "App-Prefs: root =" = self.rawValue. Ini pada dasarnya akan menghapus kebutuhan untuk appPath dan private let statis. Bersulang.
mn1
Pengaturan notifikasi tidak terbuka di iOS 11.
Metin Atalay
2
ini tidak akan berfungsi karena kami menerima pesan ini dari aplikasi: "Aplikasi Anda menggunakan skema URL non-publik" prefs: root = ", yang merupakan entitas pribadi. Penggunaan API non-publik tidak diizinkan di App Store karena itu dapat menyebabkan pengalaman pengguna yang buruk jika API ini berubah. Terus menggunakan atau menyembunyikan API non-publik dalam pengiriman aplikasi ini di masa depan dapat mengakibatkan penghentian akun Pengembang Apple Anda, serta penghapusan semua aplikasi terkait dari App. Toko."
CodeOverRide
1
@L_Sonic tidak, itu tidak akan lulus ulasan, dan jika ya, itu bisa ditandai secara acak di setiap pembaruan di masa mendatang yang Anda dorong
RP Carson
16

Tanggapan pertama dari Skema URL Khusus Aplikasi berfungsi untuk saya di iOS 10.3.

if let appSettings = URL(string: UIApplicationOpenSettingsURLString + Bundle.main.bundleIdentifier!) {
    if UIApplication.shared.canOpenURL(appSettings) {
      UIApplication.shared.open(appSettings)
    }
  }
inc_london
sumber
Apa yang seharusnya dibuka?
Daniel Springer
12

App-Prefs:root=Privacy&path=LOCATIONbekerja untuk saya untuk mendapatkan pengaturan lokasi umum. Catatan: hanya berfungsi di perangkat.

Joe Susnick
sumber
12
Ini ditolak
Daniel Springer
7

di ios10 / Xcode 8 di simulator:

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

bekerja

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

tidak.

ingconti
sumber
Apakah NSawalan telah dihapus di iOS 10?
JC Rocamonde
2
Ini hanya akan berfungsi jika aplikasi Anda memiliki file .bundle (preferensi aplikasi Anda)
Sophy Swicz
@ Swy Swicz Bagaimana saya dapat menambahkan file bundle?
Pengembang
1
@Developer github.com/phynet/SettingBundleiOSProject juga, pengaturan aplikasi Anda adalah semua layanan yang memungkinkan aplikasi Anda untuk digunakan dan ditampilkan secara umum -> pengaturan aplikasi Anda
Sophy Swicz
7

Saya telah melihat baris kode ini

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

tidak berfungsi, itu tidak berfungsi untuk saya di ios10 / Xcode 8, hanya perbedaan kode kecil, harap ganti dengan ini

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

Swift3

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

Ubah dengan

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

Semoga ini bisa membantu. Bersulang.

niravdesai21
sumber
1
Penyebab: Aplikasi ditolak
ergunkocak
7

kata peringatan: skema prefs:rootatau App-Prefs:rootURL dianggap API pribadi. Apple dapat menolak aplikasi Anda jika Anda menggunakannya, berikut adalah apa yang mungkin Anda dapatkan ketika mengirimkan aplikasi Anda:

Aplikasi Anda menggunakan skema URL non-publik "prefs: root =", yang merupakan entitas pribadi. Penggunaan API non-publik tidak diizinkan di App Store karena dapat menyebabkan pengalaman pengguna yang buruk jika API ini berubah. Terus menggunakan atau menyembunyikan API non-publik dalam pengiriman aplikasi ini di masa depan dapat mengakibatkan penghentian akun Pengembang Apple Anda, serta penghapusan semua aplikasi terkait dari App Store.

Langkah selanjutnya

Untuk mengatasi masalah ini, harap revisi aplikasi Anda untuk menyediakan fungsionalitas terkait menggunakan API publik atau menghapus fungsionalitas menggunakan skema URL "prefs: root" atau "App-Prefs: root".

Jika tidak ada alternatif untuk menyediakan fungsionalitas yang dibutuhkan aplikasi Anda, Anda dapat mengajukan permintaan peningkatan.

ofer
sumber
Tidak ada cara yang didukung untuk membuka Pengaturan ke 'halaman' Wi-Fi / Bahasa / Lokasi. Fakta bahwa ini bekerja di iOS 9 adalah bug yang telah diperbaiki di iOS 10. Untuk info lebih lanjut silakan lihat forums.developer.apple.com/message/186656#186656
Mohit Kumar
6

Swift 4.2, iOS 12

The open(url:options:completionHandler:)Metode telah diperbarui untuk menyertakan opsi non-nihil kamus, yang pada posting ini hanya berisi satu pilihan yang mungkin jenis UIApplication.OpenExternalURLOptionsKey(dalam contoh).

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

}

Secara eksplisit membuat URL, seperti dengan "App-Prefs", telah, AFAIK, mendapatkan beberapa aplikasi ditolak dari toko.

bsod
sumber
Saya mengkonfirmasi ini, aplikasi baik-baik saja dengan "App-Prefs" sebelumnya, tetapi setelah Acara Khusus Apple pembaruan saya ditolak, jatuh kembali ke UIApplicationOpenSettingsURLString.
Vitalii
5

Menambahkan ke @Luca Davanzo

iOS 11, beberapa pengaturan izin telah pindah ke jalur aplikasi:

Dukungan 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)
    }
}
Tal Zion
sumber
2
dapatkah ini melalui Apple Review? Maksud saya, apakah ini akan menyebabkan penolakan aplikasi?
Aakash Dave
4
ketika saya menjalankan kode ini, saya hanya membawa saya ke halaman pengaturan. Bukan tab pengaturan khusus di dalamnya.
Aakash Dave
2

SWIFT 4

Ini bisa mengambil pengaturan spesifik aplikasi Anda, jika itu yang Anda cari.

UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
BennyTheNerd
sumber
terima kasih ... Saya sudah berfungsi ... tapi saya ingin mengubah pengaturan pada aplikasi yang dibuat oleh pengembang lain. Misalnya, tekan tombol dan ubah pengaturan Push notification Facebook agar mereka tidak mengirim pesan saat rapat. Saya memprediksi mungkin ada solusi MDM ... atau tidak.
IrishGringo
@IrishGringo satu-satunya cara untuk mengubah pengaturan aplikasi Facebook adalah bagi pengguna untuk membuka pengaturan aplikasi Facebook sendiri dengan menavigasi melalui Pengaturan Umum >> Pemberitahuan >> Facebook
BennyTheNerd
0

Seperti di atas @niravdesai mengatakan App-prefs. Saya menemukan bahwa App-Prefs:berfungsi untuk perangkat iOS 9, 10 dan 11. yang diuji. di mana karena prefs:hanya berfungsi di iOS 9.

Alix
sumber