ios - bar不透明 - swift poptorootviewcontroller




位置服務在iOS 11中不起作用 (6)

跟著這些步驟:

我遇到了一個需要“始終授權”的應用程序遇到了同樣的問題,並通過以下步驟解決了這個問題:

1. NSLocationWhenInUseUsageDescription 添加 Info.plist

2. NSLocationAlwaysAndWhenInUseUsageDescription 添加 Info.plist

3. NSLocationAlwaysUsageDescription 添加 Info.plist (以支持<iOS 11)

4. requestAlwaysAuthorization( 之前 調用 requestWhenInUseAuthorization() requestAlwaysAuthorization(

您無法在requestWhenInUseAuthorization()之前執行requestAlwaysAuthorization()。 您必須升級到該權限級別。 完成這些更改後,位置更新再次開始正常工作。

更多詳情可在這找到:

https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/requesting_always_authorization

我剛用iOS 11 SDK重建了我的應用程序,試圖刪除現在總是出現的 blue banner 。 我想 - “太棒了,有用”,卻發現定位服務現在根本不起作用。

用於iOS 10的應用程序 - 有沒有人聽到過什麼?


使用 Swift 5 iOS 12.2 上測試

步驟1.您必須在plist文件中添加以下隱私權限

<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>

第2步。確保您有以下快速代碼來獲取當前位置

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    // MARK: Variables declearations
    @IBOutlet weak var mapView: MKMapView!
    var locationManager: CLLocationManager!

    // MARK: View Controller life cycle methods
    override func viewDidLoad() {
        super.viewDidLoad()
        //TODO: Make user you must add following three privacy permissions in plist
        //NSLocationWhenInUseUsageDescription
        //NSLocationAlwaysAndWhenInUseUsageDescription
        //NSLocationAlwaysUsageDescription

        getCurrentLocation()
    }

    func getCurrentLocation()
    {
        if (CLLocationManager.locationServicesEnabled())
        {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestAlwaysAuthorization()
            locationManager.startUpdatingLocation()
        }
    }

    // MARK: Location Manager Delegate methods
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let locationsObj = locations.last! as CLLocation
        print("Current location lat-long is = \(locationsObj.coordinate.latitude) \(locationsObj.coordinate.longitude)")
        showOnMap(location: locationsObj)
    }
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Get Location failed")
    }

    func showOnMap(location: CLLocation )
    {
        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
        mapView.setRegion(region, animated: true)
    }
}

在iOS11下我發現,Info.plist在Info.plist中至少需要NSLocationAlwaysAndWhenInUseUsageDescription:

當您的應用程序是 多語言 時,奇怪的是,您的字符串的本地化版本需要此帖子中提到的 所有三個鍵 ,否則 requestAlwaysAuthorization()locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) 將無聲地失敗。

拍攝顯示德語翻譯為例:

希望這可以節省你絆倒的時間。


蘋果似乎又添加了另一項隱私功能。 用戶現在可以覆蓋我們的 requestAlwaysAuthorization 並將其降級為 requestWhenInUseAuthorization - 這意味著作為開發人員,我們現在必須在 Info.plist 提供這兩個描述

我發現他們已經添加了一個新密鑰 NSLocationAlwaysAndWhenInUseUsageDescription

/*
*      Either the NSLocationAlwaysAndWhenInUseUsageDescription key or both the
*      NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription
*      keys must be specified in your Info.plist; otherwise, this method will do
*      nothing, as your app will be assumed not to support Always authorization.
*/

但是,在使用這個新密鑰時 - 位置服務仍然不起作用,進一步搜索後我發現這個寶石混入了所有額外的調試信息:

此應用嘗試訪問隱私敏感數據,但沒有使用說明。 應用程序的Info.plist必須包含NSLocationAlwaysAndWhenInUseUsageDescription和NSLocationWhenInUseUsageDescription鍵,並帶有字符串值,向用戶解釋應用程序如何使用此數據

這與我在更新的 CLLocationManager.h 文件中找到的註釋直接相矛盾。 所以我創造了一個雷達。

好消息,如果你按照調試控制台的建議,IE。 添加新密鑰 NSLocationAlwaysAndWhenInUseUsageDescription 和其中一個舊密鑰 NSLocationWhenInUseUsageDescription ,位置服務將再次開始工作。


斯威夫特:3 我遇到了同樣的問題。 我完全搞砸了找到解決方案。 這是我如何解決這個問題。

步驟1: 項目文件>功能>後台模式>選擇 位置更新

步驟2: 將NSLocationWhenInUseUsageDescription,NSLocationAlwaysAndWhenInUseUsageDescription鍵添加到 Info.plist

第3步:

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true

比抱歉更安全.. 在iOS 11中:添加以下內容,你很好。

<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>




location-services