繁体   English   中英

每隔一段时间就向轮询服务器发送本地通知(iOS 7)

[英]Local notification to poll server at interval (iOS 7)

我在iOS中有一个NSTimer,它每隔10秒就会轮询数据库服务器以基于某个数据ID来查询表中的数据行,该数据ID已作为参数通过PHP脚本发送。 如果数据ID与外部源插入的行的数据ID匹配,则应用程序将显示一个警告框,其中包含来自数据行的信息,并且NSTimer将停止计时。

但这仅在应用程序在前台运行时起作用,并且我希望将信息消息显示为本地通知,这样,即使用户退出了应用程序,当应用程序在后台运行时,它仍会轮询服务器也一样

我在许多站点上都读过,本地通知服务和后台获取是正确的解决方案,但是我真的不知道如何设置它,这非常令人困惑。 因为我看过很多示例,其中使用本地通知在日历上的特定日期发送提醒并在特定时间触发警报,而不是轮询服务器。

如何设置本地通知,该通知将在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];
}

}

您将其稍微向后移动。 本地通知不会检查服务器。 而是实现后台获取,然后在后台获取检测到相关数据时发布本地通知。 有后台获取一个很好的教程在这里

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM