GameKit: руководство по GKSession

Я хочу подключить два устройства с помощью GKSession, начав одно как сервер, а другое как клиент. Используя эту конфигурацию, я не могу использовать GKPeerPickerController.

У меня проблемы с подключением двух устройств:

  • Использование только bluetooth: невозможно
  • с использованием Wi-Fi: по крайней мере, между устройствами происходит обмен данными, но нет успешного соединения.

В файле интерфейса у меня есть

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 и они подключены к одному и тому же Wi-Fi.

Благодарность,

r.


person mongeta    schedule 19.02.2010    source источник
comment
К вашему сведению, ваши GKSessionModeClient и GKSessionModeServer поменялись местами.   -  person Jeff    schedule 08.07.2011


Ответы (2)


Я думаю, вы упускаете возможность установить связь с клиентом. После того, как вы получите обратный вызов didReceiveConnectionRequestFromPeer, вам необходимо принять соединение с клиентом следующим образом:

-(void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID {
  NSLog(@"Someone is trying to connect"); 
  NSError *error;
  [gkSession acceptConnectionFromPeer:peerID error:&error];
  if(error)
    NSLog(@"Error on accept connection with peer: ", error);
}

После этого вы получите здесь "GKPeerStateConnected":

- (void)session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state{}

Надеюсь, это вам поможет.

person Jan Cássio    schedule 07.01.2013

У меня были аналогичные проблемы, но из приведенного выше описания я думаю, что вы делаете некоторые ошибки:

GKSession реализует только BT; если вы используете средство выбора, вы можете предоставить отдельные методы для работы с соединениями WiFi.

Метод didReceiveConnectionRequestFromPeer должен вызывать метод acceptConnectionFromPeer для объекта сеанса - вы не реализуете acceptConnectionFromPeer в своем делегате.

Для отладки вы должны регистрировать изменения состояния в методе делегата "session: peer: didChangeState:" (см. http://developer.apple.com/iPhone/library/documentation/GameKit/Reference/GKSessionDelegate_Protocol/Reference/Reference.html). Когда одноранговый узел «Доступен», вы можете вызвать «connectToPeer:»; когда "Подключено", вы можете использовать "sendData: toPeers:".

Для ввода-вывода после того, как вы установили соединение, вы хотите вызвать метод «setDataReceiveHandler: withContext:» в сеансе.

Раньше в моем коде были опечатки, но теперь он работает.

Удачи.

person BJ.    schedule 21.02.2010
comment
Здравствуйте, у меня реализованы методы этих делегатов, но я не записывал их в код. Также мой сеанс: peer: didChangeState никогда не получает вызовов при использовании GKSession, но он вызывается, когда я использую средство выбора. Пока я не нашел больше информации о том, что может быть не так или почему он не работает, я использую GKPicker ... спасибо, по крайней мере, я знаю, что я не единственный ... :-) С уважением, r. - person mongeta; 21.02.2010
comment
GKSession реализует только BT ... это неправда. - person typeoneerror; 18.03.2011
comment
@type Хотя сейчас это правда, я считаю, что в то время, когда был дан этот ответ, GameKit поддерживала только Bluetooth-соединения, и вам приходилось использовать CFNetwork для подключения устройств через Wi-Fi. Было бы точнее сказать, что это уже неверно, поскольку GameKit теперь поддерживает соединения Wi-Fi. - person Beltalowda; 21.09.2011
comment
Я использовал GameKit во время бета версии 4.0. GKSession всегда поддерживает Wi-Fi и BT. Думаю, вы думаете о комплекте пользовательского интерфейса Apple для GameKit, который поддерживает только соединения BT. Вам нужно создать свой собственный экземпляр GKSession, если вы хотите использовать Wi-Fi, но он его поддерживает. - person typeoneerror; 21.09.2011