ボタンがクリックされたときに電話の設定を開くにはどうすればよいですか?


160

インターネット接続が利用できないときにアラートを表示する機能をアプリに実装しようとしています。アラートには2つのアクション([OK]と[設定])があり、ユーザーが設定をクリックするたびに、プログラムで電話の設定に移動したいと考えています。

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

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

それをどのように実装しますか?@マリウス・ファヌ
ソロモン・アヨオラ

iOS8 @Marius Fanuを使用して
ソロモンアヨオラ'26

@AyoolaSolomon viewDidAppearメソッドのアラートを追加するためにSettingsCancelボタンを使用して回答を更新しました
Marius Fanu

2
いいえ、そうは思いません。アプリにアクセスするには、アプリでカスタムURLスキームを実装UIApplication.sharedApplication().openURL(yourCustomURL)し、現在のアプリからを呼び出す必要がありますが、設定アプリからのアクセス権がありません
Marius Fanu

5
@PersianBlueはiOS 10.1.1では正しいので、設定アプリを起動できません。
Michael Garito 2016年

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")!)

Objective-C

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

そして以下は利用可能なすべてのURLです

** IOS <12 **

  • prefs:root = General&path = About
  • prefs:root = General&path = ACCESSIBILITY
  • prefs:root = AIRPLANE_MODE
  • prefs:root = General&path = AUTOLOCK
  • prefs:root = General&path = USAGE / CELLULAR_USAGE
  • prefs:root =明るさ
  • prefs:root = Bluetooth
  • prefs:root = General&path = DATE_AND_TIME
  • prefs:root = FACETIME
  • prefs:root = General
  • prefs:root = General&path = Keyboard
  • prefs:root = CASTLE
  • prefs:root = CASTLE&path = STORAGE_AND_BACKUP
  • prefs:root = General&path = INTERNATIONAL
  • prefs:root = LOCATION_SERVICES
  • prefs:root = ACCOUNT_SETTINGS
  • prefs:root = MUSIC
  • prefs:root = MUSIC&path = EQ
  • prefs:root = MUSIC&path = VolumeLimit
  • prefs:root = General&path = Network
  • prefs:root = NIKE_PLUS_IPOD
  • prefs:root = NOTES
  • prefs:root = NOTIFICATIONS_ID
  • prefs:root = Phone
  • prefs:root =写真
  • prefs:root = General&path = ManagedConfigurationList
  • prefs:root = General&path = Reset
  • prefs:root = Sounds&path = Ringtone
  • prefs:root = Safari
  • prefs:root = General&path = Assistant
  • prefs:root = Sounds
  • prefs:root = General&path = SOFTWARE_UPDATE_LINK
  • prefs:root = STORE
  • prefs:root = TWITTER
  • prefs:root = FACEBOOK
  • prefs:root = General&path = USAGE prefs:root = VIDEO
  • prefs:root = General&path = Network / VPN
  • prefs:root = Wallpaper
  • prefs:root = WIFI
  • prefs:root = INTERNET_TETHERING
  • prefs:root = Phone&path = Blocked
  • prefs:root = DO_NOT_DISTURB

IOS 13の場合

  • App-prefs:General&path = About
  • アプリ設定:AIRPLANE_MODE
  • App-prefs:General&path = AUTOLOCK
  • アプリ設定:Bluetooth
  • App-prefs:General&path = DATE_AND_TIME
  • アプリ設定:FACETIME
  • アプリ設定:全般
  • App-prefs:General&path = Keyboard
  • アプリ設定:CASTLE
  • App-prefs:CASTLE&path = STORAGE_AND_BACKUP
  • App-prefs:General&path = INTERNATIONAL
  • アプリ設定:MUSIC
  • アプリ設定:注
  • アプリ設定:NOTIFICATIONS_ID
  • アプリ設定:電話
  • アプリ設定:写真
  • App-prefs:General&path = ManagedConfigurationList
  • App-prefs:General&path =リセット
  • App-prefs:Sounds&path = Ringtone
  • アプリ設定:サウンド
  • App-prefs:General&path = SOFTWARE_UPDATE_LINK
  • App-prefs:STORE
  • アプリ設定:壁紙
  • アプリ設定:WIFI
  • アプリ設定:INTERNET_TETHERING
  • アプリ設定:DO_NOT_DISTURB

    未検証

  • App-prefs:TWITTER(??)

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

注:ネットワーク設定はシミュレーターで開かれませんが、リンクは実際のデバイスで機能します。


7
これはiOS 10では機能しません。iOS9.3で同じコードを実行しました。そしてそれは機能し、iOS 10で実行されましたが、機能しませんでした(使用されているURLに関係なく)
Gruntcakes

18
iOS 10の場合、URL文字列のスキームとしてのApp-Prefs代わりにprefsを使用します。例App-Prefs:root=WIFI
Desmond DAI

