如何获取用户位置?

2023-12-11

我试图使用以下代码获取用户的当前位置,但它不起作用。我已经添加了两个NSLocationWhenInUseUsageDescription钥匙和NSLocationAlwaysUsageDescription我的钥匙Info.plist file. 下面是代码

var locationManager = CLLocationManager();

override func viewDidLoad() {
        super.viewDidLoad()
        startReceivingLocationChanges();

    }
func startReceivingLocationChanges() {
     let authorizationStatus = CLLocationManager.authorizationStatus()
            if authorizationStatus != .authorizedAlways {
                // User has not authorized access to location information.
                print("not authorized");
                return
            }

        if !CLLocationManager.locationServicesEnabled() {
            print("not enabled");
            return
        }

        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
        locationManager.distanceFilter = 100.0  // In meters.

        locationManager.startUpdatingLocation()
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let lastLocation = locations.last!
        print(lastLocation)
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print(error);
    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        print("inside didChangeAuthorization ");
    }

我已经阅读了苹果文档,上面是苹果建议的代码。我在这里缺少什么?非常感谢任何形式的帮助。谢谢

EDIT for some reason requestAlwaysAuthorization() is not available. see the screenshot below enter image description here


这里的问题是,在 10.15 之前的 macOS 上,不会像在 iOS 上那样显式调用请求位置访问。调用时自动出现用户权限提示startUpdatingLocation().

在上面的代码中,执行永远不会到达该调用,因为您的函数startReceivingLocationChanges始终在检查当前状态的第一个语句中返回(最有可能是“状态尚未确定”)。所以它永远不会到达startUpdatingLocation()在该函数中进一步调用,因此永远不会提示用户允许位置报告。

在 macOS 10.15 中requestAlwaysAuthorization()可用,但如果您只需要在使用应用程序时使用位置,则似乎不需要。

另外,在 macOS 上.authorized似乎比.authorizedAlways(记录为同义词),尽管添加了requestAlwaysAuthorization()在 10.15 中,他们可能会更改此功能(尽管文档尚未更新以表明在回答此问题时已发生这种情况)。

如果你没有打电话requestAlwayAuthorization()那么看来只有NSLocationWhenInUseUsageDescription需要 info.plist 密钥。

此外,还需要为 macOS 应用程序项目在“签名和功能”下的“强化运行时”中设置“位置”复选框。这是我正在测试的 macOS 10.14.6 上的 Xcode 11.2.1 所必需的。较旧的设置或不采用强化运行时(现在是默认设置)的设置可能必须在项目构建设置中的不同位置进行设置。

以下是 NSViewController 子类的源代码,该子类在 macOS 10.14.6 上的 Xcode 11.2.1 中成功检查位置管理器和当前位置:

import Cocoa
import CoreLocation

class ViewController: NSViewController, CLLocationManagerDelegate {

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager.delegate = self
        print("starting location update requests")
        locationManager.startUpdatingLocation()
    }


    func locationManager(_ manager: CLLocationManager,
                        didChangeAuthorization status: CLAuthorizationStatus) {
        print("location manager auth status changed to:" )
        switch status {
            case .restricted:
                print("status restricted")
            case .denied:
                print("status denied")

            case .authorized:
                print("status authorized")
                let location = locationManager.location
                print("location: \(String(describing: location))")

            case .notDetermined:
                print("status not yet determined")

            default:
                print("unknown state: \(status)")
        }
    }

    func locationManager(_ manager: CLLocationManager,
                            didFailWithError error: Error) {
        print( "location manager failed with error \(error)" )
    }
}

这对我在 macOS 上有效如果我第一次启动应用程序时对“启用位置服务”提示说“是”.

控制台输出是(稍微混淆):

位置管理器身份验证状态更改为:状态尚未确定 位置管理器身份验证状态更改为:状态授权位置: 可选( +/- 65.00m (速度 -1.00 mps / 课程 -1.00) @ 2019 年 11 月 15 日上午 10:24:30 太平洋标准时间)

制作此样品的步骤:

  1. 打开 Xcode 并创建一个新的 macOS 项目
  2. 编辑项目模板提供的ViewController以匹配上面的代码
  3. Add the NSLocationWhenInUseUsageDescriptioninfo.plist 的关键
  4. 在项目设置中应用程序目标的“签名和功能”部分中,选中“强化运行时”下的“位置”复选框。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取用户位置? 的相关文章

