#iphone #objective-c #ios #ipad
#iPhone #objective-c #iOS #iPad
Вопрос:
Перед закрытием моего приложения я должен вывести пользователя из веб-службы. И я не могу найти самую последнюю функцию, которая вызывается перед завершением работы приложения?
-(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];
}
Комментарии:
1. Вы уверены, что не можете? Попробуйте посмотреть в вашем делегате приложения.
2. По умолчанию приложения iOS просто переходят в фоновый режим, т. е. приостанавливаются.
Ответ №1:
Есть два места, из которых вам нужно будет запустить код выхода из системы, оба из которых подробно описаны в справочной документации по протоколу UIApplicationDelegate.
Для устройств, выпущенных до iOS 4 (и для учета других обстоятельств), вы должны использовать:
- (void)applicationWillTerminate:(UIApplication *)application
Как выразилась Apple:
Для приложений, которые не поддерживают фоновое выполнение или связаны с iOS 3.x или более ранней версией, этот метод всегда вызывается, когда пользователь завершает работу приложения. Для приложений, поддерживающих фоновое выполнение, этот метод обычно не вызывается, когда пользователь завершает работу приложения, поскольку в этом случае приложение просто переходит в фоновый режим. Однако этот метод может вызываться в ситуациях, когда приложение работает в фоновом режиме (не приостановлено) и системе по какой-либо причине необходимо завершить его.
Однако вам нужно будет использовать…
- (void)applicationDidEnterBackground:(UIApplication *)application
…на устройствах iOS 4 , как (опять же из документов Apple):
В iOS 4.0 и более поздних версиях этот метод вызывается вместо applicationWillTerminate: метода, когда пользователь завершает работу приложения, поддерживающего фоновое выполнение
Тем не менее, независимо от всего вышесказанного, вы, скорее всего, захотите выйти из веб-службы, когда ваше приложение находится в фоновом режиме, и снова войти в систему, когда оно также «проснулось». Смотрите вышеупомянутый applicationDidEnterBackground:
метод и applicationWillEnterForeground:
документацию по методу для получения более подробной информации.
Комментарии:
1. У меня с этим возникла некоторая проблема. Я поместил код, который выводит пользователя из службы, в applicationDidEnterBackground. Но она не завершает выполнение. Я нажимаю кнопку iPhone, и приложение отключается. Затем я дважды нажимаю кнопку iPhone и закрываю приложение. Но вызов службы не завершен. Когда я снова запускаю приложение, оно завершает вызов веб-службы: (
2. @1110 Вы читали об этом
applicationWillResignActive:
методе?3. Да, я пытался поместить туда вызов веб-службы, но снова та же проблема: (
4. @1110 Если это так, то вам, возможно, не повезло. Как вы вызываете веб-службу? (Асинхронно или?)
5. @1110 Хм .. жаль, что в этом случае вы можете использовать подход «запустить и забыть», поскольку настройка NSURLConnection и связанных делегатов, вероятно, является последним, что вы хотите сделать. Тем не менее, все это довольно далеко уходит от вашего первоначального вопроса, на который был дан ответ выше. У меня возникло бы искушение создать новый раздел, специально посвященный тому, как лучше всего быстро закрыть веб-службу.
Ответ №2:
- (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.
*/
}
возможно, это не последняя функция, но. вы можете выполнить выход из системы здесь.
Комментарии:
1. вы можете найти этот метод в app delegate . 🙂
2. Это не значит, что приложение умирает. Приложение все еще работает, даже когда это вызывается. На самом деле, если вы прочитаете комментарий, предоставленный Apple, там говорится «на случай, если она будет завершена позже», поэтому вызов этой функции означает, что она еще не завершена.
3. согласно его вопросу, он может выполнить выход из системы этим методом. почему понижающий голос?
4. Потому что это не «последняя функция в жизненном цикле приложения iPhone».
5. @BoltClock он спрашивает, прежде чем мое приложение будет закрыто, я должен вывести пользователя из веб-службы. И я не могу найти самую последнюю функцию
Ответ №3:
Для обычных приложений под управлением iOS 4.x applicationWillResignActive и, возможно, applicationDidEnterBackground будут вызываться как перед завершением работы вашего приложения (в неизвестное время в будущем), так и в другое время, когда приложение не завершается. Однако, возможно, было бы неплохо выйти из системы здесь, поскольку ваше приложение может никогда не получить дополнительного времени работы процессора.
Если у вас есть незавершенные сетевые действия, такие как попытка выхода из системы, вы можете захотеть использовать многозадачный вызов beginBackgroundTaskWithExpirationHandler: запросить немного дополнительного времени в фоновом режиме для завершения процесса выхода из системы, такого как установление связи с любыми требуемыми сетевыми обратными вызовами.