ZHAW Zürcher Hochschule für Angewandte Wissenschaften
Bachelorstudium Informatik
Semesterarbeit
Dozent: Beat Seeliger
Herbstsemester 2013
Cyril Gabathuler, cyril.gabathuler@icloud.com
14. November 2013
Das Ziel dieser Semesterarbeit war die Erstellung einer App für das iPhone und das iPad. Die App wurde entwickelt, um das Planning Poker digital und drahtlos stattfinden zu lassen.
Mehrere iPhones können sich drahtlos mit einem iPad verknüpfen. Die Teilnehmer können auf dem iPhone eine Karte mit Storypoints auswählen und diese an das iPad übermitteln. Haben sich alle Teilnehmer für einen Wert entschieden, werden diese auf dem iPad angezeigt. Danach kann eine neue Runde begonnen werden und die Teilnehmer können sich wieder für eine Karte entscheiden.
Planning Poker wird in der agilen Projektmethode Scrum verwendet, um Anforderungen in deren Komplexität zu schätzen. Die App wurde entwickelt, um bekannte Probleme zu vereinfachen. Dieses Ziel wurden erreicht.
Ein aufwendiger, aber auch spannender, Teil war die Umsetzung der Kommunikation zwischen den iPhones und dem iPad. Da diese drahtlos stattfindet, können verschiedenste Fehlerquellen auftauchen. Es wurde auch ein eigenes Kommunikationsprotokoll entwickelt, welches bereits einige Fehlerquellen auschliessen sollte.
Das Planning Poker ist ein Bestandteil der agilen Projektmethode Scrum. Viele Teams kennen die Probleme des Planning Pokers:
Diese Punkte sollen mit der App angegangen werden, um ein flüssigeres Ablaufen des Prozesses zu fördern.
Es soll eine universelle App entwickelt werden. Dies erlaubt es, die App sowohl auf dem iPhone wie auch auf dem iPad einzusetzen. Zur Unterstützung der Kommunikation zwischen den iPhones und dem iPad wird das Apple eigene Framework GameKit eingesetzt. Das Framework GameKit wird verwendet, da es bereits eine grundlegende Funktion für die Verknüpfung von verschiedenen iOS Geräten bereitstellt.
Das vorrangige Ziel ist es, mit der App unkomplizierte eine Verbindung sowie die Kommunikation zwischen mehreren mobile Geräten erfolgreich herzustellen.
Das iPad wird dabei als "Server" agieren und die Verbindung mit den iPhones aufbauen. Der User hat dann die Möglichkeit, auf dem iPhone eine Karte auszuwählen. Die Karte wird dann verdeckt auf dem iPad angezeigt. Sobald alle User eine Karte gewählt haben, werden die Karten auf dem iPad aufgedeckt und eine neue Runde kann beginnen.
Folgende Aufgabenstellungen wurden definiert:
Der folgende Projektplan gibt einen Überblick über den Ablauf des Projekts und dessen wichtigsten Meilensteine.
April | Mai | Juni | Juli | September | Oktober | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Freigabe der Arbeit | ◆ 19.04.13 | |||||||||||||||||||
Kick-Off-Meeting | ◆ 25.04.13 | |||||||||||||||||||
Umsetzung | ||||||||||||||||||||
Dokumentation | ||||||||||||||||||||
Design-Review | ◆ 26.06.13 | |||||||||||||||||||
Abgabe der Arbeit | ◆ 19.10.13 |
Die Semesterarbeit wurde um einen Monat verlängert, da ich geschäftlich sehr viel zu tun hatte. Die Projektplannung wurde entsprechend angepasst.
April | Mai | Juni | Juli | September | Oktober | November | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Freigabe der Arbeit | ◆ 19.04.13 | |||||||||||||||||||||||
Kick-Off-Meeting | ◆ 25.04.13 | |||||||||||||||||||||||
Umsetzung | ||||||||||||||||||||||||
Dokumentation | ||||||||||||||||||||||||
Design-Review | ◆ 26.06.13 | |||||||||||||||||||||||
Abgabe der Arbeit | ◆ 19.11.13 |
Die Abschlusspräsentation wird nach Abgabe der Semesterarbeit durchgeführt.
Laut Reglement sollte der Aufwand für die Fertigstellung der Semesterarbeit mindestens 120 Stunden betragen. Entsprechend wurde die Planung darauf ausgelegt.
Beschreibung | Soll | Ist |
---|---|---|
Projekt aufsetzen | 3h | 2.5h |
Kick-Of-Meeting | 1h | 1h |
Design-Review | 3h | 2h |
Schlusspräsentation | 2h | 2h |
Requirements Engineering iOS App | 4h | 3h |
Bearbeitung GameKit API | 4h | 5h |
Internetsuche nach GameKit | 2h | 2h |
Definition Netzwerkverkehrs | 2h | 4h |
Continuous Integration | 3h | 4h |
Integration GameKit in App | 2h | 1.5h |
Client/Server Kommunikation | 22h | 30h |
Client GUI | 11h | 8h |
Server GUI | 11h | 10h |
Testing | 10h | 15h |
Dokumentation | 32h | 40h |
Reserve | 8h | 0h |
Total | 120h | 130h |
Der Ist-Aufwand ist ein wenig höher als anfangs geplant. Die Aufwände für die Kommunikation zwischen den Clients und dem Server ist höher ausgefallen als geplant. Das Schreiben der Dokumentation hat ebenfalls mehr Zeit benötigt als vorgesehen.
Die Dokumentation wurde ausschliesslich in HTML und CSS geschrieben. Das Inhalts- und das Abbildungsverzeichnis wurden dynamisch mit JavaScript generiert. Um die Seite auch korrekt ausdrucken zu können, wurde die Software Prince verwendet, welche HTML-Seiten in PDFs umwandelt. Dadurch konnte diese Dokumentation, gleich wie der Source-Code der Applikation, mit der Versionsverwaltungssoftware Git verwaltet und über den Online-Service GitHub geteilt werden.
Der Sourcecode der iOS App wurde ebenfalls mit der Versionsverwaltungssoftware Git verwaltet und kann über den Online-Service GitHub abgerufen werden.
Ich habe mich, in Absprache mit Beat Seeliger, entschieden den Sourcecode wie auch die Dokumentation als Open Source zur Verfügung zu stellen. Als Lizenz wurde die MIT License gewählt.
Die GitHub Repositories sind unter diesen zwei Adressen zu finden:
Planning Poker ist ein Schätzverfahren, welches in der agilen Projektmethode Scrum zum Einsatz kommt.
Mit Hilfe von Planning Poker wird die Komplexität von User Stories (Requirements) geschätzt. Das Schätzen wird mit Hilfe von Spielkarten realisiert. Diese lehnen sich typischerweise an die Werte der Fibonacci-Folge an: 1, 2, 3, 5, 8, 13, 20, 40, 100. Optional gibt es noch Karten mit dem Wert 0, einem Fragezeichen (unsicher) und einer Kaffeetasse (Pause). Die Fibonacci-Folge wurde gewählt, um aufzuzeigen, dass komplexe User Stories schwieriger zu schätzen sind. Dies führt zu einer ungenaueren Schätzung.
Das Prinzip ist simpel. Jede User Story wird besprochen und offene Fragen werden untereinander geklärt. Sind keine weiteren Fragen mehr vorhanden, entscheidet sich jeder Entwickler, verdeckt, für eine Spielkarte. Haben sich alle Teilnehmer für eine Karte entschieden, werden die Karten gemeinsam aufgedeckt. Durch die verdeckte Karte wird der Einfluss von anderen Teilnehmer minimiert und es muss eine eigene Entscheidung gefällt werden.
Das UI der App soll minimalistisch gehalten werden. Die wichtigsten Funktionalitäten der App sind der einfache Verbindungsaufbau zwischen den iPhones und dem iPad, das einfache Auswählen eines Kartenwertes auf dem iPhone und die Darstellung der gewählten Werte auf dem iPad.
Es wurde ein Mockup erstellt, um die Vision klarer darzustellen.
Um dem User ein einheitliches Erlebnis zu bieten, wird eine universelle App erstellt. Dies bedeutet, die App kann sowohl auf dem iPhone wie auch auf dem iPad ausgeführt werden. Es wird dynamisch entschieden, welche Inhalte auf welchem Gerät angezeigt werden sollen.
Die Auswahl der Karten wird mit Hilfe des Coverflows Paradigma dargestellt. Coverflow wird auf dem iPhone z.B. für die Albumauswahl innerhalb der Musik App verwendet. Der User wird die Möglichkeit haben, zwischen den verschiedenen Kartenwerten hin und her zu wischen. Hat er sich für einen Wert entschieden, kann er die Karte selektieren und der Wert wird zum iPad übertragen.
Auf dem iPad ähnelt die Darstellung einem Tisch. Die verschiedenen angemeldeten User werden mit ihrem Namen angezeigt.
Die App beinhaltet zwei wichtige Use Cases, welche im Diagramm abgebildet worden sind.
Die Anforderungen wurden direkt aus den Use Cases bzw. von den Befragungs-, Kreativitäts- und Beobachtungstechnik abgeleitet. Die Beobachtungstechnik wurde während diverser Planning Pokers eingesetzt, um direkt vor Ort die wichtigsten Anforderungen heraus zu filtern. Mittels der Kreativitätstechnik wurden vor allem Anforderung für ein möglichst innovatives UI erstellt.
Alle Anforderungen wurden anhand folgender Vorlage erstellt
# | RXX |
---|---|
Name | Name der Anforderung |
System | Für welches System die Anforderung umgesetzt wird (iPad oder iPhone) |
Priorität | Prioritäten können niedrig, mittel oder hoch sein |
Beschreibung | Eine kurze Zusammenfassung der Anforderung |
Vorbedingungen | Auflistung allfälliger Vorbedingungen |
Akzeptanz Tests | Die zu erfüllenden Akzeptanz Tests |
Querbezug | Auflistung allfälliger Querbezüge |
# | R01 |
---|---|
Name | Planning Poker starten |
System | iPad |
Priorität | hoch |
Beschreibung | Der Scrum Master startet ein neues Planning Poker auf seinem iPad |
Vorbedingungen | Es muss mindestens ein iPhone eines Teilnehmers mit dem iPad verbunden sein. Siehe R07 |
Akzeptanz Tests | AT01: Starten eines Planning Pokers |
Querbezug | - |
# | R02 |
---|---|
Name | Verfügbare iPhones anzeigen |
System | iPad |
Priorität | mittel |
Beschreibung | Das iPad zeigt alle iPhones an, welche sich mit dem iPad verbunden haben |
Vorbedingungen | Die iPhones müssen sich mit einem iPad verbinden. Siehe R07 |
Akzeptanz Tests | AT02: Anzeige verbundenen iPhones |
Querbezug | - |
# | R03 |
---|---|
Name | Karten anzeigen |
System | iPad |
Priorität | mittel |
Beschreibung | Das iPad zeigt die gewählten Karten der Teilnehmer aufgedeckt an |
Vorbedingungen |
- Das iPhone muss die Karte dem iPad übermittelt haben und das iPad muss die Karten empfangen haben. Siehe R08 und R04 - Alle Teilnehmer müssen eine Karte ausgewählt haben. Siehe R10 |
Akzeptanz Tests | AT05: Karten aufdecken |
Querbezug | Beispielhaft im Mockup zu sehen |
# | R04 |
---|---|
Name | Karten empfangen |
System | iPad |
Priorität | mittel |
Beschreibung | Dem iPad werden drahtlos die Karten der verschiedenen Teilnehmer zugestellt |
Vorbedingungen | Es muss mindestens ein iPhone eines Teilnehmers mit dem iPad verbunden sein. Siehe R07 |
Akzeptanz Tests | AT04: Auswählen einer Karte |
Querbezug | - |
# | R05 |
---|---|
Name | Karte schicken |
System | iPhone |
Priorität | mittel |
Beschreibung | Die ausgewählte Karte des Teilnehmers wird drahtlos zu dem verbundenen iPad übertragen |
Vorbedingungen |
- Das iPhone muss mit einem iPad verbunden sein. Siehe R07 - Der Teilnehmer muss eine Karte ausgewählt haben. Siehe R08 |
Akzeptanz Tests | AT04: Auswählen einer Karte |
Querbezug | - |
# | R06 |
---|---|
Name | Verfügbares iPad anzeigen |
System | iPhone |
Priorität | mittel |
Beschreibung | Das verfügbare iPad wird mit seinem Name dargestellt |
Vorbedingungen | Das iPad muss sich im Verbindungsmodus befinden |
Akzeptanz Tests | AT01: Starten eines Planning Pokers |
Querbezug | - |
# | R07 |
---|---|
Name | iPad auswählen |
System | Teilnehmer |
Priorität | mittel |
Beschreibung | Aus einer Liste aller verfügbaren iPads muss ein iPad ausgewählt werden, mit welchem sich das iPhone verbinden sollte |
Vorbedingungen | Es muss nach verfügbaren iPads gesucht worden sein. Siehe R06 |
Akzeptanz Tests | AT01: Starten eines Planning Pokers |
Querbezug | - |
# | R08 |
---|---|
Name | Karte auswählen |
System | Teilnehmer |
Priorität | mittel |
Beschreibung | Es muss eine Karte aus einer Liste ausgewählt werden. Die Karten haben die Werte 0, 0.5, 1, 2, 3, 5, 8, 13, 20, 40, 100, ? und ein Bild einer Kaffeetasse |
Vorbedingungen | Das iPhone muss mit einem iPad verbunden sein. Siehe R07 |
Akzeptanz Tests | AT04: Auswählen einer Karte |
Querbezug | Im Kapitel Planning Poker wird Bezug auf die Werte der Karten genommen |
# | R09 |
---|---|
Name | Verdecktes Wählen |
System | iPhone |
Priorität | mittel |
Beschreibung | Dem Teilnehmer soll es möglich sein, seine Karte so verdeckt wie möglich zu wählen. Sollten andere Teilnehmer den gewählten Wert sehen, könnten diese unnötig beeinflusst werden |
Vorbedingungen | - |
Akzeptanz Tests | AT03: Erfolgreiche Verbindung |
Querbezug | - |
# | R10 |
---|---|
Name | Aufdecken der Karten |
System | iPad |
Priorität | mittel |
Beschreibung | Die Karten dürfen auf dem iPad erst aufgedeckt werden, sobald alle Teilnehmer sich für einen Wert entschieden haben |
Vorbedingungen | - |
Akzeptanz Tests | AT04: Auswählen einer Karte |
Querbezug | - |
# | R11 |
---|---|
Name | Drahtlose Verbindung |
System | iPad & iPhone |
Priorität | mittel |
Beschreibung | Die Verbindung zwischen den verschiedenen Geräten ist drahtlos. Die Technologie (Bluetooth oder WLAN) spielt dabei keine Rolle |
Vorbedingungen | - |
Akzeptanz Tests | AT03: Erfolgreiche Verbindung |
Querbezug | - |
# | R12 |
---|---|
Name | Schnelle und einfache Verbindung |
System | iPad & iPhone |
Priorität | mittel |
Beschreibung | Der Verbindungsaufbau zwischen dem iPad und dem iPhone soll einfach und schnell vonstatten gehen. Der Teilnehmer sollte möglichst keine Eingaben tätigen müssen |
Vorbedingungen | Die Verbindung muss drahtlos hergestellt werden. Siehe R11 |
Akzeptanz Tests | AT03: Erfolgreiche Verbindung |
Querbezug | - |
# | R13 |
---|---|
Name | Coverflow UI |
System | iPhone |
Priorität | tief |
Beschreibung | Die Karten sollen auf dem iPhone UI mittels dem Paradigma Coverflow dargestellt werden |
Vorbedingungen | - |
Akzeptanz Tests | - |
Querbezug | Siehe Mockup |
# | R14 |
---|---|
Name | Pokertisch UI |
System | iPhone |
Priorität | tief |
Beschreibung | Die Teilnehmer, wie auch deren Karten, sollen auf dem iPad mittels einem Pokertisch dargestellt werden |
Vorbedingungen | - |
Akzeptanz Tests | - |
Querbezug | Siehe Mockup |
Das System besteht aus einer iOS App, welche sowohl auf einem iPhone wie auch auf einem iPad installiert werden kann. Je nach Kontext erfüllt die App andere Aufgaben bzw. wird von einer anderen Zielperson verwendet. Die iPhones und das iPad kommunizieren drahtlos miteinander.
Die Applikation wird in verschiedene Teile gegliedert. Die Gruppe ViewControllers sorgt für die Darstellung der Daten innerhalb eines UIs auf dem iPad, wie auch auf dem iPhone. Die Gruppe Connection sorgt sich um die Verbindung zwischen einem iPad und verschiedenen iPhones. In der Gruppe DataModel werden die Daten beschrieben, welche zwischen dem iPad und den iPhones ausgetauscht werden.
Die Akzeptanz Tests werden anhand der Requirements definiert und haben daher eine direkte Verbindung zu den Requirements.
Alle Akzeptanz Tests wurden anhand folgender Vorlage erstellt.
# | ATXX |
---|---|
Name | Name des Tests |
Status | Erfüllt oder nicht erfüllt |
Geprüfte Anforderungen | Anforderungen, welche durche diese Akzeptanz Tests geprüft werden |
Aktivität | Aktivität, welche ausgeführt werden soll |
Soll Verhalten | Erwartetes Verhalten |
Ist Verhalten | Eingetroffenes Verhalten |
# | AT01 |
---|---|
Name | Starten eines Planning Pokers |
Status | ✓ Erfüllt |
Geprüfte Anforderungen | R01, R06, R07 |
Aktivität | Der Scrum Master startet auf einem iPad die App. Innerhalb der App startet er eine neue Planning Session |
Soll Verhalten |
- Die App startet ohne Probleme - Es ist möglich, eine neue Planning Session zu starten - Das iPad befindet sich im Verbindungsmodus und erscheint auf den anderen iPhones |
Ist Verhalten | Die App startet ohne Probleme auf. Nachdem ein neues Planning Poker begonnen worden ist, erscheint der Name des iPads auf den iPhones |
# | AT02 |
---|---|
Name | Anzeige verbundener iPhones |
Status | ✓ Erfüllt |
Geprüfte Anforderungen | R02 |
Aktivität | Teilnehmer starten die App auf dem iPhone. Danach sollen sie sich mit dem iPhone auf das iPad verbinden |
Soll Verhalten |
- Die App startet ohne Probleme - Es ist möglich, eine neue Planning Session zu starten - Das iPhone kann sich mit einem iPad verbinden - Sobald ein iPhone mit dem iPad verbunden ist, erscheint es in einer Listenübersicht auf dem iPad |
Ist Verhalten | Der Teilnehemer startet die App auf dem iPhone. Das iPhone sucht nach einem iPad und findet dieses. Das iPhone verbindet sich mit dem iPad und der Name des iPhones erscheint in der Liste auf dem iPad |
# | AT03 |
---|---|
Name | Erfolgreiche Verbindung |
Status | ✓ Erfüllt |
Geprüfte Anforderungen | R09, R11, R12 |
Aktivität | Sobald alle zu verknüpfenden iPhones in der Listendarstellung des iPads erschienen sind, wird eine neue Session gestartet |
Soll Verhalten |
- Die Session wird initiiert - Auf dem iPhone wird ein UI zur Auswahl der Storypoints angezeigt - Auf dem iPad erscheint ein UI, welches die Möglichkeit bietet, die Storypoints der verschiedenen Teilnehmer anzuzeigen |
Ist Verhalten | Sobald sich alle iPhones verbunden haben, startet der Scrum Master eine Runde Planning Poker. Auf dem iPad erscheint ein UI, das einem Tisch ähnelt. Die Teilnehmer erhalten ein UI zur Auswahl einer Karte |
# | AT04 |
---|---|
Name | Auswählen einer Karte |
Status | ✓ Erfüllt |
Geprüfte Anforderungen | R04, R05, R08, R10 |
Aktivität | Der Teilnehmer soll sich für eine Karte entscheiden und diese auswählen |
Soll Verhalten |
- Das iPhone zeigt visuell an, welche Karte ausgewählt worden ist - Die Karte wird auf dem iPad verdeckt angezeigt |
Ist Verhalten | Sobald ein Teilnehmer sich für eine Karte entschieden hat wird diese in grün dargestellt. Auf dem iPad ist der Wert der Karte nicht ersichtlich |
# | AT05 |
---|---|
Name | Karten aufdecken |
Status | ✓ Erfüllt |
Geprüfte Anforderungen | R03 |
Aktivität | Solange sich noch nicht alle Teilnehmer für eine Karte entschieden haben, dürfen die Kartenwerte auf dem iPad nicht ersichtlich sein. Es sollen nun alle Teilnehmer eine Karte wählen |
Soll Verhalten |
- Alle Teilnehmer haben eine Karte gewählt
- Die Karten werden auf dem iPad aufgedeckt, sobald alle Teilnehmer eine Karte gewählt haben - Zu jedem Teilnehmer wird der gewählte Kartenwert angezeigt |
Ist Verhalten | Haben alle Teilnehmer eine Karte ausgewählt, werden diese auf dem iPad angezeigt |
# | Name | Erfüllt |
---|---|---|
AT01 | Starten einer Planning Session | ✓ |
AT02 | Anzeige verbundener iPhones | ✓ |
AT03 | Erfolgreiche Verbindung | ✓ |
AT04 | Auswählen einer Karte | ✓ |
AT05 | Karten aufdecken | ✓ |
Die App wird mittels dem Integrationsserver Jenkins bei jedem Change neu gebaut. Vor dem Erstellen der App werden alle Unit Tests ausgeführt. Dafür wird das Open-Source Tool xctool verwendet.
Unit Tests wurden pro Package durchgeführt. Nachfolgend eine Übersicht der Tests und deren Resultate.
Die Unit Tests stellen sicher, dass die verschiedenen Zustände zu bestimmten Zeitpunkten in der App gesetzt sind. Diese Zustände werdem im Kapitel 10, Umsetzung der iOS App, genauer erläutert.
GameKit ist eine Sammlung von API's die für Spielentwickler entworfen worden ist. Diese API's bieten unter anderem die Möglichkeit, eine Peer-to-Peer bzw. Client Server Verbindung, auch GKSession gennant, aufzubauen. Dies wird nicht nur im Zusammenhang mit Spielen gebraucht und wird von verschiedensten App Typen eingesetzt.
Apple hat diesen Zustand bemerkt und bietet mit iOS7 diese API's unabhängig von GameKit an. Die neugeschaffenen API's werden unter dem "Multipeer Connectivity" Framework zusammengefasst. Die neuen API's bieten genau die gleiche Funktionalität, haben aber verschiedene Bereiche vereinfacht. Im Gegenzug wurden die GKSession Klassen auf "deprecated" gesetzt und werden in naher Zukunft entfernt.
iPlanningPoker basiert noch auf den GKSession Klassen, da die Entwicklung vor der Veröffentlichung von iOS7 begonnen hat. Eine Migration auf das neue Framework ist möglich und wird nach dem Abschluss der Arbeit vorangetrieben.
Der wichtigste Punkt weshalb dieses Framework gewählt wurde, ist der Vorteil, dass sich die App nicht für einen Kommunikationskanal entscheiden muss. Es wird automatisch vom Framework entschieden, ob sich nun die Geräte via Bluetooth oder WLAN miteinander verbinden. Das Auffinden, wie auch das Anpreisen der Geräte geschieht über einen Abstraktionslayer. Für diese Tasks wird innerhalb von GameKit der Apple Service Bonjour verwendet.
Um die Klasse GKSession zu instanzieren ist es notwendig, sich für einen Modus zu entscheiden. Dieser bestimmt wie sich die Klasse verhalten soll. Zur Verfügung stehen drei verschiedene Modi.
typedef enum {
GKSessionModeServer,
GKSessionModeClient,
GKSessionModePeer,
} GKSessionMode;
Die Werte GKSessionModeClient und GKSessionModeServer stehen für eine Client Server Verbindung. Eine Client Server Verbindung unterhält nur Verbidungen zwischen den Clients und dem Server.
Im Gegensatz dazu steht die Peer-to-Peer Verbindung GKSessionModePeer, bei welcher alle beteiligten Endgeräte miteinander kommunizieren.
Da iPlanningPoker in einem Client-Server Modus funktioniert, wurde entschieden, die Klasse GKSession in den Modi "GKSessionModeServer" und "GKSessionModeClient" zu instanzieren. Intern in der GKSession, welche für einen Entwickler nicht sichtbar ist, wird immer noch ein Peer-to-Peer Netzwerk verwendet.
Die iOS API's arbeiten stark nach dem Delegation Pattern. Das Protokoll GKSessionDelegate wird implementiert, um auf Events reagieren zu können. Typische Events sind:
Der Abschnitt behandelt die wichtigsten Methoden der GameKit API, welche in diesem Projekt verwendet worden sind. Um eine vollständige Übersicht zu erhalten, empfiehlt sich die Dokumentation von Apple.
Diese Instanzmethode wird verwendet um den Client zu instanzieren. Die sessionID wird als Konstante verwendet, damit alle Clients mit dem gleichen Server kommunizieren können. Der displayName ist der Gerätename und der sessionMode erhält den Wert des Enums "GKSessionModeClient".
- (id)initWithSessionID:(NSString *)sessionID displayName:(NSString *)name
sessionMode:(GKSessionMode)mode
Mit dieser Methode wird eine Verbindung zum Server aufgebaut. Dabei ist die peerId eine eindeutige UUID, welche den Server identifiziert. Das Timeout wird mittels einer Konstante gesteuert.
- (void)connectToPeer:(NSString *)peerID withTimeout:(NSTimeInterval)timeout
Um Daten an den Server senden zu können, in diesem Fall den Kartenwert, werden diese in einer speziellen Klasse aufbereitet. Das Kapitel Netzwerkverkehr behandelt dieses Thema im Detail.
Das peers Array enthalten nur einen Eintrag, die UUID des Servers. Weiter kann entschieden werden, in welchem Modus die Daten geschickt werden sollen. Wir verwenden den Wert GKSendDataReliable des Enums. Diese Einstellung gewährleistet, dass mehrmals versucht wird die Daten zu schicken und nicht sofort nach dem ersten Fehlversuch die Übertragung abbricht.
- (BOOL)sendData:(NSData *)data toPeers:(NSArray *)peers
withDataMode:(GKSendDataMode)mode error:(NSError **)error
Um einen Server zu instanzieren muss der Enumwert von sessionMode auf "GKSessionModeServer" gesetzt werden. Dies ist der wichtigste Unterschied zum Client.
- (id)initWithSessionID:(NSString *)sessionID displayName:(NSString *)name
sessionMode:(GKSessionMode)mode
Um Daten an alle Clients zu senden, wird eine unterschiedliche Methode verwendet. Diese Methode erlaubt es, Daten an alle verbundenen Clients zu senden.
- (BOOL)sendDataToAllPeers:(NSData *)data withDataMode:(GKSendDataMode)mode
error:(NSError **)error
Die Übertragung der Daten findet mit bereitgestellten APIs von GameKit statt. Die Struktur der zu übertragenden Daten kann frei gewählt werden, auf welche nun eingegangen wird.
Die Kommunikation zwischen den verschiedenen iPhones und dem iPad ist wohl definiert. Die Daten werden in sogenannten Paketen zwischen dem Server und den Clients ausgetauscht. Diese Pakete haben einen klar strukturierten Header, auf welchen nun näher eingegangen wird.
Ein typischer Header in der App besteht aus 10 Bytes, gefolgt von dem Payload, den eigentlichen Daten.
0x69505072
typedef enum {
DataPacketTypeSignInRequest = 0x01,
DataPacketTypeSignInResponse = 0x02,
DataPacketTypeServerReady = 0x03,
DataPacketTypeServerQuit = 0x04,
DataPacketTypeUserQuit = 0x05
} DataPacketType;
Nehmen wir das Beispiel einer SignIn-Response. Da es das erste Packet ist, wird die Nummer 1 vergeben. Dies entspricht dem Wert 0x0001. Es handelt sich um einen SignIn-Response, daher wird der Packettyp auf 0x02 gesetzt. Folgendes Bild zeigt das komplette Packet, welches versendet wird.
Xcode ist die von Apple angebotene IDE zur Entwicklung von iOS und Mac Applikationen. Xcode bietet Möglichkeiten, die entwickelte App auf einem Simulator wie auch auf einem realen iOS Gerät zu testen. Als VCS unterstützt Xcode Git und SVN. In diesem Projekt wird Git verwendet
(Schritt 1).
Der Source-Code wird auf GitHub in einem öffentlichen Repository gehalten. Jenkins wird informiert, sobald ein neuer Change gepusht worden ist (Schritt 2).
Jenkins wird verwendet, um die App kontinuierlich zu bauen. Wurde ein Change auf Github veröffentlicht, wird ein Jenkins Job durchloffen. Der Job besteht aus zwei Teilen. Zuerst werden die Unittests angestossen. Sind alle Unittests erfolgreich ausgeführt worden, wird das Artefakt gebildet. Das Artefakt ist ein IPA File, welches sich auf iOS Geräten installieren lässt
(Schritt 3).
Nachfolgend wird ein typischer Ablauf innerhalb der App durch ein Sequenzdiagramm dargestellt. Die App wurde mit Hilfe einer Zustandsmaschine entwickelt. Entsprechend wurden im Sequenzdiagramm die verschiedenen Zustände erwähnt.
Die App enthält zwei verschiedene Typen von Zustandsmaschinen. Für den ersten Teil der App, den eigentlichen Verbindungsaufbau, wird eine Ereignisgetriebene-Zustandsmaschine verwendet. Im zweiten Teil, der Kommunikation zwischen den Clients und dem Server, wird eine klassische Zustandsmaschine verwendet.
Die einzelnen Schritte der App werden nachfolgend erläutert und die verschiedenen Zustände detailliert erklärt.
Öffnet man die App auf dem iPhone, wird dem User folgender Screen präsentiert. Die App befindet sich zu diesem Zeitpunkt im Zustand ClientStateIdle.
Die iPad App verhält sich sehr ähnlich. Dem User wird ebenfalls ein Startscreen präsentiert. Die App auf dem iPad befindet sich im Zustand ServerStateIdle.
Im nächsten Schritt möchte sich der User zu einem neuen Planning Poker hinzufügen. Dabei hat er die Möglichkeit, den Namen seines iPhones zu bestimmen. Standardmässig wird der Gerätename verwendet.
Ist der User mit dem Namen zufrieden, versucht sich die App mit einem iPad zu verbinden. Zu diesem Zeitpunkt befindet sich die App im Zustand ClientStateLookingForServers.
Der Scrum Master startet ein neues Planning Poker auf dem iPad. Dabei wird ihm eine (leere) Tabelle präsentiert. Das iPad befindet sich nun im Verbindungsmodus und ist für die iPhones sichtbar. Alle iPhones, welche sich erfolgreich mit dem iPad verbunden haben, werden in dieser Tabelle dargestellt. Die App befindet sich im Status ServerStateAcceptingConnections.
Das iPhone erhält ein Ereignis, welches ihm mitteilt, dass ein iPad gefunden worden ist. Das iPhone stellt nun eine Verbindung her. Die App befindet sich im Zustand ClientStateConnecting.
Wurde eine erfolgreiche Verbindung mit dem iPad hergestellt, erhält das iPhone wiederum ein Ereignis, welches die Verbindung zum iPad bestätigt. Dies führt zum Zustand ClientStateConnected. Nun wird auf ein SignIn-Request gewartet. Die App befindet sich im Zustand PlanningPokerCardsWaitingForSignIn.
Haben sich alle Teilnehmer mit dem iPad verbunden, initiiert der Scrum Master das eigentliche Planning Poker. Das iPad ist ab diesem Zeitpunkt nicht mehr auffindbar und der Zustand wird auf ServerStateStopAcceptingNewConnections gesetzt.
Jedem verbundenen iPhone wird ein SignIn-Request geschickt. Zu diesem Zeitpunkt befindet sich die App im Zustand PlanningPokerDeckWaitingForSignIn. Haben alle iPhones mit einer SignIn-Response geantwortet, wird ein Ready-Kommando geschickt und folgendes UI angezeigt. Die App befindet sich nun im Zustand PlanningPokerDeckWaitingForCardValues. Das iPad ist nun bereit für ein Planning Poker.
Wie bereits erwähnt, erhält das iPhone ein SignIn-Request vom iPad. Das iPhone antwortet mit einer SignIn-Response und geht in den Zustand PlanningPokerCardsWaitingForReady über. Danach wird vom iPad das erwähnte Ready-Kommando gesendet. Dies führt zum Zustand PlanningPokerCardsChooseCardValue und folgendes UI erscheint auf dem iPhone.
Nun können die Teilnehmer eine Karte auf dem iPhone wählen. Der Wert der Karte wird auf das iPad übertragen. Sollte sich ein Teilnehmer doch noch für eine andere Karte entscheiden, kann er dies tun, solange noch nicht alle anderen Teilnehmer eine Karte ausgewählt haben. Dies ist der Grund, wieso die App in diesem Schritt im Status PlanningPokerCardsChooseCardValue verbleibt.
Haben sich alle Teilnehmer für eine Karte entschieden, geht die App in den Zustand PlanningPokerDeckShowCardValues über und die Karten der einzelnen Teilnehmer werden auf dem iPad angezeigt. Den iPhones wird ebenfalls mitgeteilt, dass nun die Karten dargestellt werden.
Sobald die Karten auf dem iPad dargestellt werden, wird dies dem iPhone mitgeteilt. Das UI wird deaktiviert und eine Kartenauswahl ist für den Moment nicht mehr möglich. Die App befindet sich im Zustand PlanningPokerCardsWaitingForNextRound.
Soll eine neue Runde gestartet werden, schickt das iPad den iPhones ein entsprechendes Kommando. Die Kartenwerte auf dem iPad verschwinden und das UI auf dem iPhone wird wieder aktiviert. Das iPhone befindet sich wieder im Zustand PlanningPokerDeckWaitingForCardValues und die iPhones im Zustand PlanningPokerCardsChooseCardValue. Es kann eine neue Runde gespielt werden.
Es war spannend eine so komplexe iOS App zu entwickeln. Was mich erfreut, ist die Tatsache, dass alle definierten Ziele erreichten wurden:
Das Requirements Engineering konnte optimal und zielführend durchgeführt werden. Es war hilfreich, dass ich bereits die Vorlesung von Herrn Bachmann besucht habe, welche sich exakt dieser Theamtik widmete.
Es gab im Internet leider nicht viele hilfreiche Quellen, dafür war aber die Dokumentation von Apple ausgezeichnet. Spannend war auch, dass Apple mit iOS7 genau die von mir verwendetet API aus GameKit herausgelöst hat. Dies ist eine logische Evolution dieser API. Ich kann mir vorstellen, dass solche Apps in Zukunft immer beliebter werden und noch in einer grösseren Anzahl erscheinen werden.
Das Schreiben eines eigenen Netzwerkprotokolls war eine Herausforderung. Wir haben bisher im Studium wenig auf diesem Level gemacht, aber ich denke, die erarbeitete Lösung hat die Anforderungen erfüllt. Ausserden ist das Protokoll erweiterbar, was ein persönliches Ziel bei der Definition des Protokolls war. Es war äusserst spannend wieder mal mit Bits, Bytes und Hex zu arbeiten.
Dass eine voll funktionsumfassende App entstanden ist, erfüllt mich mit Stolz. Mit iOS7 wurd ein flaches UI eingeführt, was mir mit meinen bescheidenen Designfähigkeiten in die Hände spielte. Das simple UI passt ausserordentlich gut zu iOS7 und vereinfacht das Arbeiten mit der App.< br/> Der nächste Schritt nach der Abgabe der Semsterarbeit, wird die Veröffentlichung der App im AppStore sein. Ich erhoffe mir, dass auch weitere Teams von dieser App profitieren können. In unserem Team wird die App bereits eingesetzt und hat uns das Leben vereinfacht.
Insgesamt kann ich sagen, dass die Semesterarbeit viel Spass und Schweiss bereitet hat. Der Aufwand der Dokumentation darf nie unterschätzt werden, was ich bei meiner nächsten Arbeit besser berücksichtigen werde. Ein gutes Projektmanagment fördert den reibungslosen Ablauf der Arbeit, dies werde ich weiterhin so machen werden.
Viel Spass beim nächsten Planning Poker!
API: Application Programming Interface, bezeichnet die Schnittstelle, über welche der Client Daten vom Server abruft.
Client: Ein Anwendungsprogramm, welches auf dem Gerät des Benutzers läuft und meist mit einem Server kommuniziert.
Server: Eine Komponente, welche verschiedene Requests von Clients erhält und auf diese reagieren kann.
UI: Kurzschreibweise für User Interface. Das Aussehen einer Applikation.
Enum: Ein Aufzählungstyp mit einer endlichen Menge an konstanten Typen.
UUID: Steht für Universally Unique Identifier. In diesem Projekt eine eindeutige Nummer für einen Client.
Byte: Ein Byte besteht aus 8 Bit. Es ist eine Masseinheit in der Informatik
Hexadezimalsystem: Dieses Stellwertsystem wird zur Basis 16 dargestellt. Im Unteschied zum Dezimalsystem, welches zur Basis 10 dargestellt wird.
SVN: Ist eine Software zur Versionsverwaltung von Dateien von Apache.
Git: Ebenfalls eine Software zur Versionsverwaltung. Wurde ursprünglich für Linux entwickelt. Der grösste Unteschied zu SVN ist die dezentrale Verwaltung des Sourcecodes.
Artefakt: Ist das Ergebnis eines Buildprozesses. Es ist die fertige Software, welche auf Endgärten installiert werden kann.
Stephen G. Kochan: Programming in Objective-C 2.0(5. Auflage), 2013, 978-0321887283, Amsterdam: Addison-Wesley Longman
Ken Schwaber, Mike Beedle: Agile Software Development with Scrum, 2001, 978-0130676344