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