Thomas Sillmann
Apps für iOS 9 professionell entwickeln
Sauberen Code schreiben mit Objective-C und Swift. Stabile Apps programmieren. Techniken & Methoden von Grund auf verstehen
Vorwort
22
1 Über iOS
26
1.1 Was ist iOS?
26
1.1.1 iOS und OS X
27
1.1.2 Besonderheiten der iOS-Plattform
27
1.2 iOS für Entwickler
28
1.2.1 Hardware für Entwickler
29
1.2.2 Software für Entwickler
30
1.2.3 Das Apple Developer Program
31
1.3 Der Aufbau von iOS
33
1.3.1 Die vier Schichten von iOS
33
1.4 Die perfekte iOS-App
35
1.4.1 Apple Human Interface Guidelines
36
2 Die Programmiersprache – Objective-C
38
2.1 Über Objective-C und objektorientierte Programmierung
38
2.2 Grundlagen der Programmierung
39
2.2.1 Objekte
39
2.2.2 Primitive Datentypen
40
2.2.3 Variablen
41
2.2.4 Operatoren
42
2.2.5 Abfragen und Schleifen
43
2.2.6 Kommentare
47
2.3 Aufbau einer Klasse
48
2.3.1 Die Header-Datei
48
2.3.2 Die Implementation-Datei
50
2.3.3 Los geht’s: Unsere erste Klasse!
51
2.4 Methoden
55
2.4.1 Aufbau von Methoden
55
2.4.2 Methoden in Header- und Implementation-Dateien einer Klasse
57
2.4.3 Implementierung von Methoden
58
2.4.4 Methoden aufrufen
61
2.4.5 Klassen- und Instanzmethoden
62
2.5 Instanzvariablen
63
2.6 Properties
64
2.6.1 Aufbau einer Property
65
2.6.2 Die Punktnotation
67
2.6.3 Optionen
68
2.6.4 Direktzugriff auf Properties
69
2.6.5 Setter und Getter überschreiben
71
2.7 Konstanten
74
2.7.1 Deklaration von Konstanten
74
2.8 Namenskonventionen
75
2.8.1 Klassen
75
2.8.2 Methoden
76
2.8.3 Properties
76
2.9 Strukturen
76
2.9.1 enum
77
2.9.2 typedef
77
2.10 Initialisierung von Objekten
78
2.10.1 alloc und init
79
2.10.2 Zeiger
81
2.11 init im Detail
82
2.11.1 Erstellen mehrerer init-Methoden
84
2.11.2 Designated Initializer
85
2.12 Vererbung
87
2.12.1 Methoden der Superklasse überschreiben
89
2.13 Kategorien
91
2.13.1 Aufbau von Kategorien
91
2.13.2 Kategorien in Xcode erstellen
92
2.14 Erweiterungen
94
2.14.1 Aufbau von Erweiterungen
94
2.14.2 Erweiterungen innerhalb der Implementation-Datei
95
2.14.3 Erweiterungen in Xcode erstellen
96
2.15 Protokolle
97
2.15.1 Aufbau von Protokollen
98
2.15.2 Zuweisen eines Protokolls zu einer Klasse
99
2.15.3 Vererbung in Protokollen
99
2.15.4 Protokolle in Xcode erstellen
100
2.16 #import und @class
101
2.16.1 #import
101
2.16.2 @class
102
2.17 Blöcke
104
2.17.1 Ja zu Blöcken!
104
2.17.2 Was sind Blöcke?
104
2.17.3 Aufbau eines Blocks
105
2.17.4 Blockvariablen
109
2.17.5 Globale Blöcke
109
2.18 Singletons
110
3 Der Neue im Club – Swift
114
3.1 Programmierst du noch oder swifst du schon?
114
3.1.1 Über Swift
114
3.1.2 Voraussetzungen zur Nutzung von Swift
114
3.1.3 Swift und Objective-C
115
3.1.4 Playgrounds
115
3.2 Grundlagen der Programmierung
117
3.2.1 Fundamental Types
117
3.2.2 Variablen und Konstanten
118
3.2.3 Operatoren
120
3.2.4 Abfragen und Schleifen
121
3.2.5 Kommentare
127
3.2.6 print
128
3.3 Fundamental Types im Detail
130
3.3.1 Strings
130
3.3.2 Arrays
133
3.3.3 Dictionaries
139
3.3.4 Any und AnyObject
142
3.4 Aufbau einer Klasse
142
3.4.1 Erstellen einer Instanz einer Klasse
145
3.4.2 Zugriff auf Eigenschaften einer Klasse
145
3.5 Methoden
146
3.5.1 Methodenmit Rückgabewert
147
3.5.2 Methoden mit Parametern
148
3.5.3 Local und External Parameter Names
151
3.5.4 Aufruf von Methoden einer Klasse
153
3.5.5 Zugriff auf andere Eigenschaften und Methoden einer Klasse
154
3.5.6 Klassen- und Instanzmethoden
155
3.6 Properties
157
3.6.1 Computed Properties
157
3.6.2 Property Observers
160
3.6.3 Type Properties
161
3.7 Vererbung
162
3.7.1 Überschreiben von Eigenschaften und Methoden der Superklasse
164
3.7.2 Zugriff auf Eigenschaften und Methoden der Superklasse
165
3.8 Optionals
166
3.8.1 Deklaration von Optionals
166
3.8.2 Zugriff auf Optionals
167
3.9 Initialisierung
170
3.9.1 Schreiben von Initializern
171
3.9.2 Designated und Convenience Initializer
175
3.9.3 Initializer und Vererbung
176
3.9.4 Deinitialisierung
178
3.10 Type Casting
179
3.10.1 Typ prüfen
179
3.10.2 Downcasting
181
3.11 Enumerations
183
3.11.1 Zusätzliche Werte in Member einer Enumeration speichern
184
3.12 Structures
186
3.13 Error Handling Model
187
3.14 Extensions
189
3.15 Protocols
190
3.15.1 Protocol Type
191
3.16 Access Control
193
4 Programmierung für iOS
196
4.1 Grundlagen
196
4.2 Foundation Framework
196
4.2.1 Die wichtigsten Klassen aus dem Foundation Framework und ihre Funktionen
197
4.3 UIKit Framework
201
4.4 Speicherverwaltung mit ARC
202
4.5 Besonderheiten von Objective-C
205
4.5.1 Kurzschreibweisen zum Erstellen von Objekten
206
4.5.2 Vergleichen der Werte von verschiedenen Objekten
208
4.5.3 Schlüsselwörter zum Zusammenspiel mit Optionals
209
4.6 Besonderheiten von Swift
210
4.6.1 Zusammenspiel zwischen Fundamental Types und Foundation-Framework-Klassen
210
4.6.2 Playgrounds im Detail
211
4.7 Objective-C und Swift vereint
215
4.7.1 Objective-C-Code in Swift verwenden
215
4.7.2 Swift-Code in Objective-C verwenden
216
4.8 NSError
217
4.8.1 Eigene Methode mit NSError-Parameter erstellen
218
4.9 Doxygen-Dokumentation
219
4.9.1 Besonderheiten bei Methoden
221
4.9.2 Doxygen-Dokumentation in Xcode
222
4.10 Nebenläufigkeit mit Grand Central Dispatch
223
4.10.1 Parallel laufenden Code erstellen
224
4.11 Grundlegende Struktur einer App
226
4.11.1 main.m
226
4.11.2 Info.plist
226
4.11.3 App Delegate
227
4.12 Lebenszyklus einer iOS-App
228
4.12.1 Start einer App
228
4.12.2 Lebenszyklus einer App
229
4.12.3 Die Methoden des App Delegate
230
4.12.4 Start der App
231
4.13 Tipps für die tägliche Arbeit
233
4.13.1 Die netten Kleinigkeiten .?.?.
233
4.13.2 Fast Enumeration in Objective-C
234
4.13.3 Type Casting in Objective-C
234
4.13.4 Xcode-Beispielprojekte
235
5 Die Entwicklungsumgebung – Xcode
236
5.1 Willkommen bei Xcode!
236
5.1.1 Was ist Xcode?
237
5.1.2 Interface Builder und Xcode – endlich vereint!
237
5.2 Arbeiten mit Xcode
238
5.2.1 Dateien und Formate eines Xcode-Projekts
238
5.2.2 Umgang mit Dateien und Ordnern in Xcode
243
5.3 Der Aufbau von Xcode
246
5.3.1 Die Toolbar
246
5.3.2 Die Navigation Area
248
5.3.3 Die Editor Area
252
5.3.4 Die Utilities Area
254
5.3.5 Die Debug Area
255
5.4 Einstellungen in Xcode
256
5.4.1 Anpassen von Xcode
256
5.4.2 General
256
5.4.3 Accounts
257
5.4.4 Behaviors
258
5.4.5 Navigation
258
5.4.6 Fonts & Colors
259
5.4.7 Text Editing
260
5.4.8 Key Bindings
260
5.4.9 Source Control
261
5.4.10 Downloads
262
5.4.11 Locations
262
5.5 Projekteinstellungen
263
5.5.1 Grundlagen
263
3.5.2 Einstellungen am Projekt
265
5.5.2 Einstellungen am Target
268
5.5.3 Einstellungen am Scheme
274
5.6 Grafiken und Asset-Bundles
277
5.7 Lokalisierung mit Localizable.strings
279
5.7.1 Grundlagen
279
5.7.2 NSLocalizedString
279
5.7.3 Erstellen der Localizable.strings-Datei
280
5.7.4 Localized String mit Parameter
282
5.7.5 Alle Localized Strings automatisch auslesen
283
5.8 Der iOS-Simulator
284
5.8.1 Grundlagen
284
5.8.2 Funktionen und Möglichkeiten des Simulators
284
5.8.3 Performance und Einschränkungen des Simulators
288
5.9 Dokumentation
288
5.9.1 Nichts geht über die Dokumentation!
288
5.9.2 Das Documentation-Window
290
5.9.3 Direktes Aufrufen der Dokumentation aus Xcode heraus
293
5.10 Devices
294
5.11 Organizer
296
5.12 Projects
299
5.13 Debugging in Xcode
300
5.13.1 Grundlagen – über das Debugging
300
5.13.2 Die Debug Area
300
5.13.3 Die Arbeit mit dem Debugger – NSLog und Breakpoints
302
5.13.4 Debug Navigator
310
5.14 Refactoring
311
5.14.1 Grundlagen
311
5.14.2 Refactoring-Funktionen in Xcode
312
5.15 Instruments
314
5.15.1 Über Instruments
314
5.15.2 Nächste Schritte
317
5.16 Tipps für die tägliche Arbeit
318
5.16.1 Man lernt immer was dazu!
318
5.16.2 Code Snippets
318
5.16.3 Open Quickly
319
5.16.4 Caller einer Methode feststellen
320
5.16.5 Speicherorte für Ordner und Dateien ändern
321
5.16.6 Shortcuts für die Navigation Area
321
5.16.7 Run Without Building
322
5.16.8 Clean Build
322
6 MVC – Model-View-Controller
324
6.1 MVC?.?.?. was?
324
6.2 MVC in der Praxis
326
6.3 Kommunikation zwischen Model und Controller
326
6.3.1 Key-Value-Observing
327
6.3.2 Notifications
333
6.4 Kommunikation zwischen View und Controller
335
6.4.1 Target-Action
335
6.4.2 Delegates
337
7 Die Vielfalt der (View-)Controller
340
7.1 Alles beginnt mit einem View- Controller .?.?.
340
7.2 UIViewController – die Mutter aller View-Controller
342
7.2.1 Wichtige Methoden von UIViewController
343
7.2.2 UIView – fester Bestandteil eines jeden UIViewControllers
347
7.3 View-Controller-Hierarchien
348
7.4 View-Controller erstellen mit dem Interface Builder
350
7.4.1 View-Controller mit Nib-File
351
7.5 Storyboards
382
7.5.1 Über Storyboards
382
7.5.2 Das Storyboard-Projekt
383
7.5.3 Die Klasse UIStoryboard
392
7.5.4 Segues
394
7.5.5 Zugriff über den App Delegate
397
7.5.6 Quo vadis – Storyboard oder Nib-File?
398
7.6 Auto Layout
399
7.6.1 Setzen und Konfigurieren von Constraints
400
7.6.2 Constraints bearbeiten und weiter anpassen
401
7.6.3 „Optimale“ Constraints automatisch setzen lassen
403
7.7 UIViewController und seine Subklassen
404
7.7.1 UINavigationController
404
7.7.2 UITabBarController
410
7.7.3 UITableViewController
414
7.7.4 UICollectionViewController
421
7.7.5 UISplitViewController
423
8 Views erstellen und gestalten
426
8.1 Über Views in iOS
426
8.2 UIView – die Mutter aller Views
426
8.3 Arbeiten mit UIView
427
8.3.1 Programmatisches Erstellen einer UIView
427
8.3.2 View-Hierarchien
429
8.3.3 Weiterführendes zu UIView
433
8.4 Views erstellen mit dem Interface Builder
434
8.4.1 Grundlagen
434
8.4.2 View-Klasse mit Nib-File erstellen
435
8.4.3 Beliebiges Nib-File laden und verwenden
439
8.4.4 Nib-File nachträglich erstellen
440
8.4.5 Unterschiedliche Nib-Files für iPhone und iPad erstellen
442
8.5 Die wichtigsten Views und ihre Funktionen
444
8.5.1 Grundlagen
444
8.5.2 UILabel
444
8.5.3 UIButton
444
8.5.4 UISwitch
445
8.5.5 UISegmentedControl
445
8.5.6 UITextField
445
8.5.7 UIImageView
446
8.5.8 UIAlertView
446
8.5.9 UIActionSheet
448
8.5.10 UIPickerView
448
8.5.11 UIDatePicker
449
8.5.12 UIWebView
449
8.5.13 UIMapView
450
8.5.14 UIScrollView
450
8.5.15 UITextView
451
8.5.16 UITableView
452
8.5.17 UICollectionView
452
8.5.18 Wichtig und unerlässlich: die Dokumentation!
452
8.5.19 Views und der Interface Builder
453
8.6 Die Grundlage gut gestalteter Views
453
9 Das Model und die Datenhaltung
456
9.1 Die Logik Ihrer App
456
9.2 Benutzereinstellungen sichern und nutzen
457
9.2.2 Über NSUserDefaults
457
9.2.3 Standardeinstellungen festlegen
459
9.2.4 NSUserDefaults zurücksetzen
460
9.3 Zugriff auf das Dateisystem
460
9.3.1 Das Dateisystem von iOS
460
9.3.2 NSFileManager
461
9.3.3 File-Sharing-Funktion nutzen
468
9.4 Core Data
469
9.4.1 Datenbankverwaltung mit Core Data
469
9.4.2 Wie funktioniert Core Data?
470
9.4.3 Die Klassen und Bestandteile von Core Data
471
9.4.4 Aufbau eines Standard-Core Data Stacks
472
9.4.5 Der Core Data-Editor
475
9.4.6 Erstellen eines neuen Managed-Objects
483
9.4.7 Löschen eines Managed-Objects
484
9.4.8 Laden von Managed-Objects
484
9.4.9 Was kommt als Nächstes?
485
10 Local und Push Notifications
486
10.1 Was sind Notifications?
486
10.2 Registrieren von Notification Types
488
10.3 Registrieren von Notification Categories und Actions
490
10.3.1 Erstellen einer Action
491
10.3.2 Erstellen einer Kategorie
492
10.3.3 Reagieren auf eine Action
494
10.4 Local Notifications
496
10.4.1 Festlegen des Ausführungstermins
497
10.4.2 Konfiguration des Alerts
498
10.4.3 Konfiguration des Sounds
500
10.4.4 Konfiguration des Badge Values
501
10.4.5 Speichern zusätzlicher Informationen in einer Local Notification
501
10.4.6 Registrieren von Local Notifications im System
502
10.4.7 Abbrechen bereits registrierter Local Notifications
503
10.4.8 Reagieren auf Feuern und Auswahl einer Local Notification
503
10.5 Push Notifications
504
10.5.1 Versand von Push Notifications
505
10.5.2 Erstellen einer Push Notification
509
10.5.3 Qualitiy of Service
511
11 Extensions
512
11.1 Verfügbare Typen von Extensions
512
11.2 Erstellen von Extensions in Xcode
514
11.3 Aufbau einer Extension
517
11.4 Funktionsweise einer Extension
517
11.5 Wichtige Klassen und Objekte
518
11.6 Unterstützte Dateitypen für Share- und Action-Extensions festlegen
519
11.7 Today
521
11.7.1 Today-Extension testen
523
11.8 Share
524
11.9 Action
525
11.9.1 Action mit User Interface
525
11.9.2 Action ohne User Interface
526
11.10 Photo Editing
527
11.10.1 Festlegen der unterstützten Typen zur Bearbeitung
531
11.11 Document Provider
532
11.11.1 Document Provider-Extension
533
11.11.2 File Provider-Extension
536
11.11.3 Document Provider aufrufen
538
11.12 Custom Keyboard
540
11.12.1 Erstellen eines Custom Keyboards
540
11.12.2 Arbeit mit der Klasse UIInputViewController
540
11.12.3 Bearbeiten und Setzen von Text
542
11.12.4 Mehrsprachige Keyboards
543
11.13 Content Blocker
544
11.13.1 Konfiguration eines Content Blockers
545
11.13.2 Aktualisieren eines Content Blockers
548
11.13.3 Die Klasse ActionRequestHandler
548
11.14 Shared Links
549
11.14.1 Erstellen eines NSExtensionItem
551
11.14.2 NSExtensionItem als Shared Link bereitstellen
552
11.15 Watch App
553
11.16 App Groups
553
11.16.1 Registrieren einer App Group im Apple Developer Portal
553
11.16.2 Registrieren einer App Group innerhalb einer App
555
11.16.3 Zugriff auf eine App Group
555
12 App-Entwicklung für die Apple Watch
558
12.1 Apples neues großes Ding: Die Apple Watch
558
12.2 Möglichkeiten, Einschränkungen, Unterschiede
559
12.3 Das WatchKit SDK
561
12.3.1 WKInterfaceController
561
12.3.2 WKInterfaceObject
562
12.3.3 WKExtensionDelegate
563
12.3.4 Weitere Klassen
563
12.4 Aufbau und Funktionsweise von Apple Watch-Apps
563
12.4.1 iPhone-App
564
12.4.2 WatchKit Extension
564
12.4.3 WatchKit App
564
12.4.4 Verbindung von WatchKit Extension und WatchKit App
565
12.4.5 Notification Scene und Glance Scene
565
12.4.6 Complications
566
12.5 Erstellen einer WatchKit App mitsamt WatchKit Extension
566
12.5.1 Dateien der WatchKit Extension
569
12.5.2 Dateien der WatchKit App
569
12.5.3 Ausführen und Testen der Apple Watch-App
570
12.6 Lebenszyklus einer WatchKit App
571
12.7 Der WKInterfaceController im Detail
573
12.7.1 Initialisierung
573
12.7.2 Activation Events
574
12.7.3 Setzen des Titels
575
12.7.4 Ein- und Ausblenden von Interface-Controllern
575
12.7.5 Umsetzen eines Navigation Stacks
577
12.7.6 Reaktion auf Storyboard-Events
578
12.7.7 Weitere Attribute
579
12.7.8 Weitere Funktionen von WKInterfaceController
580
12.8 Arbeiten mit dem Interface-Storyboard einer WatchKit App
580
12.8.1 Erstellen und Konfigurieren eines WKInterfaceController
581
12.8.2 Hinzufügen und Konfigurieren von Interface-Elementen
582
12.8.3 Positionierung und Anordnung von Interface-Elementen
583
12.8.4 Ändern der Größe von Interface-Elementen
584
12.8.5 Unterschiedliche Konfigurationen für verschiedene Apple Watch-Größen
586
12.8.6 Gruppierung von Interface-Elementen mittels WKInterfaceGroup
588
12.8.7 Verbindung von Storyboard und Code
589
12.8.8 Zusammenfassen mehrerer Interface-Controller zu einem page-based Interface
592
12.8.9 Erstellen und Konfigurieren von Segues
592
12.9 Erstellen von Tabellen
595
12.9.1 Hinzufügen einer Tabelle im Storyboard
595
12.9.2 Konfiguration einer Zelle
596
12.9.3 Konfiguration einer Tabelle
600
12.9.4 Verwenden verschiedener Zellen in einer Tabelle
602
12.9.5 Zellen hinzufügen und entfernen
604
12.9.6 Direkt zu Zelle scrollen
606
12.9.7 Aktuelle Anzahl an Zellen auslesen
606
12.9.8 Auf Auswahl einer Zelle reagieren
606
12.9.9 Segues von Zellen einer Tabelle über das Storyboard konfigurieren
607
12.10 Erstellen von Menüs
609
12.10.1 Erstellen eines Menüs im Storyboard
610
12.10.2 Erstellen eines Menüs im Code
613
12.10.3 Fazit: Menüerstellung im Storyboard oder Code?
616
12.10.4 Mischen von Menüpunkten aus Storyboard und Code
616
12.11 Eingabe von Text
616
12.12 Glance Scene
618
12.12.1 Erstellen einer Glance Scene
620
12.12.2 Lebenszyklus einer Glance Scene
621
12.12.3 Angepasster App-Start mittels Glance Scene
621
12.12.4 Testen einer Glance Scene
623
12.13 Notification Scene
624
12.13.1 Short-Look und Long-Look Interface
624
12.13.2 Long-Look Interface im Detail
625
12.13.3 Erstellen eigener Notification Scenes
626
12.13.4 Reaktion auf Action-Buttons
634
12.13.5 Testen einer Notification Scene
636
12.14 Complications
636
12.14.1 Was sind Complications?
637
12.14.2 Das ClockKit Framework
637
12.14.3 Aufbau und Bestandteile von Complications
637
12.14.4 Vorbereiten des eigenen Projekts
641
12.14.5 Entwicklung einer Complication
642
12.14.6 Bereitstellen der Complication mittels CLKComplicationDataSource
646
12.15 Kommunikation und Datenaustausch zwischen iOS und watchOS
650
12.15.1 WatchConnectivity
651
12.16 Was sonst noch zu sagen und zu beachten ist
656
13 Unit-Tests
658
13.1 Unit-Tests in der iOS-Entwicklung
658
13.1.1 Grundlagen
658
13.1.2 Aufbau und Funktionsweise von Tests
662
13.1.3 Aufbau einer Test-Case-Klasse
664
13.1.4 Neue Test-Case-Klasse erstellen
665
13.1.5 Ausführen von Tests
666
13.1.6 Was sollte ich eigentlich testen?
667
13.2 Performance-Tests
668
13.3 UI-Testing
670
13.3.1 Klassen für UI-Testing
671
13.3.2 Aufbau von UI-Testing-Klassen
673
13.3.3 Erstellen von UI-Tests
674
13.3.4 Einsatz von UI-Tests
674
13.4 Test-Driven Development
675
14 Versionierung mit Git
676
14.1 Über Versionskontrolle
676
14.2 Basisfunktionen und -begriffe von Git
676
14.2.1 Begriffe
676
14.2.2 Funktionen
677
14.3 Source Control in Xcode
678
14.4 Version Editor und Source Control
682
15 Veröffentlichung im App Store
686
15.1 Zertifikate, Provisioning Profiles und Ihre App
686
15.1.1 Certificates, Identifiers & Profiles
688
15.1.2 Erstellen von .?.?.
690
15.2 Testen auf dem eigenen Endgerät
703
15.2.1 Setzen des Teams
703
15.2.2 Auswahl Ihres iOS-Geräts
704
15.3 iTunes Connect und Veröffentlichung im App Store
706
15.3.1 Vorbereiten der App in iTunes Connect
707
15.3.2 Upload der App in den App Store
710
15.3.3 Wie geht es weiter?
712
Index
714
© 2009-2024 ciando GmbH