What’s new in iOS 9
@adhumi, Trainline
Cocoaheads Paris, jan. 2017
→
What is already used
(or could be)
iPad Multitasking / Split screen & slide over
Gif animé de changement de size class
iPad Multitasking / Split screen & slide over
Out of the box ✨
(if you support size classes correctly)
iPad Multitasking / Split screen & slide over
<key>UIRequireFullScreen</key>
<true/>
Opt-out (info.plist)
Search API
Add content to spotlight
"
Search API
NSUserActivity
For current activity indexation (can be public)
var activity = NSUserActivity(activityType: "com.ct.capitainetrain")
activity.title = "Paris → Carpentras"
activity.userInfo = ["id": "www.trainline.fr/results/paris/carpentras"]
activity.isEligibleForSearch = true
"
Search API "
let attributeSet = CSSearchableItemAttributeSet(
itemContentType: kUTTypeData)
attributeSet.title = "Private searchable item"
let item = CSSearchableItem(uniqueIdentifier: "AE4F-C8C24D",
domainIdentifier: "domain",
attributeSet: attributeSet)
CSSearchableIndex.default().indexSearchableItems([item],
completionHandler: nil)
CoreSpotlight
For massive and/or private, indexation
App thinning / Bitcode & App Slicing
Archive
iTunes Connect
App record
App Store
armv7, arm64
iPhone, iPad
screen density
App thinning / Bitcode & App Slicing
Default on iOS (optional)
Mandatory on watchOS and tvOS
⚠ Dependencies need to support Bitcode
~20-50% size gain
Keyboard shortcuts
Keyboard shortcuts
override var keyCommands: [UIKeyCommand]? {
return [UIKeyCommand(input: "r",
modifierFlags: .command,
action: #selector(onCommandEnter(_:)),
discoverabilityTitle: "Validate")]
}
override var keyCommands: [UIKeyCommand]?
3D Touch / Quick Actions
3D Touch / Quick Actions
let shortcut = UIApplicationShortcutItem(type: "fr.adhumi.app.message",
localizedTitle: "Send message")
UIApplication.shared.shortcutItems = [shortcut]
Dynamic
Static Compile time
Runtime
3D Touch / Peek & Pop
func previewingContext(_ previewingContext: UIViewControllerPreviewing,
commit vc: UIViewController) {
self.navigationController?.pushViewController(vc, animated: true)
}
override func viewDidLoad() {
self.registerForPreviewing(with: self, sourceView: self.view)
}
func previewingContext(_ previewingContext: UIViewControllerPreviewing,
viewControllerForLocation location: CGPoint)
-> UIViewController? {
return MyController()
}
What’s really new
and can be adopted
UIAlertView
UIActionSheet
↓
UIAlertController
UIAlertController
UIAlertController
self.present(alert, animated: true, completion: nil)
let alert = UIAlertController(title: "Uh oh!",
message: "An error occured.",
preferredStyle: .alert)
let resolve = UIAlertAction(title: "Resolve",
style: .destructive) { (action) in
// Do stuff
}
alert.addAction(resolve)
let cancel = UIAlertAction(title: "Cancel",
style: .cancel) { (action) in
// Do stuff
}
alert.addAction(cancel)
UIWebView
WKWebView
↓
SFSafariViewController
SFSafariViewController
SFSafariViewController
let url = URL(string: "https://www.trainline.fr")
let safari = SFSafariViewController(url: url!)
self.navigationController?.pushViewController(safari, animated: true)
AddressBook.framework
↓
Contacts.framework
Contacts.framework
let contacts = CNContactPickerViewController()
contacts.delegate = self
self.present(contacts, animated: true, completion: nil)
func contactPicker(_ picker: CNContactPickerViewController,
didSelect contact: CNContact) {
print(contact.givenName)
print(contact.emailAddresses)
}
let firstName: String = ABRecordCopyValue(contact,
kABPersonFirstNameProperty).takeRetainedValue()
App thinning / On Demand Resources
Xcode project
tag-yellow tag-blueNo tag
APP
App thinning / On Demand Resources
let tags: Set<String> = ["tag-yellow, tag-blue"]
let request = NSBundleResourceRequest(tags: tags)
request.beginAccessingResources { (error) in
if let error = error {
print(error)
} else {
print("Resources available")
}
}
NSLayoutConstraint(item: view1,
attribute: .centerX,
relatedBy: .equal,
toItem: view2,
attribute: .leading,
multiplier: 1,
constant: 0)
↓
view1.centerXAnchor.constraint(equalTo: view2.leadingAnchor)
Auto Layout
New syntax
UILayoutGuide
(👋 empty views)
Anchors
Auto Layout
UIStackView
Auto Layout
Auto Layout
let stackView = UIStackView()
stackView.axis = .vertical
stackView.distribution = .equalSpacing
stackView.alignment = .center
stackView.spacing = 8
stackView.addArrangedSubview(logo)
stackView.addArrangedSubview(title)
Split screen
Search APIs
Bitcode, App Slicing
Keyboard shortcuts
3D Touch
(peek/pop & quick actions)
Auto Layout
UIAlertController
SFSafariViewController
On Demand Resources
Contacts.framework
Thanks! 💚
@adhumi, Trainline 💻 trainline.fr/jobs

What's new in iOS9

  • 1.
    What’s new iniOS 9 @adhumi, Trainline Cocoaheads Paris, jan. 2017
  • 2.
  • 7.
    What is alreadyused (or could be)
  • 8.
    iPad Multitasking /Split screen & slide over Gif animé de changement de size class
  • 9.
    iPad Multitasking /Split screen & slide over Out of the box ✨ (if you support size classes correctly)
  • 10.
    iPad Multitasking /Split screen & slide over <key>UIRequireFullScreen</key> <true/> Opt-out (info.plist)
  • 11.
    Search API Add contentto spotlight "
  • 12.
    Search API NSUserActivity For currentactivity indexation (can be public) var activity = NSUserActivity(activityType: "com.ct.capitainetrain") activity.title = "Paris → Carpentras" activity.userInfo = ["id": "www.trainline.fr/results/paris/carpentras"] activity.isEligibleForSearch = true "
  • 13.
    Search API " letattributeSet = CSSearchableItemAttributeSet( itemContentType: kUTTypeData) attributeSet.title = "Private searchable item" let item = CSSearchableItem(uniqueIdentifier: "AE4F-C8C24D", domainIdentifier: "domain", attributeSet: attributeSet) CSSearchableIndex.default().indexSearchableItems([item], completionHandler: nil) CoreSpotlight For massive and/or private, indexation
  • 14.
    App thinning /Bitcode & App Slicing Archive iTunes Connect App record App Store armv7, arm64 iPhone, iPad screen density
  • 15.
    App thinning /Bitcode & App Slicing Default on iOS (optional) Mandatory on watchOS and tvOS ⚠ Dependencies need to support Bitcode ~20-50% size gain
  • 16.
  • 17.
    Keyboard shortcuts override varkeyCommands: [UIKeyCommand]? { return [UIKeyCommand(input: "r", modifierFlags: .command, action: #selector(onCommandEnter(_:)), discoverabilityTitle: "Validate")] } override var keyCommands: [UIKeyCommand]?
  • 18.
    3D Touch /Quick Actions
  • 19.
    3D Touch /Quick Actions let shortcut = UIApplicationShortcutItem(type: "fr.adhumi.app.message", localizedTitle: "Send message") UIApplication.shared.shortcutItems = [shortcut] Dynamic Static Compile time Runtime
  • 20.
    3D Touch /Peek & Pop func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit vc: UIViewController) { self.navigationController?.pushViewController(vc, animated: true) } override func viewDidLoad() { self.registerForPreviewing(with: self, sourceView: self.view) } func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? { return MyController() }
  • 21.
  • 22.
  • 23.
  • 24.
    UIAlertController self.present(alert, animated: true,completion: nil) let alert = UIAlertController(title: "Uh oh!", message: "An error occured.", preferredStyle: .alert) let resolve = UIAlertAction(title: "Resolve", style: .destructive) { (action) in // Do stuff } alert.addAction(resolve) let cancel = UIAlertAction(title: "Cancel", style: .cancel) { (action) in // Do stuff } alert.addAction(cancel)
  • 25.
  • 26.
  • 27.
    SFSafariViewController let url =URL(string: "https://www.trainline.fr") let safari = SFSafariViewController(url: url!) self.navigationController?.pushViewController(safari, animated: true)
  • 28.
  • 29.
    Contacts.framework let contacts =CNContactPickerViewController() contacts.delegate = self self.present(contacts, animated: true, completion: nil) func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) { print(contact.givenName) print(contact.emailAddresses) } let firstName: String = ABRecordCopyValue(contact, kABPersonFirstNameProperty).takeRetainedValue()
  • 30.
    App thinning /On Demand Resources Xcode project tag-yellow tag-blueNo tag APP
  • 31.
    App thinning /On Demand Resources let tags: Set<String> = ["tag-yellow, tag-blue"] let request = NSBundleResourceRequest(tags: tags) request.beginAccessingResources { (error) in if let error = error { print(error) } else { print("Resources available") } }
  • 32.
    NSLayoutConstraint(item: view1, attribute: .centerX, relatedBy:.equal, toItem: view2, attribute: .leading, multiplier: 1, constant: 0) ↓ view1.centerXAnchor.constraint(equalTo: view2.leadingAnchor)
  • 33.
  • 34.
  • 35.
  • 36.
    Auto Layout let stackView= UIStackView() stackView.axis = .vertical stackView.distribution = .equalSpacing stackView.alignment = .center stackView.spacing = 8 stackView.addArrangedSubview(logo) stackView.addArrangedSubview(title)
  • 37.
    Split screen Search APIs Bitcode,App Slicing Keyboard shortcuts 3D Touch (peek/pop & quick actions) Auto Layout UIAlertController SFSafariViewController On Demand Resources Contacts.framework
  • 38.
    Thanks! 💚 @adhumi, Trainline💻 trainline.fr/jobs