iOS/苹果 watch : iPhone app network request callback blocks not triggered when app is in background

标签 ios objective-c afnetworking watchkit apple-watch

我的 Apple Watch 应用程序向配套的 iPhone 应用程序发送消息。在主应用程序的 handleWatchKitExtensionRequest 中,我向服务器发送请求:

 - (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply {
    if ([[userInfo objectForKey:@"request"] isEqualToString:@"getPendingChallenge"]) {
        [MyClient getPendingNotifications:someId withDomain:host withSuccessBlock:^(id responseObject) {
            // process responseObject
            ...
            reply(response);
            return;
        } withFailureBlock:^(NSError *error, NSString *responseString) {
            // error handling
            return;
        }];
    }
}
上面的

getPendingNotifications 只是使用 AFNetworking 的常规网络 GET 请求。

当应用程序处于事件状态时,一切正常。因为此网络请求用于填充我的 Apple Watch 上的 UI,所以我不希望主应用处于事件状态。但是,当 iPhone 上的主应用程序在后台时,我可以看到发送的网络请求,但是上面代码中的 withSuccessBlockwithFailureBlock 回调 block 永远不会被触发.

手机应用程序可以在后台模式下接收网络请求响应吗?如果是这样,我做错了什么?

最佳答案

我在网上找到了适合我的解决方案,Brian Gilham 的帖子 ( http://www.fiveminutewatchkit.com/blog/2015/3/11/one-weird-trick-to-fix-openparentapplicationreply)。

这是适合我的代码。

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply {
    // There is a chance that the iOS app gets killed if it's in the background
    // before it has a chance to reply to Apple Watch.
    // The solution is to have the app respond to the request asap, then complete other tasks.
    // The following code begins – and ends, after two seconds – an empty background task right at the beginning of this delegate method
    // Then we kick off a background task for the real work
    // For more details see http://www.fiveminutewatchkit.com/blog/2015/3/11/one-weird-trick-to-fix-openparentapplicationreply

    __block UIBackgroundTaskIdentifier bogusWorkaroundTask;
    bogusWorkaroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:bogusWorkaroundTask];
    }];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [[UIApplication sharedApplication] endBackgroundTask:bogusWorkaroundTask];
    });

    __block UIBackgroundTaskIdentifier realBackgroundTask;
    realBackgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        reply(nil);
        [[UIApplication sharedApplication] endBackgroundTask:realBackgroundTask];
    }];

    if ([[userInfo objectForKey:@"request"] isEqualToString:@"getPendingChallenge"]) {
        [self handleWatchKitGetPendingChallengeRequest:reply];
    }

    [[UIApplication sharedApplication] endBackgroundTask:realBackgroundTask];
}

- (void)handleWatchKitGetPendingChallengeRequest:(void (^)(NSDictionary *))reply {
    ...
    [MyClient getPendingNotifications:someId withDomain:host withSuccessBlock:^(id responseObject) {
        // process responseObject
        reply(response);
        return;
    } withFailureBlock:^(NSError *error, NSString *responseString) {
        // error handling
        reply(nil);
        return;
    }];
}

关于iOS/苹果 watch : iPhone app network request callback blocks not triggered when app is in background,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30549673/

相关文章:

ios - cocoapods:遇到意外的版本目录。我该如何解决?

ios - 在 Sprite Kit 场景中隐藏 iAd

ios - 如何在 AFNetworking 2.0 中使用 Progress 参数

ios - 退出 View Controller 后不要调用回调 block

php - 使用 AFNetworking 快速上传多个图像

ios - dyld : Library not loaded: code signature invalid

ios - 如何向 UILabel 添加三角形,使其看起来像工具提示?

objective-c - 如何在 Swift 中将 Int32 写入 NSOutputStream

ios - 无法在以编程方式创建的自定义 View 中更改 UILabel 文本值

iOS清空请求队列