У меня есть NSTimer в iOS, который каждые 10 секунд производит опрос сервера базы данных для строки данных в таблице на основе определенного идентификатора данных, который был отправлен как аргумент через PHP-скрипт. Если идентификатор данных совпадает с идентификатором данных строки, вставленной внешним источником, приложение отобразит окно предупреждения, содержащее информацию из строки данных, и NSTimer перестанет галочкой.Локальное уведомление серверу опроса в интервале (iOS 7)
Но это работает только во время работы приложения на переднем плане, и я хочу показать информационное сообщение как локальное уведомление, чтобы, несмотря на то, что пользователь вышел из приложения, он все равно будет опросить сервер, когда приложение будет также работает в фоновом режиме.
Я читал на многих сайтах, что служба локального оповещения и выборка фона - это правильный вид решения, но я не знаю, как его настроить, это очень запутанно. Поскольку я видел много примеров, в которых локальное уведомление используется для отправки напоминаний в определенные даты в календаре и запускает аварийные сигналы в определенное время и не столько для опроса на сервер.
Как настроить локальное уведомление, которое будет опроса на сервере с интервалом в 10 секунд, а затем отменить его, как только он получит правильный вид информации, который он отобразит последним?
Вот как я сделал до сих пор:
...
NSTimer *confirmedTimer;
int orderId = 1;
...
-(IBAction) sendButton: (id) sender {
confirmedTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(confirmedTick) userInfo:nil repeats:YES];
}
-(void)confirmedTick {
NSString *paramsConfirmed = [NSString stringWithFormat:@"order_id=%d", orderId];
NSData *postDataConfirmed = [paramsConfirmed dataUsingEncoding:NSUTF8StringEncoding];
NSURL *urlConfirmed = [NSURL URLWithString:@"http://www.serverexample.com/confirmed.php"];
NSMutableURLRequest *requestConfirmed = [NSMutableURLRequest requestWithURL:urlConfirmed];
[requestConfirmed setHTTPMethod:@"POST"];
[requestConfirmed addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[requestConfirmed setHTTPBody:postDataConfirmed];
[requestConfirmed setValue:[NSString stringWithFormat:@"%i", postDataConfirmed.length] forHTTPHeaderField:@"Content-Length"];
NSURLResponse *responseConfirmed;
NSError *errorConfirmed = nil;
NSData *receivedDataConfirmed = [NSURLConnection sendSynchronousRequest:requestConfirmed
returningResponse:&responseConfirmed
error:&errorConfirmed];
if(errorConfirmed) {
if([responseConfirmed isKindOfClass:[NSHTTPURLResponse class]]) {
NSHTTPURLResponse *httpResponseConfirmed = (NSHTTPURLResponse *)responseConfirmed;
return;
}
return;
}
NSString *responseStringConfirmed = [[NSString alloc] initWithData:receivedDataConfirmed
encoding:NSUTF8StringEncoding];
if ([responseStringConfirmed isEqualToString:@"true"]) {
return;
}
NSDictionary *jsonObjectConfirmed = [responseStringConfirmed objectFromJSONString];
NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:receivedDataConfirmed options:0 error:nil];
NSArray *confirmedArray = [jsonDictionary objectForKey:@"confirmed_table"];
if([confirmedArray count] > 0)
{
[confirmedTimer invalidate];
NSString *confirmedMessage = @"";
for(NSDictionary *confirmed in confirmedArray)
{
confirmedMessage = [confirmedMessage stringByAppendingString:[NSString stringWithFormat:@"confirmed_id: %@\n", [NSNumber numberWithInt:[[confirmed objectForKey:@"confirmed_id"] intValue]]]];
confirmedMessage = [confirmedMessage stringByAppendingString:[NSString stringWithFormat:@"order_id: %@\n", [NSNumber numberWithInt:[[confirmed objectForKey:@"order_id"] intValue]]]];
confirmedMessage = [confirmedMessage stringByAppendingString:[NSString stringWithFormat:@"Information: %@", [confirmed objectForKey:@"information"]]];
}
UIAlertView *confirmedAlert = [[UIAlertView alloc]
initWithTitle:@"Confirmation"
message:confirmedMessage
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[confirmedAlert show];
[confirmedAlert release];
}
}
У вас есть это немного назад. Местное уведомление не проверяет сервер. Скорее вы реализуете фоновый выбор, а затем публикуете локальное уведомление, если фоновая выборка обнаруживает соответствующие данные. Вот учебник по фоновой выборке - http://www.appcoda.com/ios7-background-fetch-programming/. Обратите внимание, что фоновый выбор не будет выполняться каждые 10 секунд. – Paulw11
Спасибо за вашу помощь! Я выполнил инструкции по ссылке, когда вы отправили, и я сделал реализацию в соответствии с вашей записью, сделав фоновое извлечение и разместив локальное уведомление для соответствующих данных. Он работает точно так, как я и хотел :) – john13th