Apple 無疑是資料私穩方面的領導者。一直以來,位置存取 (location access) 資料都被不同的 App 錯誤使用或濫用。 這是一個安全威脅,或甚至是資料洩漏。而在 iOS 14 中,Apple 再次讓使用者好好控制自己分享的資料。
iOS 14 為 CoreLocation
框架帶來了一點改變,從現在開始,使用者可以選擇要給予準確或大概的位置存取。
在我們探討如何在 iOS 14 管理位置變化前,先來重溫 iOS 13 的位置權限 (location permission) 吧!
快速重溫 iOS 13 的位置權限
去年在 iOS 13 中,Apple 改變了位置追蹤權限的操作。
- 最明顯的改變,就是新的 “Allow Once” 權限,這個權限需要
NSLocationWhenInUseUsageDescription
的設定。值得一提的是,在關閉 App 之後,這個權限會自動被呼叫。 - 另外,啟用 “Allow While Using The App” 會暫時 “Always allow(總是允許)” 位置追蹤。當你嘗試在背景存取一個位置,系統會向使用者顯示一個對話視窗,讓使用者選擇 App 繼續或中止追蹤位置。
- iOS 13.4 引入了一個更好的方法,讓我們快速確認是否已經獲得 “Always allow” 的權限。只要詢問
authorizedWhenInUse
,如果已經獲得 “Always allow” 的權限,就會顯示一個authorizedAlways
的 prompt。
如果你想深入了解 iOS 13 App 內的位置權限處理,可以參閱這篇文章。
在接下來的部分,我們會看看如何在 iOS 14 SwiftUI App 中,管理位置變化。
讓我們開始吧!
iOS 14 CoreLocation 的改變
之前,我們會在 CLLocationManager
呼叫 authorizationStatus
,但 Apple 現在已不推薦我們使用這個類別函式。
也就是說,從 iOS 14 開始,我們只可以在 CLLocationManager
實例上呼叫 authorizationStatus()。
Apple 也不推薦使用 CoreLocation
的 didChangeAuthorization
委派函式,它包含了一個 status
引數。取而代之的,是新的 locationManagerDidChangeAuthorization
函式。
為了確認位置準確性的狀態,我們可以呼叫位置管理器實例中新的列舉屬性 accuracyAuthorization
,這個屬性是 CLAccuracyAuthorization
型別,並有兩個情況:
fullAccuracy
reducedAccuracy
(回傳大概位置,而非確實位置)
為位置更新設定 CoreLocation
的方法與 iOS 13 一樣:
allowsBackgroundLocationUpdates
,請確保你已在 Xcode 專案的 Capabilities 中開啟了 Background mode location 功能。現在試試在設備上執行以上的程式碼,以下的 prompt 會彈出:
你可以點擊 “Precise” 按鈕,來選擇允許大概或是確實的位置存取。
現在,假設有一個範例,只要求你訪問存取使用者的確實位置。
幸好,iOS 14 有一個新函式讓我們暫時要求其確實位置。
requestTemporaryFullAccuracyAuthorization
函式需要一個 purpose key,來向使用者解釋需要確實位置的原因。這個 key 是在 NSLocationTemporaryUsageDescriptionDictionary
字典內的 plist
檔案內被定義,如下所示:
呼叫 requestTemporaryFullAccuracyAuthorization
後,就會顯示以下的 prompt:
reducedAccuracy
和 fullAccuracy
位置更新,都是在 didUpdateLocations
委派方法中接收。
如果想要範例 iOS 14 CoreLocation
App 的完整程式碼,可以到 GitHub 儲存庫參考。
值得一提的是,reducedAccuracy
的背景位置更新功能中,位置更新的時間間距是不會改變的。而且,在 reducedAccuracy
的情況下,信標 (beacon) 和區域檢測將會被停用。
CoreLocation 在 AppClips、Widgets、和預設設定中的更新
AppClips 就像迷你的 App 模塊,即使沒有安裝完整的 App,也可以正常運行。
- 當你在 AppClips 內存取位置時,是沒有 “While Using App” 的權限的,取而代之的是 “While Using Until Tomorrow” 的權限,而權限會自動在當日完結後重置。
- 要在 WidgetKit 內存取位置,你需要在 Widget 的
info.plist
檔案內定義NSWidgetWantsLocation
key。 - 如果你想在 App 內預設顯示大概位置的 prompt,可以添加
info.plist
的 keyNSLocationDefaultAccuracyReduced
。如此一來,在權限對話視窗中就不會顯示準確位置的按鈕。但使用者仍然可以在電話的設定中啟用按鈕。
總結
CoreLocation
為 iOS 14 帶來很有趣的改變,讓使用者可以對自己的位置資訊有更多控制。不是所有 App 都需要使用者的確實位置,所以你可以選擇 reducedAccuracy
屬性,只擷取使用者的大概位置。
本篇文章到此為止,謝謝你的閱讀。