簡答:您無法捕獲該通知。您可以通過使用CLLocationManager
方法(下面的較長答案)推斷出用戶的選擇並採取行動。
較長的回答:
首先,歡迎在堆棧溢出。在善意地提出你的問題,並試圖與在這裏提供幫助的人協作之前,最好先搜索其他人以前是否提出過相同的問題。
一個簡短的搜索了(只提其中的一些):
現在,讓我們試着總結所有這些,從iOS的文檔開始:
如果您的應用程序依賴於位置服務才能正常工作,你應該包括在應用程序的Info.plist文件中UIRequiredDeviceCapabilities關鍵。您可以使用此密鑰來指定您的應用程序必須運行的位置服務。 App Store使用此密鑰中的信息阻止用戶將應用程序下載到不包含列出功能的設備。
重要提示:如果您的應用使用位置服務,但如果沒有它們即可成功操作,請不要在UIRequiredDeviceCapabilities鍵中包含相應的字符串。
所以,如果您的應用程序確實需要訪問用戶的位置,你應該添加location-services
,最終gps
至UIRequiredDeviceCapabilities
。
然後,在您的代碼中的某個地方 - 在需要時,您必須檢查位置服務是否已啓用。
[CLLocationManager locationServicesEnabled]
他們可能被禁止,原因有三:
- 用戶可以在設置應用程序關閉定位服務。
- 用戶可以拒絕特定應用程序的位置服務。
- 設備可能處於飛行模式,無法啓動必要的硬件。
您對第二種情況感興趣:用戶拒絕讓您的應用使用位置服務。
再次,從文檔:
重要信息:除了不是可用的硬件,用戶拒絕應用程序對定位服務的數據訪問權限的選項。在應用程序初次使用期間,核心位置框架會提示用戶確認使用位置服務是可以接受的。如果用戶拒絕請求,則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:也許答案看起來很迂腐,並且在某些部分顯而易見,如果不是全部給你,但我們在這裏也爲未來的讀者提供答案。
您是否可以添加一些代碼的相關部分讓我們更好地理解發生了什麼?謝謝 – furins
我只是問在「打開位置服務」對話框中如何捕獲取消按鈕的CLICK事件。沒有代碼可以呈現。 – DigitalMafiaPro
如果用戶點擊取消,則意味着他不想在當時做出決定,那麼狀態應該與應用程序啓動時相同(未定義)。如果你想幫助解決這個問題,你必須告訴我們一些代碼,以便重現錯誤 – furins