Làm cách nào để mở cài đặt điện thoại khi nhấp vào nút?


159

Tôi đang cố gắng triển khai một tính năng trong Ứng dụng hiển thị cảnh báo khi không có kết nối internet. Cảnh báo có hai hành động (OK và Cài đặt), bất cứ khi nào người dùng nhấp vào cài đặt, tôi muốn đưa họ đến cài đặt điện thoại theo chương trình.

Tôi đang sử dụng Swift và Xcode.

Câu trả lời:


300

Sử dụng UIApplication.openSettingsURLString

Cập nhật cho 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)
}

Làm thế nào để tôi thực hiện điều đó? @Marius Fanu
Solomon Ayoola

nó sử dụng iOS8 @Marius Fanu
Solomon Ayoola

@AyoolaSolomon Tôi đã cập nhật câu trả lời của mình để thêm cảnh báo về viewDidAppearphương pháp, bằng nút SettingsCancel
Marius Fanu

2
Không, tôi không nghĩ vậy. Để truy cập ứng dụng của bạn, ứng dụng của bạn nên triển khai lược đồ URL tùy chỉnh và gọi UIApplication.sharedApplication().openURL(yourCustomURL)từ ứng dụng hiện tại, nhưng bạn không có quyền truy cập đó từ ứng dụng Cài đặt
Marius Fanu

5
@PersianBlue đúng trong iOS 10.1.1, điều này không thể khởi chạy ứng dụng Cài đặt.
Michael Garito

237

Cẩn thận!

Câu trả lời này dựa trên các API không có giấy tờ và gần đây (kể từ iOS12) Apple đang từ chối các ứng dụng với phương pháp này.

Câu trả lời gốc dưới đây

Swift 5

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

Swift 4

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

LƯU Ý: Phương pháp sau hoạt động cho tất cả các phiên bản bên dưới iOS 11, đối với các phiên bản cao hơn, ứng dụng có thể bị từ chối vì đó là API riêng

Đôi khi, chúng tôi muốn đưa người dùng đến các cài đặt khác ngoài cài đặt ứng dụng của chúng tôi. Phương pháp sau đây sẽ giúp bạn đạt được điều đó:

Đầu tiên, định cấu hình Lược đồ URL trong dự án của bạn. Bạn sẽ tìm thấy nó trong Target -> Thông tin -> Lược đồ URL. nhấp vào nút + và nhập prefs trong Lược đồ URL

nhập mô tả hình ảnh ở đây

Swift 5

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

Swift 3

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

Nhanh

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

Mục tiêu-C

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

và sau đây là tất cả các URL có sẵn

** Trên iOS <12 **

  • prefs: root = General & path = Giới thiệu
  • prefs: root = General & path = ACCESSITALITY
  • prefs: root = AIRPLane_MODE
  • prefs: root = General & path = AUTOLOCK
  • prefs: root = General & path = USAGE / CELLULAR_USAGE
  • prefs: root = Độ sáng
  • prefs: root = Bluetooth
  • prefs: root = General & path = DATE_AND_TIME
  • prefs: root = FACETIME
  • prefs: root = Chung
  • prefs: root = General & path = Bàn phím
  • prefs: root = CASTLE
  • prefs: root = CASTLE & path = STORAGE_AND_BACKUP
  • prefs: root = General & path = QUỐC TẾ
  • prefs: root = LOCATION_SERVICE
  • prefs: root = ACCOUNT_SettING
  • prefs: root = NHẠC
  • prefs: root = MUSIC & path = EQ
  • prefs: root = MUSIC & path = VolumeLimit
  • prefs: root = General & path = Network
  • prefs: root = NIKE_PLUS_IPOD
  • prefs: root = GHI CHÚ
  • prefs: root = THÔNG BÁO_ID
  • prefs: root = Điện thoại
  • prefs: root = Ảnh
  • prefs: root = General & path = ManagedConfigurationList
  • prefs: root = General & path = Đặt lại
  • prefs: root = Âm thanh & đường dẫn = Nhạc chuông
  • prefs: root = Safari
  • prefs: root = General & path = Trợ lý
  • prefs: root = Âm thanh
  • prefs: root = General & path = SOFTWARE_UPDATE_LINK
  • prefs: root = CỬA HÀNG
  • prefs: root = TWITTER
  • prefs: root = FACEBOOK
  • prefs: root = General & path = USAGE prefs: root = VIDEO
  • prefs: root = General & path = Network / VPN
  • prefs: root = Hình nền
  • prefs: root = WIFI
  • prefs: root = INTERNET_TETHITH
  • prefs: root = Điện thoại & đường dẫn = Bị chặn
  • prefs: root = DO_NOT_DISTURB

Trên iOS 13

  • Ứng dụng prefs: Chung & đường dẫn = Giới thiệu
  • Ứng dụng prefs: AIRPLane_MODE
  • Ứng dụng prefs: Chung & đường dẫn = AUTOLOCK
  • Ứng dụng prefs: Bluetooth
  • Ứng dụng prefs: Chung & path = DATE_AND_TIME
  • Ứng dụng prefs: FACETIME
  • Ứng dụng prefs: Chung
  • Ứng dụng prefs: General & path = Bàn phím
  • Ứng dụng prefs: CASTLE
  • Ứng dụng prefs: CASTLE & path = STORAGE_AND_BACKUP
  • Ứng dụng prefs: Chung & đường dẫn = QUỐC TẾ
  • Ứng dụng prefs: NHẠC
  • Ứng dụng prefs: GHI CHÚ
  • Ứng dụng prefs: THÔNG BÁO_ID
  • Ứng dụng prefs: Điện thoại
  • Ứng dụng prefs: Ảnh
  • Ứng dụng prefs: General & path = ManagedConfigurationList
  • Ứng dụng prefs: General & path = Reset
  • Ứng dụng prefs: Âm thanh & đường dẫn = Nhạc chuông
  • Ứng dụng prefs: Âm thanh
  • Ứng dụng trước: Chung & đường dẫn = SOFTWARE_UPDATE_LINK
  • Ứng dụng prefs: CỬA HÀNG
  • Ứng dụng prefs: Hình nền
  • Ứng dụng prefs: WIFI
  • Ứng dụng prefs: INTERNET_TETHITH
  • Ứng dụng prefs: DO_NOT_DISTURB

    Không được kiểm tra

  • Ứng dụng prefs: TWITTER (??)

  • Ứng dụng prefs: FACEBOOK (??)
  • Ứng dụng prefs: NIKE_PLUS_IPOD (??)

Lưu ý: Cài đặt mạng sẽ không được mở trong trình giả lập, nhưng liên kết sẽ hoạt động trên thiết bị thực.


7
Điều này không hoạt động với iOS 10. Chạy cùng mã trên iOS 9.3. và nó đã hoạt động, chạy trên iOS 10 và nó không hoạt động (bất kể sử dụng url nào)
Gruntcakes

18
Đối với iOS 10, hãy sử dụng App-Prefsthay vì prefslàm sơ đồ của chuỗi URL. ví dụApp-Prefs:root=WIFI
Desmond ĐẠI

8
gần đây đã đưa ra một ứng dụng để xem xét để phát hành nó trong App Store và Apple đã từ chối vì sử dụng "prefs: root" hoặc "App-Prefs: root". Tôi đã sử dụng nó để mở cài đặt wifi, khi người dùng không có kết nối internet.
Marcel T

21
Kể từ khi iOS 12 sắp ra mắt, Apple đã từ chối ứng dụng bao gồm tiền tố như vậy. Xin lưu ý về nó. Ngay cả ứng dụng của tôi cũng bị từ chối
Thiha Aung

8
KHÔNG sử dụng App-Prefshoặc prefs:rootvì đây là các API riêng tư và trừ khi bạn rất may mắn, ứng dụng của bạn sẽ bị từ chối.
Tejas K

45

Trong iOS 8+, bạn có thể làm như sau:

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

Swift 4

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

