草庐IT

ios - GKTurnBasedEventHandler 委托(delegate)未收到任何消息

coder 2024-01-20 原文

我使用了 [[GKTurnBasedEventHandler sharedTurnBasedEventHandler] setDelegate:self]; 但我没有收到委托(delegate)调用。这在某一时刻起作用,我无法弄清楚我的生活发生了什么变化。

该应用程序已正确标记(在设备主屏幕上,它会显示一个标记,其中包含轮到我的游戏数量)。此外,使用 GKTurnBasedMatch loadMatchesWithCompletionHandler: 能够检测到何时轮到玩家(或不轮到玩家)。事实上,在所有其他可以想到的方面,GameCenter 似乎都运行得很好。我什至可以发送(和接受)挑战,但同样,不会调用委托(delegate)方法:不会调用任何 GKTurnBasedEventHandlerDelegate 方法(包括 handleTurnEventForMatch:handleInviteFromGameCenter : 等)

更奇怪的是:如果我完全退出应用程序并且轮到我了,我就看不到任何 GameCenter 通知。但是,我确实在我的应用程序上设置了角标(Badge)!如果我直接打开 GameCenter 应用程序本身,我也会看到轮到我了。因此,尽管服务器上的数据已正确更新,但即使是操作系统级别的通知也未收到......

我听说 GameCenter Sandbox 可能只是在通知传送方面不可靠……但我真的不能冒这个风险。我需要测试我的代码!

我尝试过的事情:

  1. 确保我在真实设备(没有模拟器)上进行测试。我已经在 4 台真实设备上进行了测试,包括 iPhones+iPads 和 iOS6+iOS7。
  2. 我每 60 秒执行一次 NSAssert([GKTurnBasedEventHandler sharedTurnBasedEventHandler].delegate == self 以确保委托(delegate)属性不会丢失(根据这个问题:handleTurnEventForMatch:didBecomeActive: callbacks only arriving some of the time)
  3. 仔细检查我是否在“设置”中为该应用启用了推送通知
  4. 检查 iTunesConnect 版本 是否与我在 info.plist 中的 CFBundleShortVersionString 完全相同(0.0.1 ) 并且 iTunesConnect 显示 GameCenter 为游戏“启用”。我什至还将 CFBundleVersion 设置为相同的值,以确保不会出现混淆。
  5. 在步骤 3 中使用版本 #s。我将它们分别设置为 1.0.01.00.1,等等。我还使用 NSLog 将它们打印出来,以确保它们已正确复制到应用程序中。
  6. 检查我是否正在使用从 developer.apple.com 下载的显式配置文件,并且 XCode 在 Capabilities 中的所有 GameCenter 步骤旁边显示复选标记。 (例如,我使用“teams”;我已经登录配置文件中心并创建了一个开发配置文件,下载了它,并将其明确设置为我的配置文件在 Debug模式的build设置中)。
  7. 明确请求推送通知权限。我能够成功检索(并使用) token ,因此 APN 服务似乎没有问题。
  8. 我也尝试过简单地……等待。我将调试器连接到轮到它的设备上。在回合结束后 10 分钟以上,没有代表被击中(我正在使用断点来确定这一点)。

更新 这个问题很有趣:Sandbox Game Center Turn Event Notifications Not Consistent 这让我尝试使用 [[GKLocalPlayer localPlayer] registerListener:self] 而不是 GKTurnBasedEventHandler 委托(delegate)方法。不幸的是,问题仍然没有解决。我什至尝试将最低版本的 SDK 设置为 7.0 进行编译(因为这是一个 7+ 功能添加)。

最佳答案

我目前认为 GameCenter 沙盒有问题,因为似乎很多人都遇到过问题。为了能够测试我的代码,我实际上编写了一些代码来轮询 GameCenter 并查找更改。

警告 这是愚蠢的。我只在 DEBUG 模式下启用它,这样我就可以测试我的 handleTurnEventForMatch 代码。也就是说……它可以解决这个问题。

此代码可以进入提供委托(delegate)方法的同一个类。您需要做一些明显的逻辑修改。您应该在游戏逻辑的适当位置调用 onMultiplayerGameStartedonEndedMultiplayerTurn

#if GAMEKIT_TURN_POLLING

NSMutableDictionary *_wasLocalPlayersTurnMap = nil;

- (void)pollGameCenter {
  if(!_wasLocalPlayersTurnMap) {
    _wasLocalPlayersTurnMap = [NSMutableDictionary new];
  }
  [AMGameData loadGames:^(NSArray *games) {
    NSInteger validGameCount = 0;
    for(AMGameData *gameData in games) {
      if(gameData.isSinglePlayer) {
        continue;
      }
      if(gameData.gameState != AMGameStatePlaying) {
        continue;
      }
      validGameCount++;
      if([_wasLocalPlayersTurnMap[gameData.name] boolValue]) {
        continue;
      }
      if(!gameData.isLocalPlayersTurn) {
        _wasLocalPlayersTurnMap[gameData.name] = @(NO);
        continue;
      }
      // Hey, it's now our turn!
      _wasLocalPlayersTurnMap[gameData.name] = @(YES);
      [self handleTurnEventForMatch:gameData.match didBecomeActive:NO];
    }
    if(validGameCount) {
      // Need to do this again later...
      [self delayedPollGameCenter];
    }
  }];
}

- (void)delayedPollGameCenter {
  [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(pollGameCenter) object:nil];
  [self performSelector:@selector(pollGameCenter) withObject:nil afterDelay:10];
}

- (void)onMultiplayerGameStarted {
  [self delayedPollGameCenter];
}

- (void)onEndedMultiplayerTurn:(AMGameData*)gameData {
  _wasLocalPlayersTurnMap[gameData.name] = @(NO);
  [self delayedPollGameCenter];
}

#else
- (void)onMultiplayerGameStarted{}
- (void)onEndedMultiplayerTurn:(AMGameData*)gameData {}
#endif

关于ios - GKTurnBasedEventHandler 委托(delegate)未收到任何消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20906784/

有关ios - GKTurnBasedEventHandler 委托(delegate)未收到任何消息的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  3. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  4. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  5. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  6. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  7. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  8. ruby - 使用 Ruby 通过 Outlook 发送消息的最简单方法是什么? - 2

    我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=

  9. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  10. Ruby - 如何将消息长度表示为 2 个二进制字节 - 2

    我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi

随机推荐