gamecenter peer - to -peer

iOS GameCenter P2P

要想使用GameCenterP2P对战功能,需要了解GKSession详见

https://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKSession_Class/Reference/Reference.html

GKSession可以创建和管理移动网络蓝牙或者本地wifi。

讲你的app跑在多个设备上,并设置每个设备都可以连网或者采用蓝牙,然后交互,GKSession提供简单强大的多人在线方式。更多的,sessions提供所有应用程序必要的交互机制。

Bluetooth网络在早起的iphone 和第一代ipod touch上不支持,且不支持模拟器。

当你开发P2P应用程序的时候,你可以实现自己的用户接口来显示其他通过这个session发现的用户,或者你可以使用GKPeerPickerController对象来显示session配置的标准用户接口。

说明:本文档讨论的是点对点(peer-to peer )连接类 的提供的基础架构。不包含网络游戏和应用设计与实现。

点对点连接设备的需求

如果你的应用程序需要点对点功能,你需要确保只有设备支持这个功能的用户才可以下载购买你的APP.为了支持peer –to peer 你需要添加 peer-to-peer key 到你的应用程序的 Info.plist文件中。

Sessions

当会话建立后,用户可以找到对方,他们都是通过连接网络。应用程序通过一个连接会话 来和其他设备交互数据。应用程序提供一个delegate 来处理网络请求 ,处理其他设备发来的数据。

Peers

iOS 设备基于 ad-hoc 无线网络 识别peers。一个peer 对应一个session对象运行在应用程序内。你需要确保每个peer 对应的唯一peer ID 来当前用户在网络上的唯一标识,同其他peers 进行交互。举个例子 如果一个peer 知道其他peer 的ID ,它可以通过调用session 对象的 displayNameFor Peer函数 传递这个peerID,来查找user-readable name 。

其他peers 可以通过网络发现与本地session相关的 其他peers 各种状态。Peers 可以在ad-hoc 网络中appear或者disappear ,或者退出连接这个session.应用程序实现delegate 的session:peer:didChangeState,当peers 改变他们状态的时候,可以进行相应处理。

Discovering Othre Peers

每个session 实现它自己指定类型的服务。服务可能是 特定的游戏 或者 像交换business cards 的特征。你需要决定你的应用程序服务类型和 peers之间的数据交互方式。

Sessions 通过会话模式(是session初始化的时候设置) 在网络上获取其他peers 。你的应用程序可以将sssion 配置成一个服务,在网络上通过广播一个服务类型。客户端可以将自己广播到网络上,一个peer 也可以。下图说明会话模式。服务提供者们,通过sessionID 或者session identification string ,来广播自己的服务类型。客户端发现匹配的session ID

Session ID 需要是 在Bonjour (用来自动发现网络设备)服务注册过的一个简短的名称。想知道更多关于Bonjour 服务可以参考https://developer.apple.com/opensource/。如果你创建一个session没有指定seeion ID 时,session 默认会使用应用程序的bundle identifier作为ID。

为了建立一个连接,至少一个设备必须 advertise 一个服务,另一个必须搜索他。你的应用程序需要提供这两种机制。Peers 同时提供advertise 和search 是最灵活方式。然而,由于他们同事提供advertis 和 search,其他设备侦查这个session需要花费更多时间。介绍了这么下面介绍如何实现一个服务。

Implement a server

你的应用程序实例扮演一个服务,通过调用initWithSessionID:displayName:sessionMode来初始化,session mode 参数可以指定为GKSessionModeServer 或者GKSessionModePeer。设置完session之后,设置session 的变量属性为YES 来广播服务。

当客户端请求连接网络,这个服务会被通告。当客户端发送连接请求,session:didREceiveConnectionRequestFromPeer 方法会被调用,通过server’s delegate。

一个典型的delegate行为是 需要通过使用peer ID 字符串调用displayNameForPeer方法来检索一个user-readable name 。server 会呈现一个借口让用户决定选择哪个服务去连接。

Deleaget 通过调用acceptConnectionFromPeer:error:方法或者调用denyConnectionFromPeer方法来接受请求。当连接成功建立之后,the delegate’ssession:peer:didChangeState方法会被调用来通知新的 peer连接。 

Exchanging Data

Peers 连接到一个会话可以同其他连接者交互数据。你的应用程序通过调用sendDataToAllPeers:withDataMode:error方法 或者通过调用sendData:toPeers:withDataMode:error提交一个peers 来发送数据。数据发送给其他peers通过封装NSDataobject;你的应用程序可以设计 和使用任何自定义的数据格式。为了能呈现最好的性能,数据对象的大小保持小于1000字节。消息大小超过1000字节可能需要切割成小的chunks  然后聚合成目标,包含额外的延迟和 头部。

注意:最大的消息大小允许是87Kb,如果你需要发送超过这个数值,你需要切割成多分数据。

你可以选择发送可靠的数据,当数据发送失败时,再重发数据到目的地。或者发送不可靠数据,只尝试一次发送数据。不可靠消息适合数据必须实时发送到其他peers,当发送更新数据包比重发数据更重要时 。实时消息 会加入发送顺序。为了使得你的应用程序接送其他peers发送过来的数据,你的应用程序需要提供receiveData:FromPeer:inSession:context:方法。当数据从其他peers发来时,数据处理函数函数在你的主线中会被调用。

重要:所有从其他peers接收过来的数据应该被认为是 不可信任的数据(不可靠数据),你的应用程序需要证实这份数据,细心写你的代码避免被攻击。可以查看secure coding guide来获得更多信息。

Disconnecting Peers

结束 一个session ,你的应用程序调用 disconnectFromAllPeers 方法。网络本来是不可靠的。如果一个peer 一段时间没响应, peer 会自动断开会话连接。你的应用程序 可以修改断开连接的timeout。