16
Điều này đưa bạn đến cài đặt cụ thể của ứng dụng, làm cách nào để đưa chúng đến trang cài đặt chung hoặc thậm chí tốt hơn cho phần sức khỏe?
Ace Green

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

@AceGreen bạn đã làm cho phần sức khỏe?
Saad

Làm thế nào để bạn chỉ mở ứng dụng Cài đặt? "Trang chủ" của nó
Daniel Springer

không có "!" kýURL(string: UIApplication.openSettingsURLString).map { UIApplication.shared.open($0, options: [:], completionHandler: nil) }
ober

21

Sử dụng gợi ý của @ vivek, tôi phát triển lớp utils dựa trên Swift 3 , hy vọng bạn đánh giá cao!

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

}

Điều này rất hữu ích vì API chắc chắn sẽ thay đổi và bạn có thể tái cấu trúc một lần và rất nhanh!


5
Điều này sẽ đi qua đánh giá táo?
L_Sonic

Tôi sẽ thêm một điều nữa để làm cho nó tốt hơn một chút. Trong enum, bạn có thể tạo một biến kiểu String với tên urlString. Sau đó trả về "Ứng dụng Prefs: root =" = self.rawValue. Điều này về cơ bản sẽ loại bỏ sự cần thiết của appPath và private private let. Chúc mừng.
mn1

Cài đặt thông báo không mở trên iOS 11.
Metin Atalay

2
điều này sẽ không hoạt động khi chúng tôi nhận được thông báo này từ ứng dụng: "Ứng dụng của bạn sử dụng lược đồ URL không công khai" prefs: root = ", là một thực thể riêng tư. Việc sử dụng API không công khai không được phép trên App Store vì Điều này có thể dẫn đến trải nghiệm người dùng kém nếu các API này thay đổi. Việc tiếp tục sử dụng hoặc che giấu các API không công khai trong các lần gửi ứng dụng này trong tương lai có thể dẫn đến việc chấm dứt tài khoản Nhà phát triển Apple của bạn, cũng như xóa tất cả các ứng dụng được liên kết khỏi Ứng dụng Cửa hàng."
CodeOverRide

1
@L_Sonic không, nó sẽ không vượt qua đánh giá và nếu có, nó có thể được gắn cờ ngẫu nhiên trong bất kỳ bản cập nhật nào trong tương lai mà bạn đẩy
RP Carson

16

Phản hồi đầu tiên từ Lược đồ URL dành riêng cho ứng dụng đã hoạt động với tôi trên iOS 10.3.

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

Cái gì được cho là mở?
Daniel Springer

12

App-Prefs:root=Privacy&path=LOCATIONlàm việc cho tôi để có được cài đặt vị trí chung. Lưu ý: chỉ hoạt động trên một thiết bị.


12
Điều này bị từ chối
Daniel Springer

7

trong ios10 / Xcode 8 trong trình giả lập:

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

làm

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

không làm.


Có phải NStiền tố đã bị xóa trong iOS 10?
JC Rocnhoe

2
Điều này sẽ chỉ hoạt động nếu ứng dụng của bạn có tệp .bundle (tùy chọn ứng dụng của bạn)
Sophy Swicz

@Sophy Swicz HOw Tôi có thể thêm tệp .bundle không?
Nhà phát triển

1
@ Nhà phát triển github.com/phynet/SettingBundleiOSProject cũng vậy, cài đặt ứng dụng của bạn là tất cả các dịch vụ mà ứng dụng của bạn cho phép sử dụng và được hiển thị trong Chung -> cài đặt ứng dụng của bạn
Sophy Swicz

7

Tôi đã thấy dòng mã này

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

không hoạt động, nó không hoạt động với tôi trong ios10 / Xcode 8, chỉ là một sự khác biệt nhỏ về mã, vui lòng thay thế nó bằng

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

Swift3

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

Thay thế bằng

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

Hy vọng nó giúp. Chúc mừng.


1
Nguyên nhân: Ứng dụng bị từ chối
ergunkocak

7

