2015-06-25 15 views
2

我早就問過這個問題。我想我錯了我的問題。基本上我想在應用程序終止時將數據從應用程序保存到解析後端。即應用程序被從應用程序列表中刷入並殺死。 iOS文檔說,實際上applicationDidEnterBackground將被調用,而不是applicationWillTerminate,所以任何工作都可以用這種方法完成。當我們滑動以退出應用程序時,如果不調用applicationDidEnterBackground 100%的時間,我們如何可靠地保存數據?

applicationWillTerminate: 對於不支持後臺執行或與iOS 3.x或更低版本鏈接的應用程序,此方法始終在用戶退出應用程序時調用。對於支持後臺執行的應用程序,當用戶退出應用程序時,通常不會調用此方法,因爲在此情況下應用程序只是移至後臺。但是,在應用程序在後臺運行(未掛起)並且系統因某種原因需要終止該應用程序的情況下,可能會調用此方法。

但是,這不是100%,從我的測試applicationDidEnterBackground不會每次我退出應用程序調用。那麼,如果一個應用程序以100%保證終止並且實際上將被保存,那麼如何保存數據呢?

這是我在保存時applicationDidEnterBackground代碼:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{ 
     //End the Task 
     [application endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     if([self getController]){     
      CatsViewController *catsViewController = [self getController]; 
      if(catsViewController.currentUser){      
       int count = (int)[MyViewController.currentUser.messages count]; 
       PFInstallation *currentInstallation = [PFInstallation currentInstallation]; 
       currentInstallation.badge = count; 
       [currentInstallation saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { 
        [application endBackgroundTask:bgTask]; 
        bgTask = UIBackgroundTaskInvalid; 
       }];      
      }     
      else{      
       [application endBackgroundTask:bgTask]; 
       bgTask = UIBackgroundTaskInvalid; 
      } 
     }    
     else{     
      [application endBackgroundTask:bgTask]; 
      bgTask = UIBackgroundTaskInvalid; 
     } 
    }); 
} 

將是偉大就在這任何指針。謝謝

+1

任何原因,你不能改變,而不是「退出」 – Wain

+0

我試圖保持在解析與同步保存我的徽章號碼(徽章號碼是我應用中的郵件數量)。我不想每次都打一次額外的電話來解析,我會刪除一條消息來更新對象,我寧可在應用程序放入後臺或通過一次調用退出時執行此操作。即用戶打開應用程序刪除3條消息,然後切換應用程序單個API調用更新徽章數,而不是3. – Kex

回答

1

你可以使用applicationWillResignActive這樣的事情。當用戶打開他的通知中心時,它還有額外的獎勵。當用戶進入應用程序切換器時,它也會被調用。如果他然後殺死了應用程序,那麼您就無能爲力了,因爲從切換器中滑動應用程序將發送一個SIGKILL。如果你幸運的話,你可以在使用willResignActive之前完成你的後臺任務。

我總是分別使用applicationWillResignActive和applicationDidBecomeActive,因爲它們都覆蓋了更廣泛的應用程序不在前臺的情況。

而且讀this answer here(及以上)

+0

嘿,謝謝你,所以如果我將我的代碼移動到applicationWillResignActive它應該做同樣的事情,但也包括我在什麼時候應用切換器是否正確?測試了一下,因爲我正在做一個API調用,你必須是超人類才能比打電話所花費的時間更快,所以看起來不錯。 – Kex

0

下面是這種情況的解決方案。如果你滑動以退出你的應用程序,它將 不會調用applicationDidEnterBackground,因爲應用程序已終止。 的任務AppDelegate方法,當你的應用程序被終止,以得到所謂的 這種方法:

1.) You need to add the appWillTerminate observer in you app delegate. 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
//This is the observer you need to add so that the applicationWillTerminate app delegate method will get called. 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:nil]; 

} 

2.)Add the codes for saving before your app is terminated. 
-(void)applicationWillTerminate:(UIApplication *)application{ 
//Add your codes like saving data here 
} 
相關問題