我如何回复GKTurnBasedExchange?间歇性地调用GKLocalPlayerListener委托receivedExchangeReplies

时间:2016-01-02 20:28:54

标签: ios game-center gkturnbasedmatch

有一些帖子讨论了Gamebox的推送通知在沙盒中是如何相当不可靠的。但是,沙盒对iOS 9进行了混淆,所以我不确定为什么我的Game Center推送通知是如此不可靠。

当我回复活动的交换时,很少收到发件人的通知。

[exchange replyWithLocalizableMessageKey:@"EXCHANGE_REPLY" arguments:@[] data:data completionHandler:^(NSError *error) {

            if (error)
            {
                NSLog(@"");
            }
        }];

在发件人设备上,如果我刷新匹配数据,我会看到待处理的回复。如果我处理回复,一切正常。

这种方法也是如此:

- (void)sendExchangeToParticipants:(NSArray<GKTurnBasedParticipant *> *)participants
                          data:(NSData *)data
         localizableMessageKey:(NSString *)key
                     arguments:(NSArray<NSString *> *)arguments
                       timeout:(NSTimeInterval)timeout
             completionHandler:(void(^__nullable)(GKTurnBasedExchange *exchange, NSError *error))completionHandler

此时,我认为我最好的选择是运行我自己的推送通知逻辑来触发更新匹配数据。我或者我已经知道发送提醒更可靠,但我相信这有限制。

更新

我尝试过只使用设备而不是模拟器。同样的问题。看起来这是一个众所周知的问题。 It's even noted in this book on page 766.

更新

发送提醒没有帮助。

更新

通常在回复交易时,我会从GameKit收到此错误。

The connection to service named com.apple.gamed was interrupted, but the message was sent over an additional proxy and therefore this proxy has become invalid.

1 个答案:

答案 0 :(得分:0)

直到 2020 年 10 月,由于 Apple 后端中的错误,交易所实际上从未按需要或指定的方式工作。然而现在,一位 Apple 工程师似乎暗示它已被修复——要求我验证它是否有效。我打算使用我的公共项目尽快完成(我只需要更新 Xcode):https://github.com/Gatada/TurnBasedGameFlow

更多细节

回合制交换依赖于在交换完成时通知回合持有者,因此回合持有者可以解决它(将其提交给 Game Center)。但是,此通知从未推送给轮次持有者。

由于这个错误,我们制作的游戏必须在交换完成后依赖回合持有者重新加载游戏,并且我们的代码必须优雅地处理由于游戏数据已过期而导致的回合提交失败-sync(由完成的交换引起)。

我在 2020 年 WWDC 期间与 Apple 进行了一对一的 Game Center 会话,在那里我用确凿的证据报告了这个问题(毕竟,这个错误自 2010 年以来就存在),这让 Apple 工程师信服。他们花了 3 个月的时间才回复我,我又花了 3 个月的时间才回复他们——呵呵,把我们带到了现在。