Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
What's new in iOS 9
Search
Adrien Humilière
January 12, 2017
Programming
400
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
What's new in iOS 9
Cocoaheads Paris, January 2017
Adrien Humilière
January 12, 2017
More Decks by Adrien Humilière
See All by Adrien Humilière
Attention to details
adhumi
0
28
Build an iOS app from an iPad
adhumi
0
120
Something about Xcode ^^
adhumi
0
170
Inside Brut.
adhumi
0
170
Localization done bien
adhumi
1
320
Test and distribute an iOS app with Gitlab CI
adhumi
0
420
Pushing Forward iOS Notifications
adhumi
0
230
Good practices for iOS releases
adhumi
0
260
Rebranding an iOS app
adhumi
0
300
Other Decks in Programming
See All in Programming
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
150
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
660
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
380
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
830
APNsからLive Activityを開始する話
yumnumm
0
170
R8 の設定見直しでアプリサイズ削減
andpad
0
220
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
130
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
180
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
[JA] Domain Modeling with Vanilla Rails: 「操作」から再考するRailsの設計論
yasaichi
3
500
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.2k
Featured
See All Featured
Speed Design
sergeychernyshev
33
2.2k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
A better future with KSS
kneath
240
18k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
520
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
560
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Faster Mobile Websites
deanohume
310
32k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
400
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Transcript
What’s new in iOS 9 @adhumi, Trainline Cocoaheads Paris, jan.
2017
→
None
None
None
None
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-blue
No 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