8
最近、アプリをApp Storeでリリースするためにレビューに入れましたが、「prefs:root」または「App-Prefs:root」が使用されていたため、Appleはそのアプリを拒否しました。ユーザーがインターネットに接続していないときに、それを使用してwifi設定を開きました。
マルセルT

21
iOS 12がまもなく登場するので、Appleはそのような設定を含むアプリを拒否します。ご注意ください。私のアプリでも却下されました
Thiha Aung、2018

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)!)
テルアビブベンShabat

@AceGreen健康セクションに進みましたか?
2018

設定アプリだけをどのように開きますか?それの「ホームページ」
ダニエル・スプリンガー

「!」なし 記号URL(string: UIApplication.openSettingsURLString).map { UIApplication.shared.open($0, options: [:], completionHandler: nil) }
ober

21

@vivekのヒントを使用して、Swift 3に基づくutilsクラスを開発しています。

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 2017年

もう少し改善するために、もう1つ追加します。列挙型では、urlStringという名前のString型の変数を作成できます。次に、 "App-Prefs:root =" = self.rawValueを返します。これにより、基本的にappPathと静的なプライベートletが不要になります。乾杯。
mn1 2017

iOS 11で通知設定が開かない
Metin Atalay

2
アプリから次のメッセージが表示されたため、これは機能しません:「アプリは、プライベートエンティティである "prefs:root ="非公開URLスキームを使用しています。非公開APIの使用は、App Storeでは許可されていません。これらのAPIが変更された場合、ユーザーエクスペリエンスが低下する可能性があります。このアプリの今後の送信で非公開APIを引き続き使用または非表示にすると、Apple Developerアカウントが終了するだけでなく、関連するすべてのアプリがアプリから削除される可能性がありますお店。"
CodeOverRide 2018年

1
@L_Sonicいいえ、レビューに合格しません。合格した場合、プッシュした今後の更新でランダムにフラグが付けられる可能性があります
RP Carson



7

ios10 /シミュレーターのXcode 8:

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

働く

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

ではない。


NS接頭辞は、iOS 10で削除されていますか?
JC Rocamonde

2
これは、アプリに.bundleファイル(アプリ設定)がある場合にのみ機能します
Sophy Swicz

@Sophy Swiczどうすれば.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")!)

Swift3

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がアプリを拒否する場合があります。アプリを送信すると、次のようになります。

アプリは、プライベートエンティティである "prefs:root ="非パブリックURLスキームを使用します。App Storeで非公開APIを使用することは許可されていません。これらのAPIが変更された場合、ユーザーエクスペリエンスが低下する可能性があるためです。このアプリの今後の送信で非公開APIを引き続き使用または非表示にすると、Apple Developerアカウントが終了するだけでなく、関連するすべてのアプリがApp Storeから削除される場合があります。

次のステップ

この問題を解決するには、パブリックAPIを使用して関連機能を提供するようにアプリを修正するか、「prefs:root」または「App-Prefs:root」URLスキームを使用して機能を削除してください。

アプリに必要な機能を提供する代替手段がない場合は、機能強化リクエストを提出できます。


Wi-Fi /言語/場所の「ページ」の設定を開く方法はサポートされていません。これはiOSの9で働いていたという事実は、より多くの情報についてはiOSの10で修正されていますバグです参照してくださいforums.developer.apple.com/message/186656#186656
Mohit Kumar氏

6

Swift 4.2、iOS 12

open(url:options:completionHandler:)この方法は、この記事のよう唯一のタイプの一つの可能なオプションが含まれnil以外のオプション辞書、含むように更新されています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)

}

「App-Prefs」などを使用してURLを明示的に構築すると、一部のアプリがストアから拒否されました。


私はこれを確認しました。以前は「App-Prefs」で問題ありませんでしたが、Appleの特別なイベントの後、アップデートが拒否され、UIApplicationOpenSettingsURLStringにフォールバックしました。
Vitalii 2018

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
これはアップルレビューを通過できますか?つまり、これはアプリの拒否につながりますか?
Aakash Dave 2017

4
このコードを実行すると、設定ページに移動します。特定の設定タブではありません。
Aakash Dave

2

SWIFT 4

これがあなたが探しているものなら、これはあなたのアプリの特定の設定を取るかもしれません。

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

おかげで...私はそれを働いています...しかし、私は他の開発者によるアプリの設定を変更したいと思います。たとえば、ボタンを押してFacebookのプッシュ通知設定を変更し、会議中にメッセージが送信されないようにします。MDMソリューションがあるかもしれないと私は予測しています...
IrishGringo

Facebookアプリの設定を変更する@IrishGringo唯一の方法は、一般設定>>通知>> Facebook経由ナビゲートして、Facebookアプリの設定そのものを開くため、ユーザのためにある
BennyTheNerd

0

上記のように、@ niravdesaiはApp-prefsについて述べています。App-Prefs:テストしたデバイスは、iOS 9、10、11の両方で機能することがわかりました。ここで、prefs:iOS 9でのみ機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.