タイトルのとおり、問題は、アプリからプログラムで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")
上記のすべてが機能していません
ですから、いくつかの深い調査(それが不可能だとは信じられませんでした)と失敗を試みた後、私は私の質問に対する短い答え(要約)を書くことができます。 @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では許可されていません。
プリファレンスを直接開くことはできませんが、CBCentralManagerShowPowerAlertKey
を作成するときに値がtrue
の- CBCentralManager
を含めると、iOSはユーザーにプロンプトを表示しますBluetoothがオフになっている場合はオンにします。 iOSによって表示されるアラートには、Bluetooth設定を開くためのボタンが含まれています。
これらの拡張機能を使用できます。
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
}
}