[ios] 버튼을 클릭 할 때 전화 설정을 열려면 어떻게합니까?

인터넷 연결을 사용할 수 없을 때 경고를 표시하는 기능을 앱에 구현하려고합니다. 알림에는 사용자가 설정을 클릭 할 때마다 프로그래밍 방식으로 전화 설정으로 이동하고 싶은 두 가지 작업 (확인 및 설정)이 있습니다.

Swift와 Xcode를 사용하고 있습니다.



답변

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

스위프트 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)
}


답변

⚠️ 조심하세요!

이 답변은 문서화되지 않은 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 체계에 prefs를 입력하십시오

여기에 이미지 설명을 입력하십시오

스위프트 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")!)

목표 -C

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

다음은 사용 가능한 모든 URL입니다.

** IOS <12에서 **

  • prefs : root = 일반 및 경로 = 정보
  • prefs : root = 일반 및 경로 = 접근성
  • prefs : root = AIRPLANE_MODE
  • 기본 설정 : root = General & path = AUTOLOCK
  • 기본 설정 : root = General & path = USAGE / CELLULAR_USAGE
  • prefs : root = 밝기
  • prefs : root = 블루투스
  • prefs : root = 일반 및 경로 = DATE_AND_TIME
  • prefs : root = FACETIME
  • prefs : root = 일반
  • 기본 설정 : root = General & path = 키보드
  • prefs : root = CASTLE
  • prefs : root = CASTLE & path = STORAGE_AND_BACKUP
  • 기본 설정 : root = General & path = INTERNATIONAL
  • prefs : root = LOCATION_SERVICES
  • prefs : root = ACCOUNT_SETTINGS
  • prefs : root = 음악
  • 기본 설정 : root = MUSIC & path = EQ
  • 기본 설정 : root = MUSIC & path = VolumeLimit
  • prefs : root = 일반 및 경로 = 네트워크
  • prefs : root = NIKE_PLUS_IPOD
  • prefs : root = 노트
  • prefs : root = NOTIFICATIONS_ID
  • prefs : root = 전화
  • prefs : root = 사진
  • prefs : root = General & path = 관리되는 구성 목록
  • prefs : root = 일반 & 경로 = 재설정
  • prefs : root = 사운드 및 경로 = 벨소리
  • prefs : root = 사파리
  • prefs : root = 일반 및 경로 = 보조원
  • prefs : root = 사운드
  • prefs : root = General & path = SOFTWARE_UPDATE_LINK
  • prefs : root = STORE
  • prefs : root = 트위터
  • prefs : root = 페이스 북
  • prefs : root = 일반 및 경로 = USAGE prefs : root = VIDEO
  • prefs : root = 일반 및 경로 = 네트워크 / VPN
  • prefs : root = 배경 화면
  • prefs : root = WIFI
  • prefs : root = INTERNET_TETHERING
  • 기본 설정 : root = Phone & path = 차단
  • prefs : root = DO_NOT_DISTURB

iOS 13에서

  • 앱 준비 : General & path = 정보
  • 앱 사전 : AIRPLANE_MODE
  • 앱 사전 : General & path = AUTOLOCK
  • 응용 프로그램 : 블루투스
  • 앱 사전 : General & path = DATE_AND_TIME
  • 응용 프로그램 : FACETIME
  • 응용 프로그램 : 일반
  • 앱 환경 설정 : General & path = 키보드
  • 응용 프로그램 : 성
  • 앱 사전 : CASTLE & path = STORAGE_AND_BACKUP
  • 앱 환경 설정 : General & path = INTERNATIONAL
  • 응용 프로그램 : 음악
  • 응용 프로그램 : NOTES
  • 응용 프로그램 : NOTIFICATIONS_ID
  • 응용 프로그램 : 전화
  • 응용 프로그램 : 사진
  • 앱 사전 : General & path = 관리 구성 목록
  • 앱 사전 : General & path = 재설정
  • 앱 사전 : 사운드 및 경로 = 벨소리
  • 응용 프로그램 : 사운드
  • 앱 사전 : General & path = SOFTWARE_UPDATE_LINK
  • 앱 사전 : STORE
  • 응용 프로그램 : 벽지
  • 응용 프로그램 : WIFI
  • 응용 프로그램 : INTERNET_TETHERING
  • 앱 사전 : DO_NOT_DISTURB

    검증되지 않은

  • 앱 사전 : 트위터 (??)

  • 응용 프로그램 : FACEBOOK (??)
  • 응용 프로그램 : NIKE_PLUS_IPOD (??)

참고 : 네트워크 설정은 시뮬레이터에서 열리지 않지만 링크는 실제 장치에서 작동합니다.


답변

iOS 8 이상에서는 다음을 수행 할 수 있습니다.

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

스위프트 4

    let settingsUrl = URL(string: UIApplicationOpenSettingsURLString)!
    UIApplication.shared.open(settingsUrl)


답변

@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가 확실히 변경되므로 한 번에 매우 빠르게 리팩토링 할 수 있으므로 매우 유용합니다!


답변

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일반적인 위치 설정을 위해 나를 위해 일했습니다. 참고 : 장치에서만 작동합니다.


답변

시뮬레이터의 iOS10 / Xcode 8에서 :

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

공장

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

하지 않습니다.