繁体   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