từ cảnh báo: các lược đồ prefs:roothoặc App-Prefs:rootURL được coi là API riêng. Apple có thể từ chối ứng dụng của bạn nếu bạn sử dụng những ứng dụng đó, đây là những gì bạn có thể nhận được khi gửi ứng dụng của mình:

Ứng dụng của bạn sử dụng lược đồ URL không công khai "prefs: root =", là một thực thể riêng tư. Việc sử dụng API không công khai không được phép trên App Store vì điều này có thể dẫn đến trải nghiệm người dùng kém nếu các API này thay đổi. Việc tiếp tục sử dụng hoặc che giấu các API không công khai trong các lần gửi trong tương lai của ứng dụng này có thể dẫn đến việc chấm dứt tài khoản Nhà phát triển Apple của bạn, cũng như xóa tất cả các ứng dụng được liên kết khỏi App Store.

Bước tiếp theo

Để giải quyết vấn đề này, vui lòng sửa lại ứng dụng của bạn để cung cấp chức năng được liên kết bằng API công khai hoặc xóa chức năng bằng cách sử dụng lược đồ URL "prefs: root" hoặc "App-Prefs: root".

Nếu không có lựa chọn thay thế nào để cung cấp chức năng mà ứng dụng của bạn yêu cầu, bạn có thể gửi yêu cầu nâng cao.


Không có cách nào được hỗ trợ để mở Cài đặt cho trang Wi-Fi / Ngôn ngữ / Vị trí '. Thực tế là lỗi này hoạt động trong iOS 9 là một lỗi đã được sửa trong iOS 10. Để biết thêm thông tin, vui lòng tham khảo forum.developer.apple.com/message/186656#186656
Mohit Kumar

6

Swift 4.2, iOS 12

Các open(url:options:completionHandler:)phương pháp đã được cập nhật để bao gồm một tùy chọn phi nil từ điển, mà là của bài viết này chỉ chứa một lựa chọn có thể loại UIApplication.OpenExternalURLOptionsKey(trong ví dụ).

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

}

Hoàn toàn xây dựng một URL, chẳng hạn như với "Ứng dụng Prefs", AFAIK, đã nhận được một số ứng dụng bị từ chối từ cửa hàng.


Tôi xác nhận điều này, ứng dụng đã ổn với "Ứng dụng Prefs" trước đó, nhưng sau Sự kiện đặc biệt của Apple, bản cập nhật của tôi đã bị từ chối, quay trở lại UIApplicationOpenSinstallURLString.
Vitalii

5

Thêm vào @Luca Davanzo

iOS 11, một số cài đặt quyền đã chuyển sang đường dẫn ứng dụng:

Hỗ trợ 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
Điều này có thể thông qua Đánh giá của Apple? Ý tôi là, điều này sẽ dẫn đến sự từ chối ứng dụng?
Aakash Dave

4
Khi tôi chạy mã này, tôi chỉ cần đưa tôi đến trang cài đặt. Không phải là tab cài đặt cụ thể trong đó.
Aakash Dave

2

Chuyển 4

Điều này có thể mất các cài đặt cụ thể của ứng dụng của bạn, nếu đó là những gì bạn đang tìm kiếm.

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

cảm ơn ... Tôi đã làm việc đó ... nhưng tôi muốn thay đổi cài đặt trên các ứng dụng của các nhà phát triển khác. Ví dụ: nhấn nút và thay đổi cài đặt Thông báo đẩy của facebook để họ không nhắn tin trong cuộc họp. Tôi dự đoán có thể có một giải pháp MDM ... hoặc không.
AilenGringo

@IrishGringo cách duy nhất để thay đổi cài đặt của ứng dụng Facebook là người dùng tự mở cài đặt của ứng dụng Facebook bằng cách điều hướng qua Cài đặt chung >> Thông báo >> Facebook
BennyTheNerd

0

Như trên @niravdesai đã nói App-prefs. Tôi thấy rằng nó App-Prefs:hoạt động cho cả thiết bị iOS 9, 10 và 11. được thử nghiệm. nơi prefs:chỉ hoạt động trên iOS 9.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.