web-dev-qa-db-ja.com

UIAlertControllerからプログラムでBluetooth設定を開きます

タイトルのとおり、問題は、アプリからプログラムでBluetooth設定を開くにはどうすればよいですか? stackoverflowですべての回答を確認しましたが、iOS 11で正常に機能している回答は1つもありません。これらはすべて、11未満の古い回答であるか、回答がないままになっています。一般設定またはアプリ設定に移動するだけですが、ユーザーがBluetooth設定に直接移動して、オンにできるようにしたいのです。

let alert = UIAlertController(title: "Bluetooth is off", message: "Please turn on your bluetooth", preferredStyle: UIAlertControllerStyle.alert)
            alert.addAction(UIAlertAction(title: "Go to settings", style: UIAlertActionStyle.default, handler: { (action) in
                switch action.style {
                case .default:
                    let url = URL(string: "App-Prefs:root=Bluetooth") //for bluetooth setting
                    let app = UIApplication.shared
                    app.openURL(url!)
                    print("default")
                case .cancel:
                    print("cancel")
                case .destructive:
                    print("destrucive")
                }

私がもっと試したこと、これも結果なし:

UIApplication.shared.openURL(NSURL(string: "prefs:root=General&path=Bluetoth")! as URL)

または:

let url = URL(string: "App-Prefs:root=Bluetooth")

上記のすべてが機能していません

6
M. Wojcik

ですから、いくつかの深い調査(それが不可能だとは信じられませんでした)と失敗を試みた後、私は私の質問に対する短い答え(要約)を書くことができます。 @maddyが書いたように、iOSは直接設定を起動するためのURLスキームをサポートしておらず、一般設定(すべての設定のリスト)またはアプリケーション設定(アプリケーション設定(実装可能)/権限リスト)のみをサポートしています。残念ながら、アプリケーション設定では、iOSシステム設定を追加して簡単にアクセスすることはできません。悪い..

一般設定に移動するには、次を使用できます。

let url = URL(string: "App-Prefs:root=General")

YouApp設定に移動するには、次を使用できます。

let url = URL(string: UIApplicationOpenSettingsURLString)

そしてもちろん、そのURLを開くことを忘れないでください:(はい、すべてを1行で実行できることはわかっています)

let app = UIApplication.shared
app.openURL(url!)

また、@ Paulw11で説明したように、CBCentralManagerShowPowerAlertKeyオプションを使用してBluetooth設定を直接開くことができます。そのため、アプリを開いてCBCentralManagerをインスタンス化すると、組み込みのアラートダイアログがポップアップ表示され、「アプリでアクセサリ(周辺機器)を使用するにはBluetoothをオンにする」必要があることを通知します。2つのボタンがあります。設定(Bluetoothに移動します)設定)およびOK(ダイアログを閉じる)。残念ながら、これはセントラルマネージャーをインスタンス化するときに表示されるため、アプリ全体(シングルトンなど)でセントラルマネージャーを保持したい場合は、必要以上に良くない場合は、ポップアップが1回だけ表示されます。それ以外の場合はそれかもしれません。

今! iOSのBluetoothには本当に問題があります。 iOSでは、Bluetoothをオン/オフにする方法は2つあります。1つは[設定]-> [Bluetooth]から、もう1つは下から上にスワイプしてBluetoothアイコンを選択する方法です。だが。これで、2番目の方法でそれを行うと、[設定]のBluetoothがオンのままになります。そのため、アプリケーションを開いてBluetoothアラートダイアログがポップアップし、[設定に移動]を選択しても、Bluetoothがオンになっていることがわかります。

これはiOSでは本当に奇妙です。

したがって、簡単に言えば、私の質問に対する答えは次のとおりです。

独自のAlertDialogでBLUETOOTH設定をプログラムで開くことはできません。組み込みのiOSCBCentralManagerAlertDialogを使用できます。

私があなたの時間をいくらか節約したことを願っています。


iOS 10以降のURLを開く(プロジェクトでバージョンを変更したときに変更する必要がありました):

app.open(url!, options: [:], completionHandler: nil)

Bluetoothの奇妙な動作-更新

上で述べたように、Bluetoothのオン/オフを2つの方法で切り替えることができます。これにより、奇妙な動作が発生します。今、私はこの時点で自分自身を良くする必要があります:それは私にとって奇妙な振る舞いでした(以前はAndroid)に慣れていました)。私が説明した2番目の方法(Bluetoothを下からスワイプしてBluetoothアイコンを押す)でBluetoothをオンにする方法は、Bluetooth接続ではなくオフになりますが、接続を許可するとオフになります(Bluetoothはオンのままですが、デバイスに接続できません(アプリでは処理されます)ブルートゥースがオフになるので!!)それでもプログラムで管理することはできません。それでもAppleによって改善されるべきだと思います。

警告

@ user3620372が書いたように、設定URLを使用すると、次の方法でアプリが拒否される可能性があります。

アプリは、プライベートエンティティである「prefs:root =」非公開URLスキームを使用します。非公開APIの使用は、これらのAPIが変更された場合にユーザーエクスペリエンスの低下につながる可能性があるため、AppStoreでは許可されていません。

12
M. Wojcik

プリファレンスを直接開くことはできませんが、CBCentralManagerShowPowerAlertKeyを作成するときに値がtrueの-​​ CBCentralManager を含めると、iOSはユーザーにプロンプ​​トを表示しますBluetoothがオフになっている場合はオンにします。 iOSによって表示されるアラートには、Bluetooth設定を開くためのボタンが含まれています。

2
Paulw11

これらの拡張機能を使用できます。

extension UIApplication {

    static func openAppSettings(completion: @escaping (_ isSuccess: Bool) -> ()) {
        guard let url = URL(string: UIApplication.openSettingsURLString) else {
            completion(false)
            return
        }

        let app = UIApplication.shared

        app.open(url) { isSuccess in
            completion(isSuccess)
        }
    }

    static func openPhoneSettings(completion: @escaping (_ isSuccess: Bool) -> ()) {
        guard let url = URL(string: "App-Prefs:root=General") else {
            completion(false)
            return
        }

        let app = UIApplication.shared

        app.open(url) { isSuccess in
            completion(isSuccess)
        }
    }

}

そして、あなたはそれをこのように使うことができます:

UIApplication.openPhoneSettings { isSuccess in
      if isSuccess == false {
           //Display error
      }
 }

または:

UIApplication.openAppSettings { isSuccess in
      if isSuccess == false {
           //Display error
      }
 }
0