2014-06-19 90 views
0

在我的應用我想使用的是iOS 7的背景取feature.I也選擇背景取複選框能力目標的部分(當然還有標誌的plist自動添加)一些數據發送到服務器。iOS7後臺抓取?

在AppDelegate中我這樣做:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum]; 
    //[application setMinimumBackgroundFetchInterval:10]; also tried this 
    return YES; 
} 

,然後在委託方法我這樣做:

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ 

     LocationManager = [[CLLocationManager alloc] init]; 

     LocationManager.delegate = self; 
     LocationManager.desiredAccuracy = kCLLocationAccuracyBest; 
     LocationManager.distanceFilter = 50.0; 
     [LocationManager startUpdatingLocation]; 

     /** NEW DATA EXISTS AND WAS SUCCESSFULLY PROCESSED **/ 
     if (YES) { 

      completionHandler(UIBackgroundFetchResultNewData); 
     } 
     else 
      completionHandler(UIBackgroundFetchResultFailed); 
} 

然後,我連我的iPhone Xcode和運行應用程序,並點擊模擬背景從取調試菜單。代理方法被調用並且服務器上的位置已更新一次,但它再也沒有發生過,系統從不在後臺喚醒應用程序。 我做錯了什麼?任何幫助,將不勝感激。

編輯:是否有可能使用後臺獲取在服務器上發送數據? 編輯-2如果我使用遠程通知,而不是背景,以獲取服務器上發送數據,那麼在這種情況下,能夠保證所有的系統喚醒我的應用程序了,一旦它得到遠程通知?

+0

之前作出的任何決定都要經過下@ walle84答案評論。 – Bharat

+0

在Xcode 6中,「模擬後臺抓取」被破壞(已驗證,在6.3.1中不起作用),並在Xcode 6發行說明的「已知問題」部分中提到。 [其他線程](http://stackoverflow.com/a/29974714/939757)[發行說明](https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes。 HTML#// apple_ref/DOC/UID/TP40001051-CH4-DontLinkElementID_32) – bretto

回答

1

簡單的回答是,調用performFetchWithCompletionHandler方法取決於設備的iOS何時調用它。我也有同樣的問題,並發現它可能會在幾分鐘或幾小時或一天或一週內被調用。另外** UIApplicationBackgroundFetchIntervalMinimum **並不意味着它會在最短的時間內調用它,它的正義可能永遠不會或最小,最終依靠OS來調用preformFetch方法。所以最後你可以等待OS調用performFetchWithCompletionHandler方法。

+0

但我想更新位置信息每20或30分鐘,提到我也試圖把我自己的時間間隔像10秒。 – Bharat

+0

@Bharat您需要在您的應用上使用位置服務背景模式。然後從那裏你可以用你所說的時間間隔和startUpdating Location來運行一個NSTimer。 performFetchWithCompletionHandler將不會在設定的時間間隔內執行,因爲操作系統決定何時調用它。 –

+0

即使您設置了20或10秒的時間間隔,它也不會像我讀取背景獲取時那樣工作。它完全依賴於操作系統來調用那個performFetch方法,正如之前所講的那樣,它可能是幾個小時或幾天。我在嘗試自己並試圖創建它的演示時遇到了同樣的問題。 – nikhil84

0

iOS的智能是在路上,如果從您的應用程序在後臺運行消耗更多的資源,它甚至會停止再次調用它。後臺提取的時間間隔永遠不會被修復,操作系統在空閒時會調用它。如果你的應用程序的後臺操作消耗更少的資源,它很可能會再次被調用。您不一定每20或30分鐘更新一次位置。即使您提到間隔,如果操作系統不是免費的,它也不會執行您的獲取操作。