随机推荐

  • Python:运行进度条并同时工作?

    我想知道如何同时运行进度条和其他一些工作 然后当工作完成时 停止Python 2 7 x 中的进度条 import sys time def progress bar while True for c in sys stdout write
  • 当 DIV 的高度设置为“100%”时,为什么计算出的 DIV 高度大于其内容(如 svg)? [复制]

    这个问题在这里已经有答案了 这是我的代码 div align center style width 100 height 100 padding 0px margin 0px div
  • JavaScript for 循环索引奇怪[重复]

    这个问题在这里已经有答案了 我对 JS 比较陌生 所以这可能是一个常见问题 但我在处理 for 循环和 onclick 函数时注意到一些奇怪的事情 我能够用这段代码复制这个问题
  • 如何比较数组?还有改变属性?

    我是新的 ios 开发人员 我想比较和更改属性 数组1 对象1 对象2 对象3 对象4 数组2 对象2 对象4 对象5 对象8 比较数组 1 和数组 2 如果 Array2 中存在相同的对象 请更改对象中的属性 在上面的例子中 Object
  • 如何以 root 权限启动 QProcess?

    我需要启动gphoto2来自 Qt 程序 我这样做 QString gphotoProgram usr bin gphoto2 QStringList gphotoArguments gphotoArguments lt lt captur
  • 如何修复 Linux 中的“usr/bin/google-chrome 不再运行,因此 ChromeDriver 假设 Chrome 已崩溃”错误? [复制]

    这个问题在这里已经有答案了 我正在尝试设置一个 jenkins 服务器来在 Amazon Linux 上使用 Selenium webdriver 3 142 0 和 ruby 2 3 7 托管我的自动化框架 如果我尝试使用我的脚本调用 c
  • 从一堆对象中提取一个对象并检测边缘

    在我的大学项目中 我需要通过检测叶子的边缘来根据植物叶子的形状来识别植物的种类 我使用OpenCV 2 4 9和C 但源图像是在植物的真实环境中拍摄的 并且有不止一片叶子 请参阅下面的示例图片 所以这里我需要提取一片叶子的边缘图案来进一步处
  • 在 Visual Studio 环境中将第一个自定义对话框添加到 WIX

    我正在使用 Visual Studio 构建我的 wix 文件 到目前为止 我有一个文件 Product wxs 它可以进行简单的安装 现在我想添加一些自定义对话框 我认为从下面的两篇文章中 我了解了如何做到这一点 在我设置了环境之后 ht
  • 基底存储中私有变量的可能性

    是否可以将私有变量存储在底层存储中 特别是以以下形式存储并在私有函数中访问它们 derive Encode Decode Default Clone PartialEq Debug pub struct MyStruct id Hash t
  • python:ext4 文件系统中 os.path.exists 的复杂性?

    有谁知道 os path exists 函数在带有 ext4 文件系统的 python 中的复杂性是多少 使用的底层目录结构Ext4 and Ext3 与中完全相同Ext2 Ext3添加日记 Ext4改善日记 日记与你的问题无关 最初 Ex
  • 列出物理驱动器空间

    我有大约 200 台服务器 我需要获取磁盘空间和逻辑驱动器空间详细信息 可用空间 已用空间和总空间 这是我的 PowerShell 查询 infoObjects New Object PSObject foreach machine in
  • 在 Firefox 中使用 css 转换时边框渲染不正确

    我有一个像这样的简单 CSS 箭头 arrow brown height 18px width 18px border top 6px solid 39170b border right 6px solid 39170b moz trans
  • UITextView 或 UILabel Swift 上图像的自定义项目符号

    我正在创建一个应用程序 它基本上是一个大型网站的移动版本 该网站有一个特定区域列出了产品功能 每个功能都标有独特的自定义图像 有没有办法快速做到这一点 本质上 创建一个字符串项目符号列表 但使用小图像作为项目符号点 将 UITextView
  • 如何插入重新启动游戏选项?

    我希望在骰子游戏结束时有一个选项 上面写着 您想重新启动吗 是还是不是 如果用户输入 是 游戏就会重新启动 并且会无限次 直到用户玩够游戏并退出 我知道你可以用循环来做到这一点 但是怎么做呢 import random print Dice
  • Java程序如何获得自己的进程ID?

    如何获取我的 Java 进程的 ID 我知道有几种依赖于平台的技巧 但我更喜欢更通用的解决方案 不存在可以保证在所有 jvm 实现中工作的独立于平台的方法 ManagementFactory getRuntimeMXBean getName
  • sed 就地编辑文件

    如何编辑文件single sed命令 目前 我必须手动将编辑的内容流式传输到新文件中 然后将新文件重命名为原始文件名 I tried sed i 但我的 Solaris 系统说 i是一个非法的选择 有不同的方法吗 The i option无
  • 推送不会修改作为函数参数的列表[重复]

    这个问题在这里已经有答案了 我是 common lisp 的新手 所以希望有人能向我澄清这一点 假设我们有一个列表并想要添加一个项目push修改它 CL USER gt defparameter xx 1 2 3 XX CL USER gt
  • PHP odbc_fetch_array 字符串限制

    我有以下sql SELECT bw imp step as imp action FROM cm3rm1 m1 INNER JOIN cm3rm2 m2 ON m1 number m2 number WHERE m1 number id 当
  • 如何使用 MLlib 在 Spark 上生成(原始标签、预测标签)的元组?

    我正在尝试使用从 Spark 上的 MLlib 返回的模型进行预测 目标是生成 orinalLabelInData predictedLabel 的元组 然后这些元组可以用于模型评估目的 实现这一目标的最佳方法是什么 谢谢 假设 parse
  • 如何获取用户位置?

    我试图使用以下代码获取用户的当前位置 但它不起作用 我已经添加了两个NSLocationWhenInUseUsageDescription钥匙和NSLocationAlwaysUsageDescription我的钥匙Info plist f