3

有一些帖子讨论了 Game Center 的推送通知在沙盒中是如何相当不可靠的。但是,沙盒被 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

在这一点上,我认为我最好的选择是运行我自己的推送通知逻辑来触发更新匹配数据。那或者我已经读过发送提醒更可靠,尽管我相信这有限制。

更新

我试过只使用设备而不是模拟器。同样的问题。看起来这是一个众所周知的问题。本书第 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.
4

1 回答 1

0

由于 Apple 后端存在错误,Exchanges 直到 2020 年 10 月才真正按照需要或指定的方式工作。然而现在,一位 Apple 工程师似乎建议它已经修复 - 要求我验证它是否有效。我打算使用我的公共项目尽快完成(我只需要更新 Xcode):https ://github.com/Gatada/TurnBasedGameFlow

更多细节

基于回合的交换依赖于在交换完成时通知回合持有者,因此回合持有者可以解决它(提交给 Game Center)。然而,这个通知从未被推送给轮到持有者。

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

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

于 2021-01-12T15:26:54.987 回答