2014-10-09 4 views
0

iOS에 특정 데이터 ID를 기반으로 한 테이블의 데이터 행에 대해 10 초마다 폴링하는 NSTimer가 있습니다. PHP 스크립트를 통한 인수. 데이터 ID가 외부 소스에 의해 삽입 된 행의 데이터 ID와 일치하면 앱에 데이터 행의 정보가 포함 된 경고 상자가 표시되고 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 초마다 실행되지 않습니다.