WatchKit WatchOS - Apple Watch 上从未显示定位服务提示

Posted

技术标签:

【中文标题】WatchKit WatchOS - Apple Watch 上从未显示定位服务提示【英文标题】:WatchKit WatchOS - Location Services Prompt never displayed on the Apple Watch 【发布时间】:2021-01-22 18:37:02 【问题描述】:

当我从 Watch 应用程序调用 requestWhenInUseAuthorization() 时,定位服务提示永远不会显示给用户:无论是在 Watch 应用程序中,还是在 iPhone 应用程序中。

Support Running without ios App Installation 没有被选中(如果我选中它,提示会正确显示,但我不希望我的应用程序在没有 iOS 配套应用程序的情况下运行)。 我在 iPhone 应用和 Watch Extension 的 info.plist 中添加了 NSLocationWhenInUseUsageDescription 键。 我还尝试在后台模式下添加定位服务(适用于 iPhone 和 Watch Extension)。

我们怎样才能在手表上显示提示?这甚至可能吗?我不一定要让我的用户打开他们的 iPhone 应用来管理应用中的请求位置。


import SwiftUI
import CoreLocation

struct ContentView: View 
    
    @StateObject var watchLocationManager = WatchLocManager()
    
    var body: some View 
        Button("Request location")  watchLocationManager.requestAuthorization() 
            .onAppear 
                watchLocationManager.setupLocationManager()
            
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

    
class WatchLocManager: NSObject, ObservableObject 

    private var locationManager = CLLocationManager()
    
    func setupLocationManager() 
        self.locationManager.delegate = self
        self.locationManager.activityType = .otherNavigation
        self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        self.locationManager.distanceFilter = 20.0
    
    
    func requestAuthorization() 
        self.locationManager.requestWhenInUseAuthorization()
    


extension WatchLocManager: CLLocationManagerDelegate 

    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) 
        print("⌚️ locationManagerDidChangeAuthorization: \(manager.authorizationStatus.rawValue)")
    
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
        print(locations)
    
    
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) 
        print(error)
    

【问题讨论】:

【参考方案1】:

iPhone 和 Watch 共享隐私>定位服务设置。如果应用在 iPhone 上已经有授权状态,它就不会在 Watch 上再次询问。

设置设置>隐私>LocationServices>YourApp>允许位置访问>下次询问。

然后打开 Watch 应用。

要求的步骤

New Project>WatchOS>带有WatchApp的iOS应用

填写产品名称,无其他变化

保存在 Mac 文件夹中

struct ContentViewstruct ContentView_Previews 替换为您的代码。

ContentView.swift 文件位于 AppName 文件夹下。

添加到上述文件的Target Membership AppName WatchKit Extension。我在File Inspector 中通过选中该框进行了此操作。

转到AppName WatchKit Extension 文件夹下的ContentView.swift 文件并删除(取消选中)文件的Target MembershipAppName WatchKit Extension。 (如果你不这样做,你会得到一个副本)

AppName WatchKit Extension 文件夹下将NSLocationWhenInUseUsageDescription 添加到Info.plist

确保选择了AppName WatchKit App 方案。

按下播放键。等到加载完毕……

按下“请求位置”按钮

【讨论】:

我也试过了。不在我这边工作。当我选择询问时,按钮什么也不做。 您的代码适用于 Simulator Xcode 12.3。一定有其他因素影响它。 我在 Xcode 12.3、iOS 14.3、WatchOS 7.2 & 6.2.3 & 5.3 中再次尝试。我这边没有成功。从全新安装开始,我启动应用程序,然后单击按钮从 Watch 模拟器请求访问权限,但没有任何反应……您能分享一下对您有用的方法吗? 见上文。我添加了我采取的步骤。 对我来说,它是在我在 WatchKit 扩展常规设置中激活“支持在不安装 iOS 应用程序的情况下运行”后开始工作的。

以上是关于WatchKit WatchOS - Apple Watch 上从未显示定位服务提示的主要内容,如果未能解决你的问题,请参考以下文章

在 WatchKit 项目中无法识别 presentAudioRecordingControllerWithOutputURL

如何在 WatchKit 扩展目标(XCode7 beta 6)中重置 watchOS 部署目标

使用 Xcode 8 和 watchOS3 配置 WatchKit 应用程序扩展

如何以swift语言在watchKit中为gyroActive或gyroAvailable编码?

在 App-Group 文件夹中创建领域文件在 WatchOS(WatchKit 扩展)下不起作用

WatchOS 错误 HumanReadableNSError: 运行目标 iPhone 12 Pro Max 对运行方案 MYAPP WatchKit App 无效