2014-10-09 73 views
0

我在iOS中有一个NSTimer,它根据某个数据ID每隔10秒轮询数据库中的某个数据行,通过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 2014-10-09 01:34:58

+0

感谢您的帮助!我按照您提交的链接上的指示进行操作,并根据您的帖子进行实施,通过后台提取并发布相关数据的本地通知。它的工作原理完全按照我的意愿:) – john13th 2014-10-16 23:24:13

回答

1

你稍微向后。本地通知不检查服务器。相反,如果后台获取检测到相关数据,则实施后台提取并发布本地通知。有一个很好的背景获取教程here

请注意,后台提取将不会每10秒执行一次