gameKit 只用于iOS设备间的同个应用连接, 多由于游戏 在iOS7之后过期
gameKit 的使用过程主要可以分为四步:
1.创建一个GKPeerPickerController 对象 这个对象用来搜索附近的设备(类似alertView).
2.设置GKPeerPickerController 的代理 用于连接的回调
3.在 (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session 代理方法中保存 session 以备 后续发送数据使用 并且在这个方法中设置session的 接收数据的 句柄 [self.session setDataReceiveHandler:self withContext:nil]; 这样接收的数据只有系统会自动地用 方法 用于处理发送的数据
4.使用session 发送受 BOOL sendState = [self.session sendDataToAllPeers:UIImagePNGRepresentation(self.iconView.image) withDataMode:GKSendDataReliable error:&error];
实现过程:
a.建立连接 b.选择数据 c.发送
首先布局一个简单的界面:
@interface ViewController () <GKPeerPickerControllerDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
/** 会话 */
@property (nonatomic, strong) GKSession *session;
@end
实现代码
a. 建立连接 创建GKPeerPickerController 对象 并设置代理
// 建立连接
- (IBAction)lineClick:(UIButton *)sender {
// 1.创建一个附近设备的搜索提示框(类似alert)
GKPeerPickerController *pic = [[GKPeerPickerController alloc] init];
// 设置代理
pic.delegate = self;
[pic show];
}
在选中了要连接的设备后会调用 GKPeerPickerController的代理方法
连接成功后调用的代理方法为
#pragma mark - <GKPeerPickerControllerDelegate>
- (void)peerPickerController:(GKPeerPickerController *)picker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session {
// 保存会话
self.session = session;
// 设置接收数据
// 设置完接受者之后,接收数据会触发 -receiveData:fromPeer:inSession:context
[self.session setDataReceiveHandler:self withContext:nil];
}
在代理方法中保存连接的session, 并设置session接收数据的句柄,这样在接收数据时就可以调用下面的方法
#pragma mark - 蓝牙设备接收到数据时,就会调用
- (void)receiveData:(NSData *)data // 数据
fromPeer:(NSString *)peer // 来自哪个设备
inSession:(GKSession *)session // 连接会话
context:(void *)context {
self.iconView.image = [UIImage imageWithData:data];
}
b.选中数据 (以图片为例)
// 选中图片
- (IBAction)pick:(UIGestureRecognizer *)sender {
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
return;
}
// 创建图片库
UIImagePickerController *pc = [[UIImagePickerController alloc] init];
// 设置源
pc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
// 设置代理
pc.delegate = self;
[self presentViewController:pc animated:YES completion:nil];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
// 消失pc
[picker dismissViewControllerAnimated:YES completion:nil];
self.iconView.image = info[UIImagePickerControllerOriginalImage];
}
c.发送数据
// 发送数据
- (IBAction)sendClick:(UIButton *)sender {
// 可靠的传输方式特点:1慢 2.不会丢包 3.直到传完 GKSendDataUnReliable 可靠的传输方式特点:1快 2.可能会丢包 3.传递的信息不一定完整
NSError *error = nil;
BOOL sendState = [self.session sendDataToAllPeers:UIImagePNGRepresentation(self.iconView.image) withDataMode:GKSendDataReliable error:&error];
if (!sendState) {
NSLog(@"error = %@", error.localizedDescription);
}
}
发送数据 对方就会调用下面发方法
- (void)receiveData:(NSData *)data // 数据
fromPeer:(NSString *)peer // 来自哪个设备
inSession:(GKSession *)session // 连接会话
context:(void *)context {
self.iconView.image = [UIImage imageWithData:data];
}