Какая последняя функция в жизненном цикле приложения для iPhone? - PullRequest
2 голосов
/ 09 апреля 2011

Прежде чем мое приложение будет закрыто, я должен выйти из веб-службы. И я не могу найти самую последнюю функцию, которая вызывается до того, как приложение умрет?

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

Ответы [ 3 ]

6 голосов
/ 09 апреля 2011

Есть два места, из которых вам нужно будет запустить свой код выхода из системы, оба из которых подробно описаны в Справке по протоколу UIApplicationDelegate документации.

Для устройств до iOS 4 (и для покрытия других обстоятельств) вы должны использовать:

- (void)applicationWillTerminate:(UIApplication *)application

Как Apple говорит:

Для приложений, которые не поддерживают фоновое выполнение или связаны против iOS 3.x или более ранней метод всегда вызывается, когда пользователь выходит из приложения. За приложения, поддерживающие фон выполнение, этот метод обычно не вызывается, когда пользователь выходит из приложение, потому что приложение просто перемещается на задний план в этом дело. Однако этот метод может быть вызывается в ситуациях, когда приложение работает в фон (не приостановлено) и система должна прекратить его для некоторых причина.

Однако вам нужно использовать ...

- (void)applicationDidEnterBackground:(UIApplication *)application

... на устройствах iOS 4+, как (еще раз из документации Apple):

В iOS 4.0 и более поздних версиях этот метод называется вместо applicationWillTerminate: метод, когда пользователь выходит из приложения, которое поддерживает фоновое исполнение

Тем не менее, независимо от всего вышесказанного, вы, скорее всего, захотите выйти из веб-службы, когда ваше приложение установлено на заднем плане, и снова войти в систему, когда оно "проснулось". См. Вышеупомянутый метод applicationDidEnterBackground: и документацию метода applicationWillEnterForeground: для получения более подробной информации.

0 голосов
/ 09 апреля 2011

Для типичных приложений в iOS 4.x applicationWillResignActive и, возможно, applicationDidEnterBackground будут вызываться как до завершения работы вашего приложения (в какое-то неизвестное время в будущем), так и в других случаях, когда приложение не будет завершено. Однако было бы неплохо выйти из системы, поскольку ваше приложение может никогда не получить больше времени работы ЦП.

Если у вас есть ожидающая сетевая активность, например, попытка выхода из системы, вы можете использовать многозадачный вызов beginBackgroundTaskWithExpirationHandler: запросить немного дополнительного времени в фоновом режиме для завершения процесса выхода из системы, такого как квитирование с любыми сетевыми обратными вызовами требуется.

0 голосов
/ 09 апреля 2011
- (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.
 */
}

это может быть не последняя функция, но. Вы можете выйти из системы здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...