使用 Swift,可以通过 UIAlertController 提示用户打开位置设置吗?

Posted

技术标签:

【中文标题】使用 Swift,可以通过 UIAlertController 提示用户打开位置设置吗?【英文标题】:Using Swift, is possible with UIAlertController prompt user to open location settings? 【发布时间】:2015-04-01 18:57:14 【问题描述】:

在我的 Swift 应用程序中,我检查是否 locationServiceEnabled()。如果它返回 false,我应该使用 UIAlertController 提示用户进行位置设置。 有可能这样做吗? 我使用这个函数来提示应用程序的位置设置:

 func displayAlertToEnableLocationServicesApp()

    let alertController = UIAlertController(
        title: "Location Access is Turned Off",
        message: "In order to locate your position, please open settings and set location access to 'While Using the App'",
        preferredStyle: .Alert)

    let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
    alertController.addAction(cancelAction)

    let openAction = UIAlertAction(title: "Settings", style: .Default)  (action) in
        if let url = NSURL(string: UIApplicationOpenSettingsURLString) 
            UIApplication.sharedApplication().openURL(url)
        
    
    alertController.addAction(openAction)
    self.presentViewController(alertController, animated: true, completion: nil)

但这个功能打开设置应用程序,而不是位置设置。 我需要打开(设置->隐私->位置)

谢谢

【问题讨论】:

不确定你在问什么。在 ios 8 应用程序可以直接启动设备设置,您是在问是否可以从 UIAlertController 中执行此操作?我不确定你在问什么的原因是因为你当然可以启动一个 UIAlertController 来提示用户做某事,所以你的问题必须有另一部分不明显。 是的,使用 UIAlertController 并打开(设置 -> 隐私 -> 位置) 【参考方案1】:

在 iOS8 中,您可以从自定义应用打开设置系统位置。

斯威夫特 3

let alertVC = UIAlertController(title: "Geolocation is not enabled", message: "For using geolocation you need to enable it in Settings", preferredStyle: .actionSheet)
alertVC.addAction(UIAlertAction(title: "Open Settings", style: .default)  value in 
    let path = UIApplicationOpenSettingsURLString
    if let settingsURL = URL(string: path), UIApplication.shared.canOpenURL(settingsURL) 
        UIApplication.shared.openURL(settingsURL)
    
)
alertVC.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))

viewController.present(alertVC, animated: true, completion: nil)

斯威夫特 2.3

let alertVC = UIAlertController(title: "Geolocation is not enabled", message: "For using geolocation you need to enable it in Settings", preferredStyle: .ActionSheet)
alertVC.addAction(UIAlertAction(title: "Open Settings", style: .Default)  value in
    UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!)
)
alertVC.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))

viewController.presentViewController(alertVC, animated: true, completion: nil)

【讨论】:

这个打开的应用设置位置,而不是常规设置位置 我实际上更喜欢这种方法,因为它将用户直接带到应用程序的设置(包括该应用程序的位置),而不是他们必须排序的手机上所有应用程序的列表在一个应用上启用它。 @NicLaughter, prefs:root=LOCATION_SERVICES 也是很好的解决方案。当然,这取决于概念方面。 对,我只是指出这可能是一种首选方法,因为它会将您直接带到应用程序本身的设置,而不是具有定位服务的应用程序的整个列表。跨度> 【参考方案2】:

首先在您的项目中配置 URL 方案。您将在 Target -> Info -> URL Scheme 中找到它。单击 + 按钮并在 URL Schemes 中键入首选项

现在替换if let url = NSURL(string: UIApplicationOpenSettingsURLString)if let url = NSURL(string: "prefs:root=LOCATION_SERVICES"))

以下是所有可用的网址

prefs:root=General&path=About prefs:root=General&path=ACCESSIBILITY prefs:root=AIRPLANE_MODE prefs:root=General&path=AUTOLOCK prefs:root=General&path=USAGE/CELLULAR_USAGE prefs:root=亮度 prefs:root=General&path=蓝牙 prefs:root=General&path=DATE_AND_TIME prefs:root=FACETIME prefs:root=General prefs:root=General&path=Keyboard prefs:root=CASTLE prefs:root=CASTLE&path=STORAGE_AND_BACKUP prefs:root=General&path=INTERNATIONAL prefs:root=LOCATION_SERVICES prefs:root=ACCOUNT_SETTINGS prefs:root=MUSIC prefs:root=MUSIC&path=EQ prefs:root=MUSIC&path=VolumeLimit prefs:root=General&path=Network prefs:root=NIKE_PLUS_IPOD prefs:root=NOTES prefs:root=NOTIFICATIONS_ID prefs:root=电话 prefs:root=照片 prefs:root=General&path=ManagedConfigurationList prefs:root=General&path=Reset prefs:root=Sounds&path=Ringtone prefs:root=Safari prefs:root=General&path=Assistant prefs:root=声音 prefs:root=General&path=SOFTWARE_UPDATE_LINK prefs:root=STORE prefs:root=TWITTER prefs:root=FACEBOOK prefs:root=General&path=USAGE prefs:root=VIDEO prefs:root=General&path=Network/*** prefs:root=壁纸 prefs:root=WIFI prefs:root=INTERNET_TETHERING

【讨论】:

网址打不开【参考方案3】:

打开应用程序设置。 Xcode 8.2.1 - iOS 10

if let appSettings = URL(string: UIApplicationOpenSettingsURLString) 
    UIApplication.shared.open(appSettings, options: [:], completionHandler: nil)

【讨论】:

以上是关于使用 Swift,可以通过 UIAlertController 提示用户打开位置设置吗?的主要内容,如果未能解决你的问题,请参考以下文章

一段时间后如何显示 UIAlertView?

我可以在 Swift 3 项目中使用 Swift 2.3 框架吗?

如何在 Swift 中使用 Apple 地图 - 你必须使用 C 还是 Swift 可以?

“当前 SwiftyJSON(通过 Swift 3.0.2)无法使用 Swift 3.1 导入”的原因是啥

Xcode 13如何使用本地Swift包(Swift Package)

Xcode 13如何使用本地Swift包(Swift Package)