iPhone应用程序生命周期中的最后一个function是什么?

在我的应用程序将被closures之前,我必须从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:方法

也就是说,不pipe上述情况如何,当您的应用程序停止运行时,您最有可能要退出Web服务,并在“唤醒”时重新login。 有关更多详细信息,请参阅上面提到的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. */ } 

这可能不是最后的function。 你可以在这里注销。

对于iOS 4.x下的典型应用程序,applicationWillResignActive和applicationDidEnterBackground将在应用程序终止之前(在将来某个未知的时间)被调用,在其他时候以及应用程序未被终止的时候都会被调用。 不过,在这里注销可能是一个好主意,因为你的应用程序可能永远不会得到任何进一步的CPU运行时间。

如果您有未决的networking活动(如尝试注销),则可能需要使用多任务处理调用beginBackgroundTaskWithExpirationHandler:在后台请求一些额外的时间来完成注销过程,例如与所需的任何networkingcallback握手。