我使用了 [[GKTurnBasedEventHandler sharedTurnBasedEventHandler] setDelegate:self]; 但我没有收到委托(delegate)调用。这在某一时刻起作用,我无法弄清楚我的生活发生了什么变化。
该应用程序已正确标记(在设备主屏幕上,它会显示一个标记,其中包含轮到我的游戏数量)。此外,使用 GKTurnBasedMatch loadMatchesWithCompletionHandler: 能够检测到何时轮到玩家(或不轮到玩家)。事实上,在所有其他可以想到的方面,GameCenter 似乎都运行得很好。我什至可以发送(和接受)挑战,但同样,不会调用委托(delegate)方法:不会调用任何 GKTurnBasedEventHandlerDelegate 方法(包括 handleTurnEventForMatch:、handleInviteFromGameCenter : 等)
更奇怪的是:如果我完全退出应用程序并且轮到我了,我就看不到任何 GameCenter 通知。但是,我确实在我的应用程序上设置了角标(Badge)!如果我直接打开 GameCenter 应用程序本身,我也会看到轮到我了。因此,尽管服务器上的数据已正确更新,但即使是操作系统级别的通知也未收到......
我听说 GameCenter Sandbox 可能只是在通知传送方面不可靠……但我真的不能冒这个风险。我需要测试我的代码!
我尝试过的事情:
NSAssert([GKTurnBasedEventHandler sharedTurnBasedEventHandler].delegate == self 以确保委托(delegate)属性不会丢失(根据这个问题:handleTurnEventForMatch:didBecomeActive: callbacks only arriving some of the time)版本 是否与我在 info.plist 中的 CFBundleShortVersionString 完全相同(0.0.1 ) 并且 iTunesConnect 显示 GameCenter 为游戏“启用”。我什至还将 CFBundleVersion 设置为相同的值,以确保不会出现混淆。1.0.0 和 1.0 和 0.1,等等。我还使用 NSLog 将它们打印出来,以确保它们已正确复制到应用程序中。developer.apple.com 下载的显式配置文件,并且 XCode 在 Capabilities 中的所有 GameCenter 步骤旁边显示复选标记。 (例如,我不使用“teams”;我已经登录配置文件中心并创建了一个开发配置文件,下载了它,并将其明确设置为我的配置文件在 Debug模式的build设置中)。更新
这个问题很有趣:Sandbox Game Center Turn Event Notifications Not Consistent
这让我尝试使用 [[GKLocalPlayer localPlayer] registerListener:self] 而不是 GKTurnBasedEventHandler 委托(delegate)方法。不幸的是,问题仍然没有解决。我什至尝试将最低版本的 SDK 设置为 7.0 进行编译(因为这是一个 7+ 功能添加)。
最佳答案
我目前认为 GameCenter 沙盒有问题,因为似乎很多人都遇到过问题。为了能够测试我的代码,我实际上编写了一些代码来轮询 GameCenter 并查找更改。
警告 这是愚蠢的。我只在 DEBUG 模式下启用它,这样我就可以测试我的 handleTurnEventForMatch 代码。也就是说……它可以解决这个问题。
此代码可以进入提供委托(delegate)方法的同一个类。您需要做一些明显的逻辑修改。您应该在游戏逻辑的适当位置调用 onMultiplayerGameStarted 和 onEndedMultiplayerTurn。
#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/
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下
我正在处理旧代码的一部分。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_
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
简而言之错误: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
我的工作要求我为某些测试自动生成电子邮件。我一直在四处寻找,但未能找到可以快速实现的合理解决方案。它需要在outlook而不是其他邮件服务器中,因为我们有一些奇怪的身份验证规则,我们需要保存草稿而不是仅仅发送邮件的选项。显然win32ole可以做到这一点,但我找不到任何相当简单的例子。 最佳答案 假设存储了Outlook凭据并且您设置为自动登录到Outlook,WIN32OLE可以很好地完成此操作:require'win32ole'outlook=WIN32OLE.new('Outlook.Application')message=
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:
我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi