web-dev-qa-db-ja.com

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

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

私はSwiftとXcodeを使っています。

133
Solomon Ayoola

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)
}
240
Marius Fanu

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スキームに設定を入力

enter image description here

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です

  • prefs:root = General&path = About
  • prefs:root = Generalおよびpath = ACCESSIBILITY
  • 設定値:root = AIRPLANE_MODE
  • prefs:root = General&path = AUTOLOCK
  • prefs:root = General&path = USAGE/CELLULAR_USAGE
  • 設定:root =明るさ
  • prefs:root = Bluetooth
  • 設定:root =一般&path = DATE_AND_TIME
  • prefs:root = FACETIME
  • prefs:root = General
  • 設定:root =一般&path =キーボード
  • 設定:root = CASTLE
  • 設定:root = CASTLE&path = STORAGE_AND_BACKUP
  • 設定:root =一般&path =インターナショナル
  • prefs:root = LOCATION_SERVICES
  • prefs:root = ACCOUNT_SETTINGS
  • prefs:root = MUSIC
  • prefs:root = MUSIC&path = EQ
  • prefs:root = MUSIC&path = VolumeLimit
  • 設定:root =一般&path =ネットワーク
  • prefs:root = NIKE_PLUS_iPod
  • prefs:root = NOTES
  • prefs:root = NOTIFICATIONS_ID
  • prefs:root = Phone
  • prefs:root =写真
  • prefs:root = General&path = ManagedConfigurationList
  • 設定:root =一般&path =リセット
  • prefs:root =サウンドとパス=着信音
  • prefs:root = Safari
  • 設定:root =一般&path =アシスタント
  • prefs:root = Sounds
  • 設定:root =一般&path = SOFTWARE_UPDATE_LINK
  • prefs:root = STORE
  • prefs:root = Twitter
  • prefs:root = FACEBOOK
  • prefs:root = General&path = USAGE prefs:root = VIDEO
  • 設定:root =一般&path =ネットワーク/ VPN
  • prefs:root =壁紙
  • prefs:root = WIFI
  • prefs:root = INTERNET_TETHERING
  • prefs:root = Phone&path = Blocked
  • prefs:root = DO_NOT_DISTURB

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

194
vivek takrani

IOS 8以降では、次のことができます。

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

Swift 4

    let settingsUrl = URL(string: UIApplicationOpenSettingsURLString)!
    UIApplication.shared.open(settingsUrl)
41
Christian Wörz

@ 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は確実に変更されるので、これは非常に役立ちます。一度リファクタリングすることができます。

20
Luca Davanzo

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

App-Prefs:root=Privacy&path=LOCATIONは私のために一般的な位置設定に到達するために働きました。注:デバイス上でのみ動作します。

13
Joe Susnick

私はこのコード行を見ました

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

それが役に立てば幸い。乾杯。

7
niravdesai21

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

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

作品

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

ではない。

7
ingconti

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を作成すると、残念ながら一部のアプリがストアから拒否されました。

6
bsod

@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)
    }
}
5
Tal Zion

警告の言葉: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スキームを使用して機能を削除するようにアプリを修正してください。

アプリに必要な機能を提供するための代替手段がない場合は、機能強化要求を提出できます。

4
ofer

Swift 4

それがあなたが探しているものであれば、これはあなたのアプリの特定の設定を取ることができます。

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

上記のように@niravdesaiはApp-prefsを言った。 App-Prefs:はiOS 9、10、11の両方のデバイスで動作することがわかりました。 as prefs:はiOS 9でのみ動作します。

0
Alix