Zach Simone Updating Your App for Ios 13

Zach Simone Updating Your App for Ios 13

Updating Your App for iOS 13 Zach Simone /dev/world 2019 Updating Your App for iOS 13 Zach Simone - /dev/world/2019 Hi, I’m Zach � • Final-year student @ University of Technology, Sydney • iOS/tvOS developer @ Kayo Sports • Co-organiser CocoaHeads Sydney • Co-host Cup of Tech podcast Thanks to the AUC for sponsoring our trip to WWDC! � So, how about that WWDC? Shiny new stuff - yay! • SwiftUI • Catalyst • AR/ML • Shortcuts improvements • Sign In with Apple • iPadOS • iOS dark mode Some less-shiny but cool stuff • System colours • SF Symbols • Independent watch apps • New modal presentation styles Where to begin? � First, you need an app Petty - Real-Time Petrol Prices* * Only in NSW, Australia’s best state ??? ??? Updating for watchOS 6 Independent watch apps • Allow an app to run independently of the phone • The app bundle can be downloaded to the watch separately to the iOS app bundle • No guarantee that the watch app can "phone home" using WatchConnectivity • Possible to create a watchOS app without an iOS app attached whatsoever • Better user experience to run the app independently Petty grows up! Possible for independent watch apps • Sign-in and/or account creation. • Text Field API’s (WKInterfaceTextField) • Sync with CloudKit • Sign in with Apple • Permission requests including HealthKit • Can send remote push notifications directly to the Apple Watch • Can’t rely on WatchConnectivity ??? ??? Updating for iOS 13 Scene Delegate • Can now have multiple instances of your app’s user interface on iOS • Aids with support for multi-window on iPad, and macOS • A `SceneDelegate` manages this (as opposed to the `AppDelegate`) • One independent "scene" per window of your app • Still use AppDelegate for non-window specific tasks - such as registering for push notifications Dark Mode Use system colours! Locking to dark (or light) mode Info.plist (locks whole app) <key>UIUserInterfaceStyle</key> <string>Dark</string> Per UIViewController (or UIView) basis overrideUserInterfaceStyle = .dark But… more UI changes • System colours (but not a total theme change) • Backgrounds • Labels • SF Symbols • Modal presentation styles System colours Dynamic system colours Using system colours SwiftUI Color.gray Color.secondary UIKit let blue: UIColor = .systemBlue let viewBackground: UIColor = .systemBackground Using system colours - interface builder Custom dynamic colours Subtle difference depending on light/dark appearance Custom dynamic colours let someColour = UIColor { (traitCollection: UITraitCollection) -> UIColor in return traitCollection.userInterfaceStyle == .dark ? .black : .white } Trait collection of a view is set before the following methods are called: Source: Implementing Dark Mode on iOS session from WWDC19 https://developer.apple.com/videos/play/wwdc2019/214/ SF Symbols • Set of symbols/glyphs • Nine font weights - ultralight to black • Three scales - small, medium, large • Can replace a lot of third-party symbols across an app Using SF Symbols in Petty iOS 12 iOS 13 SF Symbols - how? • SF Symbols macOS app to browse Code SwiftUI: Image(systemName: "map").imageScale(.large) Good ol’ UIKit: var mapImage = UIImage(systemName: "map") SF Symbol Configuration in UIKit UIKit: let imageConfig = UIImage.SymbolConfiguration(textStyle: .body, scale: .large) var mapImage = UIImage(systemName: "map", withConfiguration: imageConfig) Interface Builder Modal presentations Swipe-to-dismiss is default Modal presentations Full-screen view controller presentation: viewController.modalPresentationStyle = .fullScreen or, to prevent swipe-to-dismiss: viewController.isModalInPresentation = true What about iPad? • Petty has always been iPhone-only • An iPad target is necessary to bring an app to the Mac using Catalyst • New navigation structure: UISplitViewController End result How about that Mac app? ??? Tick the box - that’s all! Only kidding � � Challenge #1 - Siri Shortcuts #if !targetEnvironment(macCatalyst) class AddToSiriTableViewCell: UITableViewCell { var stationIntent: ShowPricesAtStationIntent? private let siriButton = INUIAddVoiceShortcutButton(style: .blackOutline) … } #endif Challenge #2 - Core Location Mac app icons The Menu Bar Customising the menu bar override func buildMenu(with builder: UIMenuBuilder) { super.buildMenu(with: builder) /* Do something */ } AppDelegate.swift Customising the menu bar Removing unwanted menus override func buildMenu(with builder: UIMenuBuilder) { super.buildMenu(with: builder) builder.remove(menu: .services) builder.remove(menu: .format) builder.remove(menu: .toolbar) } Adding a menu bar item let refreshCommand = UIKeyCommand(input: "R", modifierFlags: [.command], action: #selector(reloadData)) refreshCommand.title = "Reload data" let reloadDataMenu = UIMenu(title: "Reload data", image: nil, identifier: UIMenu.Identifier("reloadData"), options: .displayInline, children: [refreshCommand]) builder.insertChild(reloadDataMenu, atStartOfMenu: .file) Adding a menu bar item let refreshCommand = UIKeyCommand(input: "R", modifierFlags: [.command], action: #selector(reloadData)) refreshCommand.title = "Reload data" let reloadDataMenu = UIMenu(title: "Reload data", image: nil, identifier: UIMenu.Identifier("reloadData"), options: .displayInline, children: [refreshCommand]) builder.insertChild(reloadDataMenu, atStartOfMenu: .file) Adding a menu bar item let refreshCommand = UIKeyCommand(input: "R", modifierFlags: [.command], action: #selector(reloadData)) refreshCommand.title = "Reload data" let reloadDataMenu = UIMenu(title: "Reload data", image: nil, identifier: UIMenu.Identifier("reloadData"), options: .displayInline, children: [refreshCommand]) builder.insertChild(reloadDataMenu, atStartOfMenu: .file) Adding a second menu bar item let preferencesCommand = UIKeyCommand(input: ",", modifierFlags: [.command], action: #selector(openPreferences)) preferencesCommand.title = "Preferences…" let openPreferences = UIMenu(title: "Preferences...", image: nil, identifier: UIMenu.Identifier("openPreferences"), options: .displayInline, children: [preferencesCommand]) builder.insertSibling(openPreferences, afterMenu: .about) Distributing a Catalyst app • Archive in Xcode • Automatic code signing will register the bundle ID automatically (and prefix it with `macCatalyst.*` • Create new app record in App Store Connect • Possible to distribute outside of Mac App Store, can still get app notarised Learn more: Taking iPad Apps for Mac to the Next Level https://developer.apple.com/videos/play/wwdc2019/235/ Distribution notes • No TestFlight for macOS apps • A notarised app cannot use App Store-based features such as GameKit and SceneKit • App Thinning isn’t used on macOS - the bundle contains all the resources. • Many ways to install a Mac app. Should use receipt validation if legitimacy of install needs to be checked. • In-app purchases and subscriptions will need to be re-created for the Mac app, and are not shared with iOS. Tracking purchase history requires custom server-side checking. The lineup ??? What we covered in this talk • Making the watch app independent • Updating for iOS 13 design changes: Dark mode, dynamic colours, SF Symbols, changes to modal presentations • Mac Catalyst: Conditional code compilation, entitlements, app icon, the menu bar, distribution There’s still so much more! What wasn’t covered iOS 13: • Siri Shortcuts/Intents API changes Catalyst: • Hover states � • Context menus • Touch Bar API’s • Navigation bar and title It’s time to get developing! Thank you. �.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    59 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us