2016-06-30 26 views
0
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 
    //call 2 web service here. 
    [self jsonParser:jsonData]; 
    completionHandler(UIBackgroundFetchResultNewData); 
} 

我如下后台远程可执行通知Web服务调用不起作用?

-(void)jsonParser:(NSData *)data 
{ 
    //[downloader downloadXMLContentsFromURL:actualURL withXML:encrypted]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:actualURL] 
                   cachePolicy:NSURLRequestUseProtocolCachePolicy 
                  timeoutInterval:HTTP_REQUEST_TIME_OUT]; 
    [request setHTTPMethod:@"POST"]; 

    NSString *encodedXML = [encrypted urlEncodeUsingEncoding:NSUTF8StringEncoding]; 
    NSString *params = [NSString stringWithFormat:@"%@=%@", REQUEST_PARAMETER_NAME, encodedXML]; 
    [request setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
    { 
     NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error:nil]; 
    }]; 
    [postDataTask resume]; 
    //Here call to other service not shown 
} 

我已启用“背景提取”从功能也是“远程通知”称这种方法

我是否需要实现这个方法?

- (void)application:(UIApplication *)application performFetchWithCompletionHandler: (void (^)(UIBackgroundFetchResult))completionHandler 

这个工作正常,当应用程序处于活动状态。但不工作的应用程序是在背景和Closed.same时间,当我打开应用程序它工作正常。我想在后台运行服务时,应用程序关闭。如何解决这个问题?任何帮助将不胜感激。

回答

1

您必须启用后台提取服务,因此您需要设置MinimumBackgroundFetchInterval。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 
    [application setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum]; 
    return YES; 
} 

和实现这样的公共方法实现

-(void)jsonParser:(NSData *)data Completion: (void (^)(UIBackgroundFetchResult))completionHandler 
{ 
    //[downloader downloadXMLContentsFromURL:actualURL withXML:encrypted]; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:actualURL] 
                  cachePolicy:NSURLRequestUseProtocolCachePolicy 
                 timeoutInterval:HTTP_REQUEST_TIME_OUT]; 
    [request setHTTPMethod:@"POST"]; 

    NSString *encodedXML = [encrypted urlEncodeUsingEncoding:NSUTF8StringEncoding]; 
    NSString *params = [NSString stringWithFormat:@"%@=%@", REQUEST_PARAMETER_NAME, encodedXML]; 
    [request setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
    { 
     NSError *localError = nil; 
     NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error:&localError]; 
     if (localError != nil) { 
      // handle your data here 
      completionHandler(UIBackgroundFetchResultNewData); 
      NSLog(@"New data was fetched."); 
     }else{ 
      completionHandler(UIBackgroundFetchResultFailed); 
      NSLog(@"Failed to fetch new data."); 
     } 
    }]; 
    [postDataTask resume]; 
    //Here call to other service not shown 
} 

的方法和实现方法是这样

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 
    NSDate *fetchStart = [NSDate date]; 

    [self jsonParser:jsonData Completion:^(UIBackgroundFetchResult result){ 

     NSDate *fetchEnd = [NSDate date]; 
     NSTimeInterval timeElapsed = [fetchEnd timeIntervalSinceDate:fetchStart]; 
     NSLog(@"Background Fetch Duration: %f seconds", timeElapsed); 
    }]; 
} 

我希望这会帮助你,请检查此链接http://www.appcoda.com/ios7-background-fetch-programming/

+0

像魅力工作..感谢您的答案。 –

相关问题