簡體   English   中英

iPhone應用程序生命周期中的最后一個功能是什么

[英]What is the last function in iPhone application lifecycle

在關閉我的應用程序之前,我必須從Web服務注銷用戶。 我找不到在應用程序終止之前調用的最后一個函數嗎?

-(void)LogoutUser
{    
    int userId = [[GlobalData sharedMySingleton] getUserId];

    NSString *soapMsg = 
    [NSString stringWithFormat:
     @"<?xml version=\"1.0\" encoding=\"utf-8\"?>...", userId
     ];

    NSURL *url = [NSURL URLWithString: @"http://....asmx"];     

    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];    
    NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMsg length]];

    [req addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];   
    [req addValue:@"http://..." forHTTPHeaderField:@"SOAPAction"];  
    [req addValue:msgLength forHTTPHeaderField:@"Content-Length"];   
    [req setHTTPMethod:@"POST"];
    [req setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]];

    conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];

    if (conn) 
    {
        webData = [[NSMutableData data] retain];
    }     

}

-(void) connection:(NSURLConnection *) connection didReceiveResponse:(NSURLResponse *) response 
{
    [webData setLength: 0];
}

-(void) connection:(NSURLConnection *) connection didReceiveData:(NSData *) data 
{
    [webData appendData:data];  
}

-(void) connection:(NSURLConnection *) connection didFailWithError:(NSError *) error 
{   
    [webData release];    
    [connection release];
}

-(void) connectionDidFinishLoading:(NSURLConnection *) connection 
{   
    NSString *theXML = [[NSString alloc] 
                        initWithBytes: [webData mutableBytes] 
                        length:[webData length] 
                        encoding:NSUTF8StringEncoding];    


    [theXML release];    

    [connection release];
    [webData release];   
}

您需要從兩個地方觸發注銷代碼,這兩個地方在UIApplicationDelegate協議參考文檔中都有詳細說明。

對於iOS 4之前的設備(並涵蓋其他情況),您應該使用:

- (void)applicationWillTerminate:(UIApplication *)application

正如蘋果所說:

對於不支持后台執行或與iOS 3.x或更早版本鏈接的應用程序,總是在用戶退出應用程序時調用此方法。 對於支持后台執行的應用程序,當用戶退出應用程序時通常不會調用此方法,因為在這種情況下,應用程序只是移至后台。 但是,在應用程序在后台運行(未掛起)並且系統出於某種原因需要終止它的情況下,可以調用此方法。

但是,您需要使用...

- (void)applicationDidEnterBackground:(UIApplication *)application

...在iOS 4或更高版本的設備上,如(再次來自Apple文檔):

在iOS 4.0及更高版本中,當用戶退出支持后台執行的應用程序時,將調用此方法而不是applicationWillTerminate:方法

就是說,無論以上哪種情況,您都極有可能希望在應用程序后台運行時注銷Web服務,並在其“喚醒”時重新登錄。 有關更多詳細信息,請參見上述applicationDidEnterBackground:方法和applicationWillEnterForeground:方法文檔。

- (void)applicationDidEnterBackground:(UIApplication *)application {
/*
 Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
 If your application supports background execution, called instead of applicationWillTerminate: when the user quits.
 */
}

這可能不是最后一個功能,但是。 您可以在此處注銷。

對於iOS 4.x下的典型應用程序,將在您的應用程序終止之前(在將來的某個未知時間)以及在應用程序未終止的其他時間調用applicationWillResignActive以及也許applicationDidEnterBackground。 但是,最好在此處注銷,因為您的應用可能永遠無法獲得更多的CPU運行時間。

如果您有未決的網絡活動(例如嘗試注銷),則可能要使用多任務調用beginBackgroundTaskWithExpirationHandler:在后台請求額外的時間來完成注銷過程,例如與所需的任何網絡回調進行握手。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM