2014-10-09 2 views
0

У меня есть 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]; 
} 

} 
+0

У вас есть это немного назад. Местное уведомление не проверяет сервер. Скорее вы реализуете фоновый выбор, а затем публикуете локальное уведомление, если фоновая выборка обнаруживает соответствующие данные. Вот учебник по фоновой выборке - http://www.appcoda.com/ios7-background-fetch-programming/. Обратите внимание, что фоновый выбор не будет выполняться каждые 10 секунд. – Paulw11

+0

Спасибо за вашу помощь! Я выполнил инструкции по ссылке, когда вы отправили, и я сделал реализацию в соответствии с вашей записью, сделав фоновое извлечение и разместив локальное уведомление для соответствующих данных. Он работает точно так, как я и хотел :) – john13th

ответ

1

Вы его немного назад. Местное уведомление не проверяет сервер. Скорее вы реализуете фоновый выбор, а затем публикуете локальное уведомление, если фоновая выборка обнаруживает соответствующие данные. Существует хороший учебник по фоновой выборке here.

Обратите внимание, что фоновый выбор не будет выполняться каждые 10 секунд