2012-08-08 126 views
10

當應用程序處於後臺時,可以向PHP服務器發出HTTP異步請求? 該應用程序是基於位置的應用程序,應收集當前位置並每隔5(或其他值)分鐘將座標發送到服務器。即使應用程序在後臺,我是否可以將http帖子發送到服務器?我讀了很多關於這方面的想法,但其中一些人說可以做到,其他人不能做。後臺iOS HTTP請求

謝謝,

Alex。

+0

首先,從來沒有試圖在一個固定的時間收集位置。這會消耗電池。只需開始列出主要位置更改,如果發生這些更改,然後將新位置發送到服務器。如果您需要更準確的位置,請在發生主要位置變化時啓動GPS,並在您的位置足夠滿足您的要求時停止GPS。然後將數據發送到服務器。 – rckoenes 2012-08-08 12:40:18

+2

這是我做到這一點的方式,我開始更新位置,獲取位置,停止位置更新,將請求發送到服務器,5分鐘後再次開始位置更新,獲取位置,停止等。問題是我能發送請求,如果應用程序處於後臺模式?謝謝。 – 2012-08-08 12:45:18

回答

16

它可以完成,但它是不可靠的,因爲你問操作系統有時間發送一些東西,它可以接受或拒絕你的請求。這是我(從什麼地方偷來的SO):

[...] //we get the new location from CLLocationManager somewhere here  
BOOL isInBackground = NO; 
if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) 
{ 
    isInBackground = YES; 
} 
if (isInBackground) 
{ 
    [self sendBackgroundLocationToServer:newLocation]; 
} 


- (void) sendBackgroundLocationToServer: (CLLocation *) lc 
{ 
    UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid; 
    bgTask = [[UIApplication sharedApplication] 
     beginBackgroundTaskWithExpirationHandler:^{ 
      [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
    }]; 

    NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:2]; 
    [dictionary setObject:[NSNumber numberWithDouble:lc.coordinate.latitude] forKey:@"floLatitude"]; 
    [dictionary setObject:[NSNumber numberWithDouble:lc.coordinate.longitude] forKey:@"floLongitude"]; 
    // send to server with a synchronous request 


    // AFTER ALL THE UPDATES, close the task 
    if (bgTask != UIBackgroundTaskInvalid) 
    { 
     [[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
    } 
} 
+0

非常感謝你,我宣佈你是這一年的開發者:)。所以,基本上,它可能會工作一些,其他人不會,這取決於操作系統。 – 2012-08-08 12:51:09

+0

我可以在模擬器中測試它嗎? – Dilip 2013-01-10 06:26:30

+3

'isInBackground'是完全沒有必要的。 – 2rs2ts 2014-03-14 15:08:40

3

這些鏈接將幫助你......

iphone - Connecting to server in background

+0

謝謝,vakio建議,但沒有代碼:d。我認爲beginBackgroundTaskWithExpirationHandler方法將解決我的問題。 – 2012-08-08 12:54:19