【问题标题】:facebook ios background request fails silentlyfacebook ios后台请求静默失败
【发布时间】:2014-04-13 19:12:30
【问题描述】:

我想在应用处于后台时执行图形 API 调用。

我有一个方法可以执行以下操作(我将只包括相关部分):

- (void) facebookFetch
{
    NSString* query = @"<my_query">;
    NSDictionary *queryParam = @{ @"q": query };
    [FBSettings setLoggingBehavior:[NSSet setWithObjects:
                              FBLoggingBehaviorFBRequests,
                              nil]];
    // Make the API request that uses FQL
    [FBRequestConnection startWithGraphPath:@"/fql"
                           parameters:queryParam
                           HTTPMethod:@"GET"
                    completionHandler:^(FBRequestConnection *connection,
                                        id result,
                                        NSError *error) {
                      if (error) {
                        NSLog(@"Error: %@", [error localizedDescription]);
                      } else {
                        NSLog(@"Result: %@", result);
                      }
                    }];

}

我在这里得到的是,如果我在应用程序处于前台时调用此函数,我会得到响应。

现在,问题是我需要在后台调用这个函数,所以我实现了以下函数:

/** Background task **/
-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"####### background task!");

    if (![FBSession activeSession].isOpen) {
      NSLog(@"fbsession is NOT open!");
    } else {
      NSLog(@"fbsession is open!");
      [self facebookFetch];
    }

    completionHandler(UIBackgroundFetchResultNewData);

}

我得到“fbsession 已打开!”消息,所以我正确输入了相关代码,但是我没有收到任何响应。

如您所见,我记录了请求,这是我在这两种情况下所拥有的

URL:    https://graph.facebook.com//fql?sdk=ios&access_token=ACCESS_TOKEN_REMOVED&q=<my_query>&migration_bundle=fbsdk%3A20131212&format=json
Method: GET
UserAgent:  FBiOSSDK.3.13.1
MIME:   multipart/form-data; boundary=3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f

但正如我之前告诉你的,在后台情况下我没有收到回复。

有什么帮助吗?

【问题讨论】:

    标签: ios objective-c facebook


    【解决方案1】:

    您需要在 facebookFetch 的完成块内调用 completionHandler(UIBackgroundFetchResultNewData);

    - (void) facebookFetch:(void (^)(UIBackgroundFetchResult))backgroundCompletion
    {
        NSString* query = @"<my_query">;
        NSDictionary *queryParam = @{ @"q": query };
        [FBSettings setLoggingBehavior:[NSSet setWithObjects:
                                  FBLoggingBehaviorFBRequests,
                                  nil]];
        // Make the API request that uses FQL
        [FBRequestConnection startWithGraphPath:@"/fql"
                               parameters:queryParam
                               HTTPMethod:@"GET"
                        completionHandler:^(FBRequestConnection *connection,
                                            id result,
                                            NSError *error) {
                          if (error) {
                            NSLog(@"Error: %@", [error localizedDescription]);
                          } else {
                            NSLog(@"Result: %@", result);
                          }
    
                          if (backgroundCompletion) {
                              backgroundCompletion(UIBackgroundFetchResultNewData);
                          }
                        }];
    
    }
    
    /** Background task **/
    -(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    {
        NSLog(@"####### background task!");
    
        if (![FBSession activeSession].isOpen) {
          NSLog(@"fbsession is NOT open!");
        } else {
          NSLog(@"fbsession is open!");
          [self facebookFetch:completionHandler];
        }
    

    }

    您需要更新对facebookFetch: 的任何其他调用,并且可以传入NULL(或nil)。

    【讨论】:

    • 谢谢,我试过但没有成功。事实上,我认为我从未在 completionHandler 中输入这段代码,所以我没有看到任何“错误:”或“结果:”消息,所以我没有到达 if (backgroundCompletion) 部分
    • FBRequestConnection startWithGraphPath: 通常需要多长时间?你有 30 秒的时间在 -application:performFetchWithCompletionHandler: 内做某事
    • 速度相当快,从我调用相同代码的日志中:请求:2014-04-13 14:34:48.547 FriendsMonitor[4774:70b] FBSDKLog: Request &lt;#1119&gt;: URL: https://graph.facebook.com/ 回复:2014-04-13 14:34:49.596 FriendsMonitor[4774:70b] FBSDKLog: Response &lt;#1119&gt; Duration: 1049 msec Size: 4 kB Response Body:
    • 您是否为应用程序启用了后台提取功能?见developer.apple.com/library/ios/documentation/iPhone/Conceptual/…
    • 是的,实际上调用了“background”方法,只是Facebook请求没有返回结果。我读到这可能是由于线程问题而发生的,但在这种情况下,我不知道如何处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多