好吧,我一直在尝试创建自己的GKSession对象,委托方法在控制台中给我一个错误,我还没有弄清楚如何修复.我想知道是否有人有任何建议或遇到过这个问题?*只是一个注释 - 变量peerStatus在我的代码中的其他地方定义.对等体可以被赋予"kServer"或"kClient"状态.我宁愿将每个定义为GKSessionModeServer或GKSessionModeClient,因为我已经读过,如果对等体在GKSessionModePeer中,则性能时间实际上较慢,因为它必须完成客户端和服务器的工作.
- (GKSession *)peerPickerController:(GKPeerPickerController *)picker sessionForConnectionType:(GKPeerPickerConnectionType)type {
if (peerStatus == kServer) {
GKSession *session = [[GKSession alloc] initWithSessionID:@"Josh_Land" displayName:nil sessionMode:GKSessionModeServer];
return [session autorelease];
}
else {
GKSession *session = [[GKSession alloc] initWithSessionID:@"Josh_Land" displayName:nil sessionMode:GKSessionModeClient];
return [session autorelease];
}
}
Run Code Online (Sandbox Code Playgroud)
整个错误代码是:
收听端口56386 2009-06-30 10:31:41.892 GKTank [17756:20b]***由于未捕获的异常'GKInvalidArgumentException'终止应用程序,原因:'必须提供具有GKSessionModePeer模式的vaild GKSession对象,或者在-peerPickerController:sessionForConnectionType:的实现中创建一个默认的GKSession对象返回'nil'.提供的对象是:发送0个数据包:rush(0个包0个字节):依赖(0个包0个字节):rtry(0个包0个字节):sack(0个包0个字节):当前加权平均值rtt(0 ms)会话模式:0'2009-06-30 10:31:41.893 GKTank [17756:20b] Stack:(807902715,2452446779,807986683,807986522,927035842,927037074,927038407,815223834,927038949,9245,8562,814709201,815110321, 815119058,815114270,814813151,814722763,814748641,839148405,807687520,8068683624,839142449,839142646,814752238)
我实施BlueTooth和Wifi基于聊天程序iPhone.出于连接目的,我正在使用GameKit.但由于一些特殊要求的应用,我无法使用默认值GKPeerPickerController.所以我改为创建了一个GKSession和GKSessionDelegate组合来检测对等体.他们找到对方后,可以聊天.
现在我已经测试了三个mac-minis使用的聊天功能simulator,一个模拟器和一个iPod,一个iPhone和一个Simulator.我可以在上述所有场景中聊天.但是一些如何相互检测iPhone并且iPod不会相互发现.
此外,我很好奇所有这些设备之间的连接类型.因为理论上GameKit支持两者,BlueTooth和WiFi.现在的问题是,GKPeerPickerController咱们之间的一个专门选择BlueTooth和WiFi,(可惜的执行WiFi不记录任何地方).这是好的,但对于自定义场景时,一个实现自己GKSession和GKSessionDelegate组合.当GKSession使用唯一init可用的方法创建Object时:
– initWithSessionID:displayName:sessionMode:
Run Code Online (Sandbox Code Playgroud)
这提供的唯一配置选项是,sessionMode但它只有三个选项
GKSessionModeServer,
GKSessionModeClient,
GKSessionModePeer,
Run Code Online (Sandbox Code Playgroud)
其中没有一个表示Bluetooth和之间的连接选择WiFi.
但我有残疾bluetooth的iPod,用它测试mac-mini它的工作,所以我想这是使用WiFi.同样在日志中我得到以下行:
DNSServiceRegister callback: Ref=4c3f3d0, Flags=2, ErrorType=0 …Run Code Online (Sandbox Code Playgroud) 我们可以使用GKSession和GKPeerPickerController通过蓝牙仅连接iPodtouch或iPhone吗?,或者我们可以连接其他蓝牙设备吗?
我想送一些NSData过Bluetooth通过GameKit.
虽然我已经GameKit设置好并且能够发送小消息,但我现在想要扩展并发送整个文件.
我一直在读你必须将大文件分成数据包然后单独发送它们.
所以我决定创建一个struct以便在另一端收到数据包时更容易解码数据包:
typedef struct {
const char *fileName;
NSData *contents;
int fileType;
int packetnumber;
int totalpackets;
} file_packet;
Run Code Online (Sandbox Code Playgroud)
但是,对于小文件(8KB或更少),我认为一个数据包就足够了.
所以对于一个数据包,我想我可以创建一个file_packet,设置它的属性,并通过-sendDataToAllPeers:withDataMode发送它:error:
NSData *fileData;
file_packet *packet = (file_packet *)malloc(sizeof(file_packet));
packet->fileName = [filename cStringUsingEncoding:NSASCIIStringEncoding];
packet->contents = [NSData dataWithContentsOfFile:selectedFilePath];
packet->packetnumber = 1;
packet->totalpackets = 1;
packet->fileType = 56; //txt document
fileData = [NSData dataWithBytes:(const void *)packet length:sizeof(file_packet)];
free(packet);
NSError *error = nil;
[self.connectionSession sendDataToAllPeers:fileData withDataMode:GKSendDataReliable error:&error];
if (error) {
NSLog(@"An error occurred: …Run Code Online (Sandbox Code Playgroud) 我想使用GameKit通过WiFi在两个设备之间建立连接.Apple的文档说
如果选择了Internet连接,则应用程序必须关闭对等选择器对话框并显示其自己的用户界面以完成连接.
这就是我做的
- (void)peerPickerController:(GKPeerPickerController *)picker didSelectConnectionType:(GKPeerPickerConnectionType)type
{
if (type == GKPeerPickerConnectionTypeOnline)
{
picker.delegate = nil;
[picker dismiss];
[picker autorelease];
[alert setTitle:@"\n\n\n"];
[alert setMessage:@"Looking for other iPads, iPhones or iPod touches..."];
[alert addButtonWithTitle:@"Cancel"];
UIActivityIndicatorView *progress = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(125, 50, 30, 30)];
progress.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
[alert addSubview:progress];
[progress startAnimating];
[alert show];
}
}
Run Code Online (Sandbox Code Playgroud)
好的,我已经展示了自己的界面.接下来呢?我如何连接?如何开始寻找同行?
我有一个名为currentMatch的GKTurnBasedMatch,我想知道如何获得在当前正在播放的播放器之后播放的播放器的名称.
谢谢!
使用Mac OS X 10.8.2和Xcode 4.5.2如果您创建一个新的Mac OS X Cocoa应用程序然后添加指向GameKit和StoreKit框架的链接,您会在应用程序启动时收到以下警告:
objc[64970]: Class CKClientDispatch is implemented in both
/System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/CommerceKit
and
/System/Library/Frameworks/StoreKit.framework/Versions/A/StoreKit.
One of the two will be used. Which one is undefined.
Run Code Online (Sandbox Code Playgroud)
任何人都知道为什么会发生这种情况,或者如何在不烦扰动态链接器的情况下链接到这两个框架?
我正在研究一个简单的回合制文字游戏,我很难搞清楚邀请是如何工作的.当用户A邀请用户B参加游戏时,我希望用户B能够在我的自定义匹配界面(即列出所有用户B的游戏的屏幕)中看到该游戏.如果用户B在被邀请参加游戏时点击通知,情况会很好,但如果用户B只是自己导航到应用程序,我仍然希望通过我自己的界面看到游戏.
每当出现这个匹配界面屏幕时,我都会[GKTurnBasedMatch loadMatchesWithCompletionHandler:]用来获取所有本地玩家的比赛.有了这个,我会假设用户B能够看到他被邀请参加的比赛,但这个新比赛没有出现.如果我通过该接受邀请GKTurnBasedMatchmakerViewController,则用户按预期进入游戏,但更令人费解的是,如果我打开我的GKTurnBasedMatchmakerViewController然后取消而不接受邀请,现在我的自定义匹配界面中会出现一个新的匹配,但它缺少用户A发送的匹配数据.
总而言之,我真的只是想知道如何GKTurnBasedMatch使用自定义界面正确显示和接受邀请(而不是必须使用GKTurnBasedMatchmakerViewController).谢谢!
在我们的iOS游戏中,我们使用Game Center来识别玩家并使用我们自己的服务器跨设备同步他们的数据.因为游戏中心识别玩家,我们需要知道他们是否经过身份验证,或者他们是否更改了身份验证等.我们有一个标题屏幕显示"正在初始化游戏中心...",直到认证调用返回,并且只有一次我们知道他们被认证为谁(如果有人)我们进入游戏.
但是,在非常少的时间内(实际上,我自己无法重现它),永远不会调用身份验证处理程序.几分钟后等待.游戏中心欢迎横幅也从不显示,因此不仅仅是我们的处理程序从未被调用过,但似乎确实没有身份验证状态.
到目前为止,我们实施了30秒的超时,如果我们没有从Game Center听到任何消息,我们认为身份验证状态没有改变,我们使用您保存的数据.那30秒的超时并不理想,所以我想知道当GC没有响应时是否有任何押韵或理由.
以下是从我们的App Delegate application: didFinishLaunchingWithOptions:方法调用的代码:
PlayerModel *playerModel = [PlayerModel sharedPlayerModel];
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
if ([localPlayer respondsToSelector:@selector(setAuthenticateHandler:)])
{
localPlayer.authenticateHandler = ^(UIViewController *gkViewController, NSError *error)
{
if (localPlayer.authenticated)
{
[playerModel loadFromGameCenter];
playerModel.hasGCStatus = TRUE;
[playerModel sync];
}
else if (gkViewController)
{
[viewController presentViewController:gkViewController animated:TRUE completion:nil];
}
else
{
NSLog(@"Could not authenticate with Game Center");
[playerModel unloadFromGameCenter];
playerModel.hasGCStatus = TRUE;
[playerModel sync];
}
};
}
else
{
[localPlayer authenticateWithCompletionHandler:^(NSError *error) {
if (localPlayer.authenticated)
{
[playerModel loadFromGameCenter]; …Run Code Online (Sandbox Code Playgroud) 我正在开发一个有很多成就的应用程序.出于可读性原因,在游戏中心中显示成就的顺序有些相关.随着应用程序的新版本的推出,我正在添加新的成就.现在,改变成就顺序的标准方法是在iTunes Connect界面中拖动它们,正如这个答案所暗示的那样.
然而,正如另一个问题所指出的那样,这并不总是有效,如果你尝试得到一条消息"Failed to update sort order. Please try again."(我从未成功过).作为关于"通用计算硬件和软件"的问题,上述问题被视为偏离主题.
那么,让我从编程的角度来重新解释这个问题:
gamekit ×10
ios ×5
iphone ×5
game-center ×3
objective-c ×3
bluetooth ×2
wifi ×2
achievements ×1
cocoa-touch ×1
gksession ×1
linker ×1
macos ×1
nsdata ×1
p2p ×1
storekit ×1
timeout ×1
warnings ×1