GameKit.framework(用法简单)只能用于iOS设备之间的连接,多用于游戏(比如五子棋对战),从iOS7开始过期。该Demo是从手机相册选取图片,传送到链接的设备,接收图片的设备将图片显示在屏幕,并保存到手机相册。
1.使用XIB布局
2.引入框架
#import <Gamekit/Gamekit.h>
建立会话
@property(nonatomic,strong)GKSession *session;
3.建立链接button的方法(会弹出类似于Alert的对话框)
//创建一个附近设备搜索提示框
GKPeerPickerController *ppc = [[GKPeerPickerController alloc] init];
ppc.delegate = self;
[ppc show];
4.GKPeerPickerController将遵守代理协议GKPeerPickerControllerDelegate,该代理方法包含四个代理方法
//最常用的方法
//已经成功连接到某个设备,并且开启了链接会话
- (void)peerPickerController:(GKPeerPickerController *)picker//搜索框
didConnectPeer:(NSString *)peerID//连接的设备
toSession:(GKSession *)session//链接的会话:通过会话可以进行数据传输
{
//首先让弹框消失
[picker dismiss];
//标记会话
self.session = session;
//设置接受数据
//设置完接受者之后,接受数据会触发
[self.session setDataReceiveHandler:self withContext:nil];
}
5.在UIimageview上添加手势,点击调用手机相册,遵循UIImagePickerController的代理UIImagePickerControllerDelegate和UINavigationControllerDelegate方法(提供刷新数据及动画的方法)
//从相册中选择图片
- (IBAction)chooseImaFromLib:(id)sender {
// 判断是否支持相册选择
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
NSLog(@"没有相册");
return;
}
//创建选择图片的控制器
UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
//设置图片来源
ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//设置代理
ipc.delegate = self;
//modal出来
[self presentViewController:ipc animated:YES completion:nil];
}
//UIImagePickerController代理方法//选择图片完毕调用的方法
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary*)info{
[picker dismissViewControllerAnimated:YES completion:nil];
//让选择的图片显示,info
self.icon.image = info[UIImagePickerControllerOriginalImage];
}
6.发送数据button方法
- (IBAction)sendData:(id)sender {
//第一步先判断要发送的数据是否存在
if (!self.icon.image) {
return;
}
//发送数据
// [self.session sendData:UIImagePNGRepresentation(self.icon.image)
// toPeers:self.session//通常传入已经连接的设备
// withDataMode:(GKSendDataUnReliable)
// error:<#(NSError *__autoreleasing *)#>]
NSError *error = nil;
BOOL sendState = [self.session sendDataToAllPeers:UIImagePNGRepresentation(self.icon.image)
withDataMode:(GKSendDataReliable)//可靠的传输方式:慢,不会丢包,知道传完 不可靠的传输方式:快,可能会丢包,传递的信息不一定完整
error:&error];
if (!sendState) {
NSLog(@"send error = %@",error.localizedDescription);
}
}
7.接收数据,显示在屏幕上,并保存至手机相册
-(void)receiveData:(NSData *)data//数据
fromPeer:(NSString *)peer//来自哪个设备
inSession:(GKSession *)session//链接会话
context:(void *)context{
//将数据直接显示在屏幕上
self.icon.image = [UIImage imageWithData:data];
//将数据存入相册
UIImageWriteToSavedPhotosAlbum(self.icon.image, nil, nil, nil);
}
总结:
为双方呈现一个GKPeerPickerController,提供了一个标准的用户界面连接两台设备
ViewControoler遵循GKPeerPickerControllerDelegate协议,处理来自GKPeerPickerController(对端选择器)的信息
建立连接后,使用GKSession类可以向对端设备发送数据
在receiveData:fromPeer:inSession:context代理方法中编写代码来处理接收到的数据
github上Demo地址:https://github.com/liuyan-yt/GameKItDemo.git