簡體   English   中英

為“超本地”應用程序獲取用戶位置(也處於被殺死狀態)的適當方法

[英]Appropriate way to get user's location(also in killed state) for an “hyperlocal” app

要求 -我正在構建一個超本地應用程序,它將根據用戶的位置為用戶提供服務。 在app中我可以獲得他當前的位置並相應地顯示優惠,但我現在需要的是根據他的位置向用戶發送推送通知。 所以我想找出用戶的位置並根據他的位置發送優惠。

我已經閱讀了有關重大變更位置服務的 Apple文檔,但后來這個答案說,一旦應用程序被殺,它將無法運行。

我還閱讀了有關跟蹤用戶位置的信息,但這對我來說無效。 我在后台沒有獲得超過5個更新。

我在viewDidLoad當前代碼 -

if (self.locationManager == nil)
{
     self.locationManager = [[CLLocationManager alloc] init];
     self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
     self.locationManager.delegate = self;
     self.locationManager.allowsBackgroundLocationUpdates = true;
     self.locationManager.pausesLocationUpdatesAutomatically = false;
     if ([CLLocationManager authorizationStatus] != AVAuthorizationStatusAuthorized) {
         [self.locationManager requestAlwaysAuthorization];
     }
}
[self.locationManager startUpdatingLocation];

我的委托方法看起來像這樣 -

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {   
   if (UIApplication.sharedApplication.applicationState == UIApplicationStateActive) {
       // Get updated data according to location
   } else {
       // Send location to server
   }
}

我的應用程序功能和我的plist - 在此輸入圖像描述 在此輸入圖像描述

請建議一些適當的方式,我可以生活在1公里左右的精度。

另一種方法 -

  1. 我可以在“后台模式 - 后台獲取”的fetchNewDataWithCompletionHandler:獲取用戶的位置fetchNewDataWithCompletionHandler:

  2. 我可以使用Silent Push通知的application:didReceiveRemoteNotification:fetchCompletionHandler:獲取用戶的位置application:didReceiveRemoteNotification:fetchCompletionHandler: ):根據這個答案不可能

所以,你的問題基本上是“如何讓想要讓我的應用程序閉嘴的人能夠繞過Apple特別設計的用戶交互?” 答案是“如果你想要遵守AppStore的規則,那就不是”。

聽着,如果用戶決定終止你的應用程序(即他們將其向上滑動並退出任務管理器),這個設計的全部內容就是讓你的應用程序停止做任何事情 Apple設計了這個,以便人們可以快速關閉您似乎想要實現的行為。 我不明白你為什么要繞開它。 我同意這種交互可能有點模糊(畢竟,用戶也可以允許/禁止應用程序在設置應用程序中在后台接收位置更新的權利),但這是iOS定義的交互。

如果我理解正確,您成功正確設置了背景位置模式,因此即使不在前台,您的應用也可以接收位置更新(即在后台或暫停,在后一種情況下iOS會簡單地喚醒它您可以處理位置更新,例如發送本地通知以通知用戶)。 這就是它的好處。

哦,不要害怕設備重啟。 是的,重新啟動后你的應用程序在技術上沒有運行,但由於用戶最后沒有明確地殺死它,iOS會像處於掛起模式IIRC一樣對待它,所以你仍然會獲得重要的位置更新並且可以做出正確的反應。 (以更一般的方式:人們通常認為實際的應用程序進程狀態反映了應用程序狀態,因為它在文檔中定義和/或應用程序是否顯示在任務管理器中是否與之相關聯。兩者都不是完全正確。)


在您的評論后編輯 ,具體詢問背景提取:

對不起,這可能並不完全清楚。 我沒有具體回答這個子問題,因為在用戶有意退出你的應用程序之后,你不應該如所解釋的那樣“欺騙”他們的意圖。 由於這個原因,無聲推送通知無法正常工作,是的。

我不知道背景提取是否會以類似的方式被抑制(可能是,但我還沒有嘗試過),但我認為這也無濟於事,即使它仍在工作(我懷疑,Apple可能會對此很難)。 我也從未試圖(重新)在這個方法中啟動位置更新,所以我不能說這是否有效(一旦調用完成處理程序,系統可能會至少再次暫停你的應用程序,我不確定這個“重置”系統似乎用來決定喚醒哪個應用程序並提供位置更新的“用戶殺死了應用程序標志”。

application:performFetchWithCompletionHandler:因為它被完全調用)將由操作系統基於啟發式調用,它試圖在此“聰明”。 由於該方法旨在從不提供推送通知的后端獲取某些數據,因此完全調用它的時間可能會受到嚴格限制,如文檔中所述。 決定操作系統調用的實際機制是一個黑盒子,並且當你需要時試圖欺騙它進行調用是一種賭博。 幾小時后很可能發生這種情況。 考慮以下情況:

  • 你的應用程序在后台位置模式下運行正常(我理解你已經成功設置了嗎?請看這里這里
  • 用戶手動殺死您的應用。 為了這個參數,我們假設不會讓系統在以后重新啟動它以給它一個后台獲取機會
  • 由於其他應用程序正在系統上運行,並且用戶此刻只有邊緣連接,因此操作系統決定啟動后台提取是一個糟糕的時間(我只是假設這些因素起作用,因為它說它是一個黑盒子,但那些對我來說似乎是合理的)。 您的用戶可以繞過您感興趣的幾個位置。
  • 兩個小時后,用戶現在處於完全不同的區域,操作系統再次啟動您的應用程序並獲取application:performFetchWithCompletionHandler: call。 您再次開始位置更新(假設即使有效,系統也不會立即再次終止應用程序,即使在假冒背景提取后它會在后台提供位置更新)。 你錯過了幾個地方,但現在應用程序處理新的。 你的所有邏輯基本搞砸了,因為你沒有計划丟失那么多的位置更新......
  • (可選:一段時間后,您的用戶意識到您的應用顯然會做某事,即使他們終止了它(例如他們注意到電池耗盡)。他們會刪除您的應用並留下一次開始審核...)
  • (可選2,最糟糕的情況:一旦蘋果意識到可以在用戶以這種方式殺死應用程序后重新啟動后台位置更新,他們只需關閉iOS更新中的循環漏洞,您的應用程序就會回到我們開始的位置。 ..)

為了記錄:我不是在捍衛蘋果公司做出的任何設計決定,哎呀我知道這是令人困惑的問題,正如人們可以表明“在所有情況下保持電池和用戶意圖”一樣,人們可以為更好的背景跟蹤。 我只是指出他們在這里控制並且試圖圍繞他們在平台上設置的任何特定交互范例,這可能不是一個好主意。

總而言之,我擔心“用戶終止應用程序,現在我不會獲得任何位置更新”只是你必須要忍受的東西。 為什么這對你來說甚至都是一個問題,考慮到你沒有說任何關於背景位置模式對你不夠的事情? 我能想象的唯一(可疑)場景是一種跟蹤器應用程序,可能是在發送給交付服務員工的設備上給出的。 如果就是這樣(並且拋開這些東西背后的道德規范,在某些甚至是非法的國家,請注意......),我不得不說iOS根本就不是正確的平台。

嗨,只需創建一個UILocalNotification將其設置為您的詳細信息,最重要的是當您輸入Region添加region屬性時觸發通知請參閱docs

希望能幫助到你

暫無
暫無

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

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