簡體   English   中英

iOS - 使用“設置”和“取消”按鈕打開“位置服務” - “如何捕獲取消”按鈕單擊

[英]iOS - Turn on Location Services with Settings and Cancel buttons -How do I Capture Cancel button click

當用戶第一次啟動應用程序並嘗試登錄時,會顯示iOS對話框 - “打開位置服務”。

我需要在用戶點擊“取消”時捕獲。 是否發送了Notification 如果是這樣,它的名字是什么? 我一直無法找到它。

當位置服務被禁用或用戶單擊“不允許”時, CLAUthorizationStatuskCLAuthorizationDenied 當用戶單擊“取消”時,它不會觸發authorizationChange事件。 當用戶點擊“取消”時,應用程序就會掛起。

簡短的回答:你無法抓住那個通知。 您可以通過使用CLLocationManager方法推斷用戶選擇並采取相應措施(下面的答案越長)。

更長的回答:

首先,歡迎Stack Overflow。 在善意提出問題並嘗試與在場幫助的人合作之前,最好先搜索其他人之前提出的相同問題。

簡要搜索(僅提及其中一些):

現在,讓我們嘗試總結一下,從iOS文檔開始:

如果您的應用依賴於位置服務來正常運行,您應該在應用的Info.plist文件中包含UIRequiredDeviceCapabilities鍵。 您可以使用此密鑰指定必須存在的位置服務,以便您的應用運行。 App Store使用此密鑰中的信息阻止用戶將應用程序下載到不包含所列功能的設備。

重要提示:如果您的應用程序使用位置服務但能夠在沒有它們的情況下成功運行,請不要在UIRequiredDeviceCapabilities鍵中包含相應的字符串。

因此,如果您的應用確實需要訪問用戶的位置,您應該添加location-services並最終將gpsUIRequiredDeviceCapabilities

然后,在代碼中的某個位置 - 需要時,您必須檢查位置服務是否已啟用。

[CLLocationManager locationServicesEnabled]

可能會因為三個原因而被禁止:

  • 用戶可以在“設置”應用中禁用位置服務。
  • 用戶可以拒絕特定應用程序的位置服務。
  • 設備可能處於飛行模式,無法啟動必要的硬件。

您對第二種情況感興趣:用戶拒絕允許您的應用使用位置服務。

再次,從文檔:

重要提示:除了硬件不可用外,用戶還可以選擇拒絕應用程序訪問位置服務數據。 在應用程序初次使用期間,Core Location框架會提示用戶確認使用位置服務是可以接受的。 如果用戶拒絕該請求,則CLLocationManager對象會在將來的請求期間向其委托報告相應的錯誤。 您還可以使用authorizationStatus方法檢查應用程序的顯式授權狀態。

[CLLocationManager authorizationStatus]

這可能會回歸:

  • kCLAuthorizationStatusNotDetermined確定用戶是否尚未選擇此應用程序是否可以使用位置服務。
  • kCLAuthorizationStatusRestricted此應用程序未被授權使用位置服務。 用戶無法更改此應用程序的狀態,可能是由於父母控制等主動限制。
  • kCLAuthorizationStatusDenied用戶明確拒絕為此應用程序使用位置服務,或者當前在“設置”中禁用了位置服務。
  • kCLAuthorizationStatusAuthorized此應用程序被授權使用位置服務。

如果[CLLocationManager locationServicesEnabled]返回NO並且您無論如何都嘗試啟動位置服務(即調用[locationManager startUpdatingLocation] ),系統會提示用戶確認是否應重新啟用位置服務。 鑒於位置服務很可能是故意禁用的,用戶可能不歡迎此提示。

我想你知道,並做了所有前面的步驟(我只確定你檢查了authorizationStatus )。 您拒絕向我們展示您的應用程序的重要代碼,因此我只能假設背后的整體邏輯。 現在你說你的應用程序掛了。 這應該是因為你沒有正確捕捉錯誤? 如果您願意,捕獲錯誤是重新提示用戶的方法。

在調用[locationManager startUpdatingLocation] ,如果未經授權,您的委托應該定義一個locationManager:didFailWithError:以便捕獲kCLErrorDenied

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

此時,您可以顯示UIAlert堅持要求用戶授予您訪問其位置的權限,或觸發UI或您喜歡的任何內容的更改。


最后的筆記

我希望你理解我為什么要求代碼:原因是為你提供一個替代解決方案,而不是回復“你不能抓住'取消'通知”。

如果這個答案不能滿足您的問題,請詳細說明為什么需要按下“取消”/“不允許”按鈕,這樣我們就可以提供替代方案。

顯然,我的建議是,如果他們不想要,他們會不斷地要求他們提供定位服務,從而不會讓人惹惱他們。

Post scriptum:如果不是全部的話,也許答案在某些部分看起來很迂腐和明顯,但我們也在這里為未來的讀者提供答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM