1

我面臨的一個問題是,當應用程序在後臺運行時,我的應用程序需要用戶位置,當他們收到推送通知時。iOS應用程序背景位置(推送通知)

做一點閱讀後,我的印象是,這是不可能的,即下:

1)應用程序在後臺

2)推送通知收到

3)獲取用戶位置並執行代碼塊。

我發現這post on here,這表明你可以每N分鐘運行一個任務來獲取用戶的位置。所以使用這個我可以每十分鐘檢查一下會有效,但如果我繼續激活GPS,這將浪費用戶電池。因此,我想知道我可以告訴我的後臺任務,如果用戶有任何推送通知等待我的應用程序?這樣我會檢查他們是否每十分鐘做一次,如果他們這樣做,只會激活GPS。也許我正在走這個所有錯誤的方式,我真的很感激任何建議。對不起,沒有任何後臺任務的代碼,因爲我仍然試圖讓它工作。

[更新]

達斯汀感謝您的諮詢。經過一些測試後,我決定選擇一個更簡單的選項。我現在正在使用Apple重大位置更改。我將更改存儲在數組中,如果最後一次更改大於10分鐘,我將其設置爲僅更新。然後,當應用程序變爲活動狀態時,我會將陣列中最近的時間與發送推送通知的時間相匹配並使用該位置。

+0

什麼發送推送通知?取決於你可能做KVO的內容。 – Dustin 2012-07-30 19:39:29

+0

它是一款基於回合的遊戲/應用 - 當用戶輪到他們時,推送通知會發送給對方,讓他們知道輪到他們。 – dciso 2012-07-30 19:46:24

+0

讓通知設置一個布爾值,該值對應於玩家是否輪到。對布爾值做KVO。 – Dustin 2012-07-30 19:49:36

回答

1

如所討論的我使用替代的解決方案,在這裏它是:

在viewDidLoad中或didFinishingLaunchingWithOptions添加:

locationsLogged = [[NSMutableArray alloc] init]; 
lastLocationTime = [[NSDate alloc] init] 
locationManager = [[CLLocationManager alloc] init]; 
[locationManager setDelegate:self]; 
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 

在applicationDidEnterBackground添加:

[locationManager startMonitoringSignificantLocationChanges]; 

添加:

-(void) storeLocations:(CLLocation *)location 
{ 
bgTask = [[UIApplication sharedApplication] 
      beginBackgroundTaskWithExpirationHandler: 
      ^{ 
       [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
       }]; 

[locationsLogged addObject:location]; 

if (bgTask != UIBackgroundTaskInvalid) 
{ 
    [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
    } 
} 


-(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
BOOL isInBackground = NO; 
if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) 
{ 
    isInBackground = YES; 
} 


NSDate *now = [NSDate date]; 
NSTimeInterval diff = [now timeIntervalSinceDate:lastLocationTime]; 


if ((int)diff > 600) { 

    if (isInBackground) 
    { 
     [lastLocationTime release]; 
     lastLocationTime = [[NSDate alloc] init]; 
     [self storeLocations:newLocation]; 
    } 
    else 
    { 
     // ... 
    } 
} 
} 

然後在applicationDidBecomeActive上,您可以使用您需要的任何邏輯來應用位置信息。