Program the Internet of Things with Swif t for iOS Learn How to Program Apps for the Internet of Things — Second Edition — Ahmed Bakir Program the Internet of Things with Swift for iOS Learn How to Program Apps for the Internet of Things Second Edition Ahmed Bakir Program the Internet of Things with Swift for iOS: Learn How to Program Apps for the Internet of Things Ahmed Bakir devAtelier, Tokyo, Japan ISBN-13 (pbk): 978-1-4842-3512-6 ISBN-13 (electronic): 978-1-4842-3513-3 https://doi.org/10.1007/978-1-4842-3513-3 Library of Congress Control Number: 2018964570 Copyright © 2018 by Ahmed Bakir This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation, broadcasting, reproduction on microfilms or in any other physical way, and transmission or information storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now known or hereafter developed. Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, logo, or image, we use the names, logos, and images only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to proprietary rights. While the advice and information in this book are believed to be true and accurate at the date of publication, neither the author nor the editors nor the publisher can accept any legal responsibility for any errors or omissions that may be made. The publisher makes no warranty, express or implied, with respect to the material contained herein. Managing Director, Apress Media LLC: Welmoed Spahr Acquisitions Editor: Aaron Black Development Editor: James Markham Coordinating Editor: Jessica Vakili Cover image designed by Freepik (www.freepik.com) Distributed to the book trade worldwide by Springer Science+Business Media New York, 233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny@springer- sbm.com, or visit www.springeronline.com. Apress Media, LLC is a California LLC and the sole member (owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc is a Delaware corporation. For information on translations, please e-mail [email protected], or visit www.apress.com/ rights-permissions. Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales web page at www.apress.com/bulk-sales. Any source code or other supplementary material referenced by the author in this book is available to readers on GitHub via the book’s product page, located at www.apress.com/978-1-4842-3512-6. For more detailed information, please visit www.apress.com/source-code. Printed on acid-free paper Dedicated to my mother, Layla Bakir, who shared with me her love of teaching and enduring optimism Table of Contents About the Author �����������������������������������������������������������������������������������������������������xi About the Technical Reviewer �������������������������������������������������������������������������������xiii Acknowledgments ���������������������������������������������������������������������������������������������������xv Introduction �����������������������������������������������������������������������������������������������������������xvii Part 1: Building Health Apps for the Internet of Things ����������������������������������1 Chapter 1: Laying the Foundation for Your First IoT App ������������������������������������������3 Learning Objectives ����������������������������������������������������������������������������������������������������������������������4 Setting Up the Project �������������������������������������������������������������������������������������������������������������������5 Linking Your Apple Developer Account to Xcode �������������������������������������������������������������������13 Building an Adaptive User Interface ��������������������������������������������������������������������������������������������17 Renaming Classes from the Base Template ��������������������������������������������������������������������������19 Laying Out the User Interface ������������������������������������������������������������������������������������������������22 Applying Auto Layout Constraints ������������������������������������������������������������������������������������������24 Customizing the Appearance of Items �����������������������������������������������������������������������������������27 Resolving Auto Layout Issues ������������������������������������������������������������������������������������������������37 Connecting the Storyboard to Your Code ������������������������������������������������������������������������������������41 Defining Interface Builder-Compatible Properties and Methods (Actions) ����������������������������42 Using the Connection Inspector to Make the Final Storyboard Connections �������������������������45 Summary�������������������������������������������������������������������������������������������������������������������������������������50 v Table of ConTenTs Chapter 2: Using Core Location to Build a Workout Tracking App ��������������������������51 Learning Objectives ��������������������������������������������������������������������������������������������������������������������52 Configuring Your Project for Background Location Activity ���������������������������������������������������������52 Requesting Location Permission �������������������������������������������������������������������������������������������������58 Checking for Hardware Availability ����������������������������������������������������������������������������������������62 Responding to Changes in Location Permission Status ��������������������������������������������������������64 Requesting Location Updates �����������������������������������������������������������������������������������������������������72 Responding to Location Updates �������������������������������������������������������������������������������������������74 Displaying Location Data on a Map ���������������������������������������������������������������������������������������������81 Using the Codable Protocol for File-Based Data Storage ������������������������������������������������������82 Displaying Saved Locations on a Map ����������������������������������������������������������������������������������������93 Summary�������������������������������������������������������������������������������������������������������������������������������������96 Chapter 3: Using Core Motion to Add Physical Activity Data to Your Apps ������������97 Learning Objectives ��������������������������������������������������������������������������������������������������������������������98 Requesting Motion Permission from the User ����������������������������������������������������������������������������99 Receiving Real-Time Step Count Updates from the iPhone’s Pedometer ���������������������������������104 Updating the User Interface �������������������������������������������������������������������������������������������������108 Stopping and Pausing Pedometer Updates �������������������������������������������������������������������������111 Getting Activity Type ������������������������������������������������������������������������������������������������������������������113 Handling Altimeter Updates ������������������������������������������������������������������������������������������������������118 Summary�����������������������������������������������������������������������������������������������������������������������������������121 Chapter 4: Using HealthKit to Securely Retrieve and Store Health Data ���������������123 Learning Objectives ������������������������������������������������������������������������������������������������������������������124 Requesting HealthKit Permission ����������������������������������������������������������������������������������������������125 Writing Data to HealthKit �����������������������������������������������������������������������������������������������������������132 Understanding How HealthKit Represents Data ������������������������������������������������������������������132 Creating and Saving HealthKit Samples ������������������������������������������������������������������������������133 Reading Workout Data from HealthKit ��������������������������������������������������������������������������������������143 Using a Table View Controller to Display Data ���������������������������������������������������������������������146 Summary�����������������������������������������������������������������������������������������������������������������������������������160 vi Table of ConTenTs Part 2: Building Your Own Internet Things �������������������������������������������������161 Chapter 5: Building Arduino-Based Peripherals ���������������������������������������������������163 Learning Objectives ������������������������������������������������������������������������������������������������������������������164 Building the Wireless Door-Sensor Hardware ���������������������������������������������������������������������������166 Part List �������������������������������������������������������������������������������������������������������������������������������166 Assembling the Hardware ���������������������������������������������������������������������������������������������������168 Writing an Arduino Solution (Program) ��������������������������������������������������������������������������������������178 Setting Up the Arduino Programming Environment �������������������������������������������������������������179 Using GPIO to Monitor Input Pins and Control Output Pins ��������������������������������������������������184 Calculating Battery Status ���������������������������������������������������������������������������������������������������187 Running and Monitoring the Arduino Solution ���������������������������������������������������������������������188 Summary�����������������������������������������������������������������������������������������������������������������������������������191 Chapter 6: Building a Bluetooth LE Hardware Companion App ����������������������������193 Learning Objectives ������������������������������������������������������������������������������������������������������������������193 A Quick Introduction to Bluetooth LE ����������������������������������������������������������������������������������������195 Adding Bluetooth Functionality to an Arduino Solution �������������������������������������������������������������197 Installing the ESP32_BLE_Arduino Library for Bluetooth Communication ��������������������������198 Setting Up the Arduino As a Bluetooth Peripheral ���������������������������������������������������������������201 Sending Data Updates via Bluetooth LE ������������������������������������������������������������������������������208 Using Core Bluetooth to Communicate with Bluetooth LE Devices �������������������������������������������210 Setting Up the IOTHome Project ������������������������������������������������������������������������������������������211 Setting Up the App As a Central Manager����������������������������������������������������������������������������216 Connecting to a Bluetooth LE Peripheral �����������������������������������������������������������������������������222 Monitoring Characteristic Updates ��������������������������������������������������������������������������������������226 Monitoring Updates While the App Is in the Background ����������������������������������������������������229 Summary�����������������������������������������������������������������������������������������������������������������������������������233 vii Table of ConTenTs Chapter 7: Setting Up a Raspberry Pi and Using It As a HomeKit Bridge �������������235 Learning Objectives ������������������������������������������������������������������������������������������������������������������236 Setting Up the Raspberry Pi HomeKit Bridge ����������������������������������������������������������������������������237 Putting Together the Hardware ��������������������������������������������������������������������������������������������237 Bootstrapping the Raspberry Pi �������������������������������������������������������������������������������������������241 Installing HomeBridge ���������������������������������������������������������������������������������������������������������248 Configuring HomeBridge to Read Data from a Temperature Sensor �����������������������������������253 Configuring HomeBridge to Connect to a Bluetooth LE Accessory ��������������������������������������255 Connecting to Your New HomeKit Bridge ����������������������������������������������������������������������������261 Summary�����������������������������������������������������������������������������������������������������������������������������������266 Chapter 8: Building a Web Server on a Raspberry Pi �������������������������������������������267 Learning Objectives ������������������������������������������������������������������������������������������������������������������268 Creating a Web Server to Share Data over HTTPS ��������������������������������������������������������������������269 Using Express to Expose Web Services �������������������������������������������������������������������������������269 Reading Values from the DHT Temperature Sensor �������������������������������������������������������������273 Reading Information from Bluetooth Devices ����������������������������������������������������������������������276 Using HTTPS to Provide Secure HTTP Connections �������������������������������������������������������������283 Configuring the Server to Start Up with the Raspberry Pi ���������������������������������������������������290 Connecting to Your Server from an iOS App ������������������������������������������������������������������������������292 Setting Up the User Interface ����������������������������������������������������������������������������������������������292 Making and Responding to HTTPS Requests �����������������������������������������������������������������������297 Summary�����������������������������������������������������������������������������������������������������������������������������������309 Part 3: Building Apps Using Apple’s Advanced Internet of Things Technologies �����������������������������������������������������������������������������������311 Chapter 9: Using tvOS to Build an Apple TV Dashboard App ��������������������������������313 Learning Objectives ������������������������������������������������������������������������������������������������������������������314 Setting Up the tvOS Target ��������������������������������������������������������������������������������������������������������315 Creating the User Interface �������������������������������������������������������������������������������������������������������319 Programmatically Styling Elements to Match the tvOS Design Language ��������������������������324 Using Font Awesome for Font-Based Graphics �������������������������������������������������������������������328 viii Table of ConTenTs Adding Data Sources to the tvOS App ���������������������������������������������������������������������������������������332 Requesting User Location ����������������������������������������������������������������������������������������������������335 Connecting to the OpenWeatherMap API �����������������������������������������������������������������������������339 Handling Touch Input from the Siri Remote ������������������������������������������������������������������������������351 Debugging the App on an Apple TV �������������������������������������������������������������������������������������������354 Summary�����������������������������������������������������������������������������������������������������������������������������������358 Chapter 10: Using watchOS to Build an Apple Watch App ������������������������������������359 Learning Objectives ������������������������������������������������������������������������������������������������������������������360 Setting Up the Project ���������������������������������������������������������������������������������������������������������������361 Building a watchOS User Interface �������������������������������������������������������������������������������������������368 Setting Up a Table View Using the WKInterfaceTable Class �������������������������������������������������380 Adding Force Touch Support ������������������������������������������������������������������������������������������������383 Creating a New Workout Using Core Location and Core Motion �����������������������������������������������388 Using HealthKit to Populate the Workout History Table �������������������������������������������������������������401 Summary�����������������������������������������������������������������������������������������������������������������������������������405 Chapter 11: Using Face ID, Touch ID, and Keychain Services to Secure Your Apps �������������������������������������������������������������������������������������������������407 Learning Objectives ������������������������������������������������������������������������������������������������������������������408 Setting Up the Project ���������������������������������������������������������������������������������������������������������������409 Creating a Lock Screen User Interface ��������������������������������������������������������������������������������410 Querying for Sensor Availability ������������������������������������������������������������������������������������������������421 Using Face ID or Touch ID to Restrict Access to Features ���������������������������������������������������������424 Using Keychain Services to Secure Data ����������������������������������������������������������������������������������430 Using Biometrics or an App Password to Lock Keychain Items�������������������������������������������437 Detecting When an App Returns to the Foreground ������������������������������������������������������������������441 Summary�����������������������������������������������������������������������������������������������������������������������������������443 Index ���������������������������������������������������������������������������������������������������������������������445 ix About the Author Ahmed Bakir is an iOS author, teacher, and entrepreneur. After starting his career as a firmware engineer, he made the mistake of telling someone at a party that he was developing iPhone apps for fun and has been inundated with work ever since. He has worked on more than 30 mobile projects, ranging from advising startups to architecting apps for Fortune 500 companies. In 2014, he published his first book, Beginning iOS Media App Development, followed, in 2016, by the first edition of Program the Internet of Things with Swift for iOS. In 2015, he was invited to develop and teach iOS development at UCSD-Extension. He is currently building cool stuff in Tokyo, Japan! You can find him online at www.devatelier.com. xi