Я хочу подключить два устройства с помощью GKSession, начиная один как сервер и другой как клиент. Используя эту конфигурацию я не могу использовать GKPeerPickerController.
У меня есть проблемы для подключения этих двух устройств:
В интерфейсном файле я имею
GKSessionDelegate
GKSession *session;
В реализации я запускаю сервер с помощью этого кода:
session = [[GKSession alloc] initWithSessionID:@"iFood" displayName:nil sessionMode:GKSessionModeClient];
session.delegate = self;
session.available = YES;
Клиент начинает использовать этот код:
session = [[GKSession alloc] initWithSessionID:@"iFood" displayName:nil sessionMode:GKSessionModeServer];
session.delegate = self;
session.available = YES;
Как я могу вызвать использование Bluetooth вместо WiFi?
Также я реализовал те вызовы:
-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID {
NSLog(@"Someone is trying to connect");
}
- (BOOL)acceptConnectionFromPeer:(NSString *)peerID error:(NSError **)error {
NSLog(@"acceptConnectionFromPeer");
}
Когда я запускаю, я получаю это в отладчик:
Listening on port 50775
2010-02-19 14:55:02.547 iFood[3009:5103] handleEvents started (2)
И когда другое устройство начинает находить, я получаю это:
~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 name=00eGs1R1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local.
~ DNSServiceQueryRecord callback: Ref=17bd40, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 fullname=00eGs1R1A\.\.Only\032by\032Audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=4500
** peer 1527211048: oldbusy=0, newbusy=0
~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 name=00eGs1R1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local.
GKPeer[186960] 1527211048 service count old=1 new=2
~ DNSServiceQueryRecord callback: Ref=17bd40, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 fullname=00egs1r1a\.\.only\032by\032audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=7200
** peer 1527211048: oldbusy=0, newbusy=0
~ DNSServiceBrowse callback: Ref=187f70, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 name=00TF5kc1A..Only by Audi regtype=_2c3mugr67ej6j7._udp. domain=local.
~ DNSServiceQueryRecord callback: Ref=188320, Flags=2, IFIndex=-3 (name=[]), ErrorType=0 fullname=00tf5kc1a\.\.only\032by\032audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=7200
** peer 1723356125: oldbusy=0, newbusy=0
~ DNSServiceQueryRecord callback: Ref=188320, Flags=2, IFIndex=2 (name=[en0]), ErrorType=0 fullname=00TF5kc1A\.\.Only\032by\032Audi._2c3mugr67ej6j7._udp.local. rrtype=16 rrclass=1 rdlen=18 ttl=4500
** peer 1723356125: oldbusy=0, newbusy=0
Что я пропускаю здесь?
Я уверен, что обоим устройствам включили Bluetooth и соединенный в тот же WiFi.
спасибо,
r.
У меня были похожие проблемы, но из описания выше я думаю, что вы делаете некоторые ошибки:
GKSession реализует только BT; если вы используете picker, то вы можете предоставить отдельные методы для работы с WiFi соединениями.
Метод "didReceiveConnectionRequestFromPeer" должен вызывать метод "didReceiveConnectionRequestFromPeer". "acceptConnectionFromPeer" метод на объекте сессии - вы не не реализуете "acceptConnectionFromPeer" на вашем делегате.
Для отладки, вы должны регистрировать изменения состояния в методе делегата "session:peer:didChangeState:" (см. http://developer.apple.com/iPhone/library/documentation/GameKit/Reference/GKSessionDelegate_Protocol/Reference/Reference.html ). Когда пир становится "Доступен", вы можете можно вызвать "connectToPeer:"; когда "Connected", можно использовать "sendData:toPeers:".
Для IO после того, как вы установили соединение, вы хотите вызвать метод "setDataReceiveHandler:withContext:" на сессии.
Ранее в моем коде были некоторые опечатки, но теперь он работает.
Удачи.