2015-02-11 54 views
1

我正試圖在應用程序終止時通過NSURLSession進行快速POST。應用程序終止被定義爲當用戶在主屏幕上時將其刷出。此外,applicationWillTerminate被示範性地稱爲(所以這不是問題)。ApplicationWillTerminate NSURLSession可能嗎?

我的意圖是通知服務器該用戶現在正在離線。

但是,這不起作用..因爲我沒有收到我的後端POST。我試圖找出爲什麼這不起作用。或者即使它應該?根據蘋果文檔,這應該工作,如果它可以在5秒內執行..雖然我甚至沒有完成處理程序,所以它應該執行。任何幫助或建議將不勝感激。

我的實現如下(僅供參考)。

- (void)applicationWillTerminate:(UIApplication *)application { 

    NSMutableDictionary * gatherAllInputs = [[NSMutableDictionary alloc] initWithObjectsAndKeys: 
              @"[email protected], @"emailEntry", 
              @"False", @"isPersonAvailable", 
              nil]; 

    NSError *error; 
    NSData *gatherAllInputsJSON = [NSJSONSerialization dataWithJSONObject:gatherAllInputs options:0 error:&error]; 

    NSString* theDataSentToServer; 
    theDataSentToServer = [[NSString alloc] initWithData:gatherAllInputsJSON encoding:NSUTF8StringEncoding]; 

    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *postingSession = [NSURLSession sessionWithConfiguration:sessionConfiguration]; 

    NSURL *url = [NSURL URLWithString:@"https://blahblahblah.com/someblah"]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 

    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:[theDataSentToServer dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSURLSessionDataTask *postSomething = [postingSession dataTaskWithRequest:request]; 
    [postSomething resume]; 
    NSLog(@"Got here!"); //<-- THIS GETS OUTPUTTED.. SO I KNOW THIS CODE IS BEING CALLED! 

} 
+0

此問題不重複。 ApplicationWillTerminate絕對是所謂的!這不是問題的一部分。問題是爲什麼NSURLSession沒有完成其POST。 – user330739 2015-02-11 22:58:16

+0

好的,重新開放,對此感到抱歉。 – matt 2015-02-11 23:34:38

回答

1

一些事情可能會發生:

首先,蘋果說:「你的這個方法的實現具有大約五秒執行任何任務,並返回」。 Apple Docs

我強調「大概」,因爲把這5秒理所當然不是你通常想要做的事情。這種超時可能取決於許多因素,例如資源的整體可用性(受應用程序無法控制的細節(如其他應用程序正在運行)的影響)。其次,你說:「雖然我甚至沒有完成處理程序,所以它應該被執行」。

這意味着您正在執行同步呼叫,即呼叫前必須等待等待。你確定零到大約 5秒就足夠了這個電話嗎?我知道這聽起來像是太多時間了,但網絡可用性/可靠性/速度也是我們通常不應該視爲理所當然的事情。

你有沒有嘗試做別的事情,而不是網絡電話呢?例如寫一些用戶默認值?放一個計時器,並查看你真正得到了多少時間的任何變化。

相關問題