インターネット接続が利用できないときにアラートを表示する機能をアプリに実装しようとしています。アラートには2つのアクション([OK]と[設定])があり、ユーザーが設定をクリックするたびに、それらをプログラムで電話の設定に移動します。
私はSwiftとXcodeを使っています。
UIApplicationOpenSettingsURLString
を使う
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)
}
スイフト2.x
UIApplicationOpenSettingsURLString
を使う
override func viewDidAppear(animated: Bool) {
var alertController = UIAlertController (title: "Title", message: "Go to Settings?", preferredStyle: .Alert)
var settingsAction = UIAlertAction(title: "Settings", style: .Default) { (_) -> Void in
let settingsUrl = NSURL(string: UIApplicationOpenSettingsURLString)
if let url = settingsUrl {
UIApplication.sharedApplication().openURL(url)
}
}
var cancelAction = UIAlertAction(title: "Cancel", style: .Default, handler: nil)
alertController.addAction(settingsAction)
alertController.addAction(cancelAction)
presentViewController(alertController, animated: true, completion: nil)
}
Swift 5
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil)
Swift 4
UIApplication.shared.open(URL(string: UIApplicationOpenSettingsURLString)!, options: [:], completionHandler: nil)
注:以下のメソッドはiOS 11より下のすべてのバージョンで機能します。それより上のバージョンではプライベートAPIなのでアプリは拒否される可能性があります
ユーザーをアプリの設定以外の設定にしたいことがあります。次の方法はそれを実現するのに役立ちます。
まず、プロジェクトのURLスキームを設定します。あなたはそれをTarget - > Info - > URL Schemeの中に見つけるでしょう。 +ボタンをクリックしてURLスキームに設定を入力
Swift 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 8以降では、次のことができます。
func buttonClicked(sender:UIButton)
{
UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString))
}
Swift 4
let settingsUrl = URL(string: UIApplicationOpenSettingsURLString)!
UIApplication.shared.open(settingsUrl)
@ vivekのヒントを使用して、Swiftに基づいて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は確実に変更されるので、これは非常に役立ちます。一度リファクタリングすることができます。
App-Specific URL Schemes からの最初の応答はiOS 10.3で私のために働きました。
if let appSettings = URL(string: UIApplicationOpenSettingsURLString + Bundle.main.bundleIdentifier!) {
if UIApplication.shared.canOpenURL(appSettings) {
UIApplication.shared.open(appSettings)
}
}
App-Prefs:root=Privacy&path=LOCATION
は私のために一般的な位置設定に到達するために働きました。注:デバイス上でのみ動作します。
私はこのコード行を見ました
UIApplication.sharedApplication() .openURL(NSURL(string:"prefs:root=General")!)
動作していない、それはios10/Xcode 8で私のために動作しませんでした、ほんの小さなコードの違い、これをに置き換えてください
UIApplication.sharedApplication().openURL(NSURL(string:"App-Prefs:root=General")!)
Swift
UIApplication.shared.openURL(URL(string:"prefs:root=General")!)
と置換する
UIApplication.shared.openURL(URL(string:"App-Prefs:root=General")!)
それが役に立てば幸い。乾杯。
シミュレータのios10/Xcode 8では:
UIApplication.shared.openURL(URL(string:UIApplicationOpenSettingsURLString)!)
作品
UIApplication.shared.openURL(URL(string:"prefs:root=General")!)
ではない。
Swift 4.2、iOS 12
open(url:options:completionHandler:)
メソッドはnil以外のオプション辞書を含むように更新されました。この記事の時点では(例では)UIApplication.OpenExternalURLOptionsKey
型の可能なオプションが1つだけ含まれています。
@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を作成すると、残念ながら一部のアプリがストアから拒否されました。
@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)
}
}
警告の言葉:prefs:root
またはApp-Prefs:root
URLスキームはプライベートAPIと見なされます。あなたがそれらを使用する場合、Appleはあなたのアプリを拒絶するかもしれません、あなたのアプリを提出するときあなたが得るかもしれないものがここにあります:
あなたのアプリはプライベートエンティティである "prefs:root ="非公開URLスキームを使用しています。 App Storeでは、非公開のAPIの使用は許可されていません。これらのAPIが変更されると、ユーザーエクスペリエンスが低下する可能性があるためです。今後このアプリを送信する際に非公開のAPIを使用または隠蔽すると、Apple Developerアカウントが終了し、関連するすべてのアプリがApp Storeから削除される可能性があります。
次のステップ
この問題を解決するには、パブリックAPIを使用して関連機能を提供するように、または "prefs:root"または "App-Prefs:root" URLスキームを使用して機能を削除するようにアプリを修正してください。
アプリに必要な機能を提供するための代替手段がない場合は、機能強化要求を提出できます。
Swift 4
それがあなたが探しているものであれば、これはあなたのアプリの特定の設定を取ることができます。
UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
上記のように@niravdesaiはApp-prefsを言った。 App-Prefs:
はiOS 9、10、11の両方のデバイスで動作することがわかりました。 as prefs:
はiOS 9でのみ動作します。