2011-04-09 43 views
2

在我的应用程序将要关闭之前,我必须从Web服务注销用户。我找不到在应用程序死掉之前调用的最后一个函数?iPhone应用程序生命周期中的最后一项功能

-(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]; 
} 
+0

你确定你不能吗?尝试查看您的应用程序委托。 – BoltClock 2011-04-09 07:59:07

+0

默认情况下iOS应用程序只是进入后台,即暂停。 – 2011-04-09 08:02:21

回答

6

有两个地方需要触发您的注销代码,这两个地方都在UIApplicationDelegate Protocol Reference文档中有详细说明。

对于前期的iOS 4设备(和覆盖等情况下),你应该使用:

- (void)applicationWillTerminate:(UIApplication *)application 

正如苹果所说的那样:

对于不支持 后台执行或者申请链接 针对iOS 3.x或更低版本,当用户 退出应用程序时,始终调用此方法 。对于支持后台 执行的 应用程序,此方法通常是在用户退出 应用程序时不调用该方法,因为应用程序 仅在该情况下移至后台。但是,在 应用程序在 后台(未挂起)中运行并且 系统需要终止某些 原因的情况下调用此方法的方法可能为 。

但是,你需要使用...

- (void)applicationDidEnterBackground:(UIApplication *)application 

...在iOS 4+的装置,如(再次从苹果文档):

在iOS 4.0及更高版本,此方法调用 而不是 applicationWillTerminate:方法 用户退出 支持后台执行的应用程序

也就是说,不管以上所有情况如何,当您的应用程序停止使用时,您最有可能要注销Web服务,并在“唤醒”时重新登录。有关更多详细信息,请参阅上述applicationDidEnterBackground:方法和applicationWillEnterForeground:方法文档。

+0

我有这个问题。我把代码从serviceDidEnterBackground中的服务注销。但它不能完成执行。我点按iPhone按钮,应用程序就会关闭。然后我双击iPhone按钮并关闭应用程序。但服务电话还没有结束。当我再次启动应用程序时,它完成了Web服务调用:( – 1110 2011-04-09 08:34:41

+0

@1110)您是否阅读过有关'applicationWillResignActive:'方法? – 2011-04-09 08:38:36

+0

是的我试图把Web服务调用也放在那里,但同样的问题:( – 1110 2011-04-09 08:44:09

0
- (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. 
*/ 
} 

这可能不是最后一个函数,但。你可以在这里注销。

+0

您可以在应用程序代理中找到此方法。 :) – 2011-04-09 07:59:51

+1

这不是当应用程序死亡。即使调用此应用程序,应用程序仍在运行。事实上,如果你阅读苹果提供的评论,它说“如果它稍后终止”,所以调用这意味着它还没有终止**但**。 – BoltClock 2011-04-09 08:00:26

+0

根据他的问题,他可以用这种方法注销。为什么downvote? – 2011-04-09 08:03:28

0

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

如果你已经挂起的网络活动,如想退出,您可能需要使用多任务调用beginBackgroundTaskWithExpirationHandler:要求多一点额外的时间在后台完成注销过程中,如与任何网络握手需要回调。

相关问题