后台提取和本地通知

时间:2016-06-03 06:09:06

标签: ios objective-c nsurlconnection uilocalnotification background-fetch

在我的应用中,我计划使用本地通知而不是推送通知。我需要检查事务更新是否可用,如果是,则只需通过本地通知通知用户。我已完成以下步骤。

  1. didFinishLaunchingWithOptions中,设置抓取间隔[[UIApplication sharedApplication]setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum]
  2. -(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  3. >使用我的请求数据添加了POST请求的代码,如下所示:

    NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];
    
    if(conn) {
        completionHandler(UIBackgroundFetchResultNewData);
    }
     else {
        completionHandler(UIBackgroundFetchResultFailed);
    }
    
    1. 在响应解析后,比较是否存在任何更新,如果有更新,则使用以下代码显示通知。

      UILocalNotification* localNotification = [[UILocalNotification alloc] init]; localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
      localNotification.timeZone = [NSTimeZone defaultTimeZone];
      localNotification.alertTitle = @"SIB Mirror";
      localNotification.alertBody = @"You have a new transaction. Go to e-Statements to view it.";
      localNotification.timeZone = [NSTimeZone defaultTimeZone];
      [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
      
    2. 问题是大多数时候,当手机被锁定时,会收到错误消息 >错误域= NSURLErrorDomain代码= -1005“网络连接丢失。”

      因此没有显示通知。但是当我将Phone直接连接到Phone并在调试模式下启用后台同步时,每件事都能正常工作。

      请指导我一个简单的方法来做这件事或纠正我,如果我做错了什么。

      谢谢,

      移动开发者。

3 个答案:

答案 0 :(得分:3)

这部分代码

NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];

if(conn) {
    completionHandler(UIBackgroundFetchResultNewData);
}
else {
    completionHandler(UIBackgroundFetchResultFailed);
}

说,创建一个连接来获取一些数据,无论创建这个实例发生什么,都要完成后台处理。所以iOS会按照您的要求执行并停止应用。

如果无法创建连接,则确定失败。但是,如果连接已创建,则在您有响应(数据或错误)要处理...

之前,不应该调用完成

答案 1 :(得分:1)

请尝试以下代码:

NSURLResponse * response = nil;
            NSError * error = nil;
            NSData * data = [NSURLConnection sendSynchronousRequest:request
                                                  returningResponse:&response
                                                              error:&error];

if (error == nil)
{
 // Parse data here
  completionHandler(UIBackgroundFetchResultNewData);
}
else {
  completionHandler(UIBackgroundFetchResultFailed);

}

答案 2 :(得分:0)

  

尝试使用完成处理程序的POST请求。