swift 在调试器中获取错误:此应用已尝试在没有使用说明的情况下访问隐私敏感数据

42fyovps  于 2023-01-29  发布在  Swift
关注(0)|答案(5)|浏览(126)

我在调试区域遇到了问题。它说:"* 此应用已尝试访问没有使用说明的隐私敏感数据。应用的Info. plist必须同时包含" NSLocationAlwaysAndWhenInUseUsageDescription "和" NSLocationWhenInUseUsageDescription "键,并带有字符串值,向用户解释应用如何使用此数据。*"
我正在创建的应用程序只在用户使用应用程序时才能获取用户的位置,换句话说,只在前台。我只添加了我的info.plist:Key(Privacy-Location When In Use用法描述)、Type(String)、Value(我们将使用您的位置来查找您附近的工作!)。
下面是我的视图控制器中的代码:

import UIKit
import Foundation
import CoreLocation

class JobTableViewController: UITableViewController, CLLocationManagerDelegate {
    
let locationManager = CLLocationManager()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    
// Implement Indeed Job Search API
    let headers = [
        "x-rapidapi-host": "indeed-indeed.p.rapidapi.com",
        "x-rapidapi-key": "838897ae8cmsha8fef9af0ee840dp1be982jsnf48d2de3c84a"
    ]

    let request = NSMutableURLRequest(url: NSURL(string: "https://indeed-indeed.p.rapidapi.com/apigetjobs?v=2&format=json")! as URL,
                                            cachePolicy: .useProtocolCachePolicy,
                                        timeoutInterval: 10.0)
    request.httpMethod = "GET"
    request.allHTTPHeaderFields = headers

    let session = URLSession.shared
    let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
        if (error != nil) {
            print(error!)
        } else {
            let httpResponse = response as? HTTPURLResponse
            print(httpResponse!)
        }
    })

    dataTask.resume()
   
    
// Recieve live location from user
    // For use when the app is open
    locationManager.requestWhenInUseAuthorization()
    
    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation()
    }
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let location = locations.first {
        print(location.coordinate)
    }
}

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if(status == CLAuthorizationStatus.denied) {
        showLocationDisabledPopUp()
        
    }
}

// If user disabled location services
func showLocationDisabledPopUp() {
    let alertController = UIAlertController(title: "Location Access is Disabled", message: "In order to automatically find jobs near you, we need your location.", preferredStyle: .alert)
    
    let cancelAction = UIAlertAction(title: "Okay", style: .cancel, handler: nil)
    alertController.addAction(cancelAction)
    
    let openAction = UIAlertAction(title: "Open Settings", style: .default) { (action) in
        if let url = URL(string: UIApplication.openSettingsURLString) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        }
    }
    alertController.addAction(openAction)
    
    self.present(alertController, animated: true, completion: nil)
    
}

我能够成功地构建应用程序并登录到应用程序。调试器甚至成功地显示了模拟器的坐标。但是,它仍然给我这个警告,我无法使用坐标通过我安装的API查找附近的作业(代码也包含在上面)。我不知道为什么它甚至警告我关于"NSLocationAlwaysAndWhenInUseUsageDescription",因为它'It "我的节目里一次也没提到。
这个警告是否有正当理由?另外,这个警告是否与应用程序无法通过API提供附近的工作有关?我知道这一切都很混乱,所以我在下面附上了所有内容的截图。请提出任何问题进行澄清,非常感谢你的帮助!
info.plist screenshotdebugger screenshot

ykejflvf

ykejflvf1#

调试器消息和其他两个答案告诉您需要执行的操作。请添加具有相同文本的其他用法键。
为什么?这是必需的,因为截至iOS 12,用户可以在被问及“始终”时回答“何时使用”,而在iOS 13中,只有在应用程序首次询问“始终”时才会被问及“何时使用”。
在iOS 12之前的版本中,根据应用的请求使用不同的“使用时”和“始终”权限请求字符串。
在iOS 12及更高版本中,您需要在一个键中包含一个用法字符串,该字符串在“始终”和“使用时”场景中都有意义。
苹果提供了新的NSLocationAlwaysAndWhenInUseUsageDescription密钥,允许应用程序开发人员有机会根据新的行为提供不同的信息。
理论上,这是iOS 12之后唯一需要的密钥,但为了向后兼容,您需要同时包含新旧密钥,即使您的最低iOS目标是iOS 12或更高版本。

zed5wv10

zed5wv102#

只需在info.plist中添加NSLocationAlwaysAndWhenInUseUsageDescriptionNSLocationWhenInUseUsageDescription两个键,定位服务就可以完全正常地启动。

h7wcgrx3

h7wcgrx33#

要从用户的设备获取位置更新,您需要征求用户的许可。如果未征求用户的许可,Apple将在应用提交审核时拒绝该应用。
在info.plist中添加这两个键-

NSLocationWhenInUseUsageDescription
name - Privacy - Location When In Use Usage Description
reason - why your app wants to access location
NSLocationAlwaysAndWhenInUseUsageDescription
name - Privacy - Location Always and When In Use Usage Description
reason - why your app wants to access location
dphi5xsq

dphi5xsq4#

在我的例子中,忘记在Info.plist中设置Privacy - Location When In Use Usage Description

dgjrabp2

dgjrabp25#

您可能忘记在info.plist中添加Privacy - Location When In Use Usage Description
要做到这一点,只需前往info.plist,单击+ button并粘贴Privacy - Location When In Use Usage Description
别忘了添加评论,让用户了解您询问他们职位的原因。

相关问题