当连接从session断开的时候,会话的delegate’ssession:peer:didChangeState:方法会被调用。

Cleaning Up

当你的应用准备好 处理掉会话, 你的应用需要从peers中断开连接,设置availableflag为NO。删除 数据处理和delegate 然后release session。

ThePeer Picker

你可能会选择使用GKSession’sdelegate来实现自己的用户接口。Gamekit 提供标准的用户接口用来发现 和连接 进程。GKPeerPickerController 对象呈现 peer picker 用户接口,允许用户同其他设备建立peer-to-peer 连接。GKPeerPickerController对象返回一个完整的关于两个peers之间的GKSession。

Configuring a Peer Picker Controller

你的应用程序需要提供一个delegate给controller调用 ,就像用户通过peer picker交互。

Peer picker controller’s connectionTypesMask属性 是用来配置可用的连接列表。用户可以在本地蓝牙网络和互联网选择其一。当你的应用程序设置了这个mask 包含一种以上网络,peerpicker control 会显示额外的一个对话框供用户选择哪个网络。当用户从列表中选择一个网络并连接时会调用peerPickerCOntroller :didSelectConnectionType方法。

重要:peer picker只创建蓝牙连接。如果你的应用程序提供网络连接,当用户选择一个网络时,你的应用程序必须dismiss peer picker 然后呈现他自己的用户接口网络配置。

如果你的用用程序想定制创建peerpicker 会话。可以实现delegate’speerPickerController:sessionForConnectionType 方法。如果你的应用程序没有实现,这个方法 the peer picker 会创建一个默认的session。

Displaying the Peer Picker

通过调用controller’sshow方法 [controller show]; 来显示peer picker。如果用户选择连接其他peer ,delegate’speerPickerController :didConnectPeer :toSession 会被调用。你的应用程序应该保留一份ession 通过copy 来实现,然后隐藏对话框。如果用户取消连接尝试,peerPickerControllerDidCancel方法会被调用。

FindingPeers with Peer Picker

你的应用程序可以配置peerpicker 允许用户选择网络或者蓝牙进行连接。如果选择网络,你的用用程序需要dismiss peer picker dislog 然后显示连接完成。

如何添加peer picker

1.      创建并初始化 GKPeerPickerController对象

    picker =[[GKPeerPickerController alloc] init];

2.      设置delegate

picker.delegate =self;

3.      配置网络类型

   picker.connectionTypesMask =GKPeerPickerConnectionTypeNearby |

GKPeerPickerConnectionTypeOnline;

当用户选择一个peer进行连接时,    didSelectConnectionType 会被调用

-(void)peerPickerController:(GKPeerPickerController *)picker

didSelectConnectionType:(GKPeerPickerConnectionType)type{

if (type ==GKPeerPickerConnectionTypeOnline) {

picker.delegate = nil;

2011-03-08 | © 2011 Apple Inc. All Rights Reserved.

 [picker dismiss];

[picker autorelease];

// Implement your own internetuser interface here.

}

}

4.      如果你想自己制定session类型,可以实现 sessionForConnectionType方法,当初始化GKPickerViewController会调用改方法。

- (GKSession *)peerPickerController:(GKPeerPickerController *)picker

sessionForConnectionType:(GKPeerPickerConnectionType)type

{

GKSession* session = [[GKSession alloc]

initWithSessionID:myExampleSessionID displayName:myName

sessionMode:GKSessionModePeer];

[session autorelease];

return session;

}

5.       当用户选择一个peer 进行连接时,会调用didConnectPeer函数,

-(void)peerPickerController:(GKPeerPickerController *)picker

didConnectPeer:(NSString *)peerIDtoSession: (GKSession *) session {

// Use a retaining property to takeownership of the session.

self.gameSession = session;

// Assumes our object will also become thesession's delegate.

session.delegate = self;

[session setDataReceiveHandler: selfwithContext:nil];

// Remove the picker.

picker.delegate = nil;

[picker dismiss];

[picker autorelease];

// Start your game.

}

6.      取消

-(void)peerPickerControllerDidCancel:(GKPeerPickerController *)picker

{

picker.delegate= nil;

// Thecontroller dismisses the dialog automatically.

[pickerautorelease];}

Working with session

这一章节介绍,如何使用GKSession对象来配置peer picker

一个peer’ssession接收两个不同的数据,一个是关于其他peers的信息,一个是peers发来的数据。你的应用程序提供delegate来处理接收到的数据和信息。为了在你的应用程序中使用session,你需要实现以下步骤。

1.    实现 session delegate’s session:peer:didChangeState方法

当其他peer状态改变时改方法会通告应用程序。大多数这样的状态改变会被peer picker自动处理,但是当用户网络连接或者断开连接你的应用程序需要做处理。

-(void)session:(GKSession *)session peer:(NSString *)peerID

didChangeState:(GKPeerConnectionState)state

{

switch (state)

{

caseGKPeerStateConnected:

// Record thepeerID of the other peer.

// Inform your gamethat a peer has connected.

break;

case GKPeerStateDisconnected:

// Inform your gamethat a peer has left.

break;

}

}

2.  发送数据

- (void)mySendDataToPeers: (NSData *) data

{

[sessionsendDataToAllPeers: data withDataMode: GKSendDataReliable

error: nil];

}

3.接受数据

- (void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:

(GKSession*)session context:(void *)context

{

// Read the bytesin data and perform an application-specific action.

}

 

4.     当结束连接时,需要释放session 对象

[sessiondisconnectFromAllPeers];

session.available =NO;

[sessionsetDataReceiveHandler: nil withContext: nil];

session.delegate =nil;

[session release];

Example https://developer.apple.com/library/ios/#samplecode/GKTank/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008918

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值