如何不使用GKPeerPicker超过GKSession传输手机之间的数据(How to trans

2019-09-20 21:51发布

我试图创建一个使用传输2+ GKSession手机之间的数据的应用程序。 事情是有两种选择:

第一:使用GKPeerPicker 。但是在这里,我陷在其中,我要实现我自己的一点WIFI接口 ..苹果提供了有关如何做到这一点没有说明:

- (void)peerPickerController:(GKPeerPickerController *)picker didSelectConnectionType:    (GKPeerPickerConnectionType)type {
    if (type == GKPeerPickerConnectionTypeOnline) {
        picker.delegate = nil;
        [picker dismiss];
        [picker autorelease];
       // Implement your own internet user interface here.
    }
}

第二:跳绳GKPeerPicker,做整个事情我自己,像这样的例子。 然而,应用开发文档没有提供关于如何发送/接收数据的任何指令,而无需使用GKPeerPicker ..(我也能找到那thew网络上的任何例子)

Answer 1:

我只是想出了如何将设备连接不peerpicker。 这是一个有点猜谜游戏,因为文档是非常不清楚,我已经看了这么久的互联网上有关此任何信息。 我将在这里解释一切澄清任何问题的人将来可能有。

从文档:

一个GKSession对象提供发现并连接到使用蓝牙或Wi-Fi附近的iOS设备的能力。

这是第一步,了解我。 我认为GKPeerPickerController负责广告和连接,但GKSession实际上做了这一切。

要了解的第二件事是什么被称为同行不一定连接到你。 他们可以在附近等待我们去发现和连接。 所有的同龄人的状态

  • GKPeerStateAvailable(这是非常有用的!)
  • GKPeerStateUnavailable
  • GKPeerStateConnected
  • GKPeerStateDisconnected
  • GKPeerStateConnecting

那么,如何才能真正连接? 那么首先我们要创建一个GKSession目的是能够找到我们身边的同行,看看当他们成为可供选择:

// nil will become the device name
GKSession *gkSession = [[GKSession alloc] initWithSessionID:@"something.unique.i.use.my.bundle.name" displayName:nil sessionMode:GKSessionModePeer];
[gkSession setDataReceiveHandler:self withContext:nil];
gkSession.delegate = self;
gkSession.available = YES; // I'm not sure this if this is the default value, this might not be needed

现在我们有一些委托调用回应。 session:didReceiveConnectionRequestFromPeer:session:peer:didChangeState (你也应该处理GKSessionDelegate的断线和失败的调用适当)

-(void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state
{
    if(state == GKPeerStateDisconnected)
    {
        // A peer disconnected
    }
    else if(state == GKPeerStateConnected)
    {   
        // You can now send messages to the connected peer(s)
        int number = 1337;
        [session sendDataToAllPeers:[NSData dataWithBytes:&number length:4] withDataMode:GKSendDataReliable error:nil];
    }
    else if (state == GKPeerStateAvailable)
    {
        // A device became available, meaning we can connect to it. Lets do it! (or at least try and make a request) 
        /*
        Notice: This will connect to every iphone that's nearby you directly. 
        You would maybe want to make an interface similar to peerpicker instead
        In that case, you should just save this peer in a availablePeers array and 
        call this method later on. For your UI, the name of the peer can be 
        retrived with [session displayNameForPeer:peerId]
        */
        [session connectToPeer:peerID withTimeout:10];
    }

}

在其他同行现在已经收到,他应该做出响应的请求。

-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID
{
    // We can now decide to deny or accept
    bool shouldAccept = YES;
    if(shouldAccept)
    {
        [session acceptConnectionFromPeer:peerID error:nil];
    }
    else
    {
        [session denyConnectionFromPeer:peerID];
    }
}

最后收到我们的小1337消息

-(void)receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession*)session context:(void *)context
{
    int number = 1337;
    if([data isEqualToData:[NSData dataWithBytes:&number length:4]])
    {
        NSLog(@"Yey!");
    }
}


文章来源: How to transfer data between phones over GKSession without using GKPeerPicker
标签: ios gksession