Teaserimage

GameKit

by Enno Welbers, written on 20.06.2010 Permalink

Kommunikation und Netzwerk sind essentielle Komponenten vieler iPhone Anwendungen. Gerade für Spiele eröffnen sich auf dieser Plattform nahezu grenzenlose Möglichkeiten. Genau für diesen Fall gibt es im iPhone SDK ein extra Framework: GameKit. Ich habe mir GameKit aus gegebenen Anlass angesehen, besonders die enthaltene Voice Chat Funktionalität.

GameKit basiert auf Bonjour und ermöglicht Kommunikation sowohl über WLAN als auch über Bluetooth. Es hebt die Kommunikation auf eine andere Ebene. Man kümmert sich nicht länger um Verbindungen und Ports, sondern etabliert eine Sitzung und Teilnehmer (Peers) können an einer Sitzung teilnehmen.

Eine Sitzung eröffnen

Das eröffnen einer Sitzung mit GameKit ist sehr einfach. Man erstellt ein GKSession-Objekt mit dem passenden SessionMode. Hinzu kommen nur noch ein Delegat und die Registrierung der Methode, die eingehende Daten empfangen soll:

sess=[[GKSession alloc] initWithSessionID:nil 
                              displayName:@"Session Name" 
                              sessionMode:GKSessionModeServer];
sess.available=YES;
sess.delegate=self;
[sess setDataReceiveHandler:self withContext:nil];

über den Delegaten werden Sitzungsveränderungen an die Anwendung weitergegeben. Dazu gehören Teilnehmerveränderungen wie getrennte Teilnehmer, verbundene Teilnehmer und neue Sitzungen. Verbindungsanfragen gehören ebenfalls dazu.

Sitzungen finden

Um nach Sitzungen zu suchen, an denen teilgenommen werden kann, ist letzendlich der gleiche Code notwendig:

sess=[[GKSession alloc] initWithSessionID:nil 
                              displayName:@"Session Name" 
                              sessionMode:GKSessionModeClient];
sess.available=YES;
sess.delegate=self;
[sess setDataReceiveHandler:self withContext:nil];

Lediglich der Session Mode unterscheidet sich. Dadurch werden alle gefundenen Sitzungen an den Delegaten weitergegeben.

Einer Sitzung teilnehmen

Um die Verbindung zu einer Sitzung aufzubauen ist auf beiden Seiten Code notwendig. Dabei unterscheide ich zwischen dem Sitzungsinhaber und dem -client, der die Verbindung aufbauen will.

Sitzungsclient

[sess connectToPeer:peerID
        withTimeout:15];

In GameKit wird zwischen Teilnehmern, sogenannten Peers unterschieden. Jeder Peer wird eindeutig durch seine Peer ID gekennzeichnet. Diese Peer IDs werden von GameKit über die Delegatmethoden zur Verfügung gestellt und erwartet, wenn man Daten gezielt senden will oder eine Verbindung aufbauen will.

Sitzungsinhaber

Der Sitzungsinhaber wird zunächst über eine Verbindungsanfrage informiert und er muss diese nun zulassen oder verbieten.

- (void)session:(GKSession *)session 
                          didReceiveConnectionRequestFromPeer:(NSString *)peerID
{
    [session acceptConnectionFromPeer:peerID error:nil];
}

Nachdem die Verbindung akzeptiert wurde, werden beide Peers über die Verbindungsveränderung informiert. Ab jetzt kann miteinander kommuniziert werden.

Voice Chat

Die Voice Chat Funktionalität ist soweit entkoppelt, dass sie nicht auf GameKit angewiesen ist. Als Entwickler muss man einen Weg zur Datenübertragung zwischen den Teilnehmern bereitstellen. Allerdings ist das aufsatteln auf GameKit sehr einfach. Man muss lediglich ein zusätzliches Protokoll implementieren und zwischen GameKit und VoiceChat als Gateway fungieren. Auf die Details gehe ich hier nicht ein, die Apple Dokumentation liefert einen guten Einstieg.

Ich habe ein kleines Beispielprojekt gebaut, dass GameKit und VoiceChat nutzt um Audio von einem iPhone/iPod Touch zu einem anderen iPhone/iPod Touch zu übertragen, sozusagen ein Wifi-Mikro.

Anhänge: