SKIP THE SHIPPING
Use code NOSHIP during checkout to save 40% on eligible eBooks, now through January 5. Shop now.
Register your product to gain access to bonus material or receive a coupon.
In just 24 sessions of one hour each, learn how to build powerful applications for today’s hottest handheld devices: the iPhone and iPad! Using this book’s straightforward, step-by-step approach, you’ll master every skill and technology you need, from setting up your iOS development environment to building great user interfaces, sensing motion to writing multitasking applications. Each lesson builds on what you’ve already learned, giving you a rock-solid foundation for real-world success!
John Ray is currently serving as the Director of the Office of Research Information Systems at the Ohio State University. His many books include Using TCP/IP: Special Edition, Maximum Mac OS X Security, Mac OS X Unleashed, Teach Yourself Dreamweaver MX in 21 Days, and Sams Teach Yourself iOS 7 Application Development in 24 Hours.
Printed in full color–figures and code appear as they do in Xcode
Please download the appendix associated with STY iOS 8 Application Development in 24 Hours only available here.
Please download the code here.
Please visit the website associated with STY iOS 8 Application Development in 24 Hours at here.
Discovering Swift and the iOS Playground
Preface to iOS 8 Application Development in 24 Hours, Sams Teach Yourself
Download the sample pages (includes Chapter 3 and Index)
Introduction 1
HOUR 1: Preparing Your System and iDevice for Development 5
Welcome to the iOS Platform . . . . . . . 5
Becoming an iOS Developer . . . . . . . . . . . . . . . . . . . . . . . . . 9
Running an iOS App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Developer Technology Overview . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . 23
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
HOUR 2: Introduction to Xcode and the iOS Simulator 29
Using Xcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Using the iOS Simulator . . . . . . . . . . . . . . . . . . . . . . . . 63
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Summary . . . . . . . . . . . . . . . . . . . . . . . . . 71
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
HOUR 3: Discovering Swift and the iOS Playground 77
Object-Oriented Programming and Swift . . . . . . . . . . . . . . . .. . . . . . . . . . . 77
The Terminology of Object-Oriented Development . . . . . . . . . . . . . . . .. . . . . . . . . 79
Exploring the Swift File Structure . . . . . . . . . . . . . . . . . . . . . . . . . 82
Swift Programming Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Memory Management and Automatic Reference Counting . . . . . . . . . . . . . . . 107
Introducing the iOS Playground . . . . . . . . . . . . . . . . . . . . . . . . 108
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Q&A . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Workshop . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Activities . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
HOUR 4: Inside Cocoa Touch 117
What Is Cocoa Touch? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Exploring the iOS Technology Layers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Tracing the iOS Application Life Cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Cocoa Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Exploring the iOS Frameworks with Xcode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Further Exploration . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 143
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
HOUR 5: Exploring Interface Builder 147
Understanding Interface Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Creating User Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Customizing the Interface Appearance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Connecting to Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
HOUR 6: Model-View-Controller Application Design 185
Understanding the MVC Design Pattern . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
How Xcode Implements MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Using the Single View Application Template . . . . . . . . . . . . . . . . . . . . . . . 191
Further Exploration . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 209
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 210
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
HOUR 7: Working with Text, Keyboards, and Buttons 215
Basic User Input and Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Using Text Fields, Text Views, and Buttons . . . . . . . . . . . . . . . . . . . . . . . . . 217
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
HOUR 8: Handling Images, Animation, Sliders, and Steppers 251
User Input and Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Creating and Managing Image Animations, Sliders, and Steppers . . . . . . . . . . . . . 253
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Summary . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
HOUR 9: Using Advanced Interface Objects and Views 281
User Input and Output (Continued) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Using Switches, Segmented Controls, and Web Views . . . . . . . . . . . . . . .. . . . . 287
Using Scrolling Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Q&A . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
HOUR 10: Getting the User’s Attention 317
Alerting the User . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Exploring User Alert Methods . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 328
Further Exploration . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
HOUR 11: Implementing Multiple Scenes and Popovers 349
Introducing Multiscene Storyboards . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . 350
Using Segues . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . 377
Popovers, Universal Applications, and iPhones . . . . . . . . . . . . . . . .. . . . . . . . 390
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
HOUR 12: Making Choices with Toolbars and Pickers 401
Understanding the Role of Toolbars . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Exploring Pickers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Using the Date Picker . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Using a Custom Picker . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 442
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
HOUR 13: Advanced Storyboards Using Navigation and Tab Bar Controllers 445
Advanced View Controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Exploring Navigation Controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Understanding Tab Bar Controllers . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 452
Using a Navigation Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Using a Tab Bar Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 481
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . 483
HOUR 14: Navigating Information Using Table Views and Split View Controllers 485
Understanding Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
Exploring the Split View Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
A Simple Table View Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Creating a Master-Detail Application . . . . . . . . . . . . . . . . . . . . . . . . . . 507
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . 523
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
HOUR 15: Reading and Writing Application Data 527
iOS Applications and Data Storage . . . . . . . . . . . . . . . . . . . . . . . . 527
Data Storage Approaches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
Creating Implicit Preferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Implementing System Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Implementing File System Storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
HOUR 16: Building Responsive User Interfaces 573
Responsive Interfaces . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 573
Using Auto Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
Programmatically Defined Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
HOUR 17: Using Advanced Touches and Gestures 611
Multitouch Gesture Recognition . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 611
Adding Gesture Recognizers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Using Gesture Recognizers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
HOUR 18: Sensing Orientation and Motion 639
Understanding Motion Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
Accessing Orientation and Motion Data . . . . . . . . . . . . . . . . . . . . . . . . . . 643
Sensing Orientation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Detecting Acceleration, Tilt, and Rotation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Summary . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664
Activities . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666
HOUR 19: Working with Rich Media 669
Exploring Rich Media . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669
The Media Playground Application . . . . . . . . . .. . . . . . . . . . . . . . . 683
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
Activities . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712
HOUR 20: Interacting with Other iOS Services 713
Extending iOS Service Integration . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 713
Using the Address Book, Email, Social Networking, and Maps . . . . . . . . . . . . . . . . . . . . 730
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Workshop . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
HOUR 21: Implementing Location Services 751
Understanding Core Location . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
Creating a Location-Aware Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . 758
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781
HOUR 22: Building Background-Ready Applications 783
Understanding iOS Backgrounding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 783
Disabling Backgrounding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 789
Handling Background Suspension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 790
Implementing Local Notifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792
Using Task-Specific Background Processing. . . . . . . . . . . . . . . . . . . . . 795
Completing a Long-Running Background Task . . . . . . . . . . . . . . . . . . . . . . . 800
Performing a Background Fetch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 810
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 812
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814
HOUR 23: Building Universal Applications 815
Universal Application Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
Size Classes . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . 819
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 833
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 834
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 834
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 834
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 836
HOUR 24: Application Tracing, Monitoring, and Debugging 837
Instant Feedback with NSLog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838
Using the Xcode Debugger . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 841
Further Exploration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 858
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862
Index 863
ONLINE APPENDIX A: Introducing Xcode Source Control