Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
iOS 8 Extensions
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Thomas Eichmann
August 19, 2014
Programming
0
100
iOS 8 Extensions
Quick intro into iOS 8 extensions.
Thomas Eichmann
August 19, 2014
Tweet
Share
Other Decks in Programming
See All in Programming
AI時代でも変わらない技術コミュニティの力~10年続く“ゆるい”つながりが生み出す価値
n_takehata
2
720
Ruby and LLM Ecosystem 2nd
koic
1
640
AWS Infrastructure as Code の新機能 2025 総まとめ 〜SA 4人による怒涛のデモ祭り〜
konokenj
10
3.3k
maplibre-gl-layers - 地図に移動体たくさん表示したい
kekyo
PRO
0
260
ロボットのための工場に灯りは要らない
watany
10
2.7k
CSC307 Lecture 14
javiergs
PRO
0
470
Agentic AI: Evolution oder Revolution
mobilelarson
PRO
0
160
今更考える「単一責任原則」 / Thinking about the Single Responsibility Principle
tooppoo
3
1.6k
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
540
コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions
handlename
0
200
CDIの誤解しがちな仕様とその対処TIPS
futokiyo
0
210
Angular-Apps smarter machen mit Gen AI: Lokal und offlinefähig - Hands-on Workshop!
christianliebel
PRO
0
110
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.5k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.9k
From π to Pie charts
rasagy
0
150
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
240
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Six Lessons from altMBA
skipperchong
29
4.2k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.1k
Automating Front-end Workflow
addyosmani
1370
200k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
Agile that works and the tools we love
rasmusluckow
331
21k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
110
Designing Experiences People Love
moore
143
24k
Transcript
iOS$8$extensions
about&me mobile'engineer'at'local.ch @teichmann*on*twi-er
what%is%an extension?
a"way"for"you"to"extend"the"system" and"other"applica4ons
The$parts • extension)container • extension)points • extension)host • extensions
extension(container • that's'your%app • can'contain'mul/ple'extensions'(even'of'the'same'type)
extension(container • You%can’t%submit%an%app%extension%to%the%App%Store%unless%it’s% inside%a%containing%app,%and%you%can’t%transfer%an%extension%from% one%app%to%another. • Your%containing%app%must%provide%func3onality%to%iOS%users;%it% can’t%just%contain%extensions.
extension(points • areas%exposed%by%the%system%where%your%extensions%can%bind%to • e.g.%a%Today%Widget%binds%to%the%extension%point%of%the% No6fica6onCenter%framework • you%will%not%be%able%to%use%an%extension%for%any%other%extension% point%than%it%has%been%build%for
extension(points(available(in(iOS(8 • share:"share"content"e.g."with"social"websites • ac(on:"perform"simple"tasks"with"content • today:"widgets"in"the"today"view"of"no9fica9on"center • photo/edi(ng:"edit"a"photo"or"video"within"the"Photos"app •
storage/provider:"document"storage"accessible"by"other"apps" • custom/keyboards:"for"all"apps"on"the"device
extension(host • the%app%that%indirectly%launches%an%extension%via%an%Apple% framework;%the%host%app%never%directly%invokes%an%extension% itself%(e.g.%share,%ac>ons%with%UIAc%vityViewController) • extension%host%can%also%be%a%system%app%itself,%e.g.%the%Today% view%in%the%no>fica>on%center
extensions
an#extension#is#essen*ally#a#UIViewController • presented)full-screen)or)contained)depending)on)the)extension) point)/)your)se7ngs • receives)callbacks)like)viewWillAppear,)viewDidAppear)etc. • there)are)also)UI#less'extensions)(e.g.)ac>ons)can)be)UI-less)
extensions(are(also • separate(built(binaries(/(bundles • own(executable • own(debugging(symbols • own(en7tlements
None
extensions • run%completely%separately%from%the%container%app%in%their%own% sandbox • no#data#sharing#between#container#app#and#extension#by# default%(app%groups%to%the%rescue) • no%direct%communica:on%with%container%app%except%app%URLs
extensions • start&every&*me&in&a&new&process • no&mul*tasking&/&shared&process&(mul*ple&processes&launched& by&different&host&apps) • no&long&running&background&modes&(meant&for&short&lived& tasks) •
use&background&transfers&from&NSURLSession
None
data$exchange NSExtensionContext @property(readonly, copy, nonatomic) NSArray *inputItems NSExtensionItem @property(copy, nonatomic)
NSArray *attachments NSItemProvider @property(copy, readonly, nonatomic) NSArray *registeredTypeIdentifiers - (void)loadItemForTypeIdentifier:(NSString *)typeIdentifier options:(NSDictionary *)options completionHandler:(NSItemProviderCompletionHandler)completionHandler typedef void (^NSItemProviderCompletionHandler)(id <NSSecureCoding> item, NSError *error);
extension(ac+va+on(rules
None
complex(ac*va*on(rules((predicate) {extensionItems = ({ attachments = ({ registeredTypeIdentifiers = (
"com.adobe.pdf", "public.file-url"); }); })} SUBQUERY(extensionItems, $extensionItem, SUBQUERY($extensionItem.attachments, $attachment, ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf").@count == 1).@count == 1
NS_EXTENSION_UNAVAILABLE_IOS
get$your$64+bit$builds$ready!
"An$app$extension$target$must$ include$the$arm64$architecture$in$its$ Architectures$build$se8ngs$or$it$will$ be$rejected$by$the$App$Store."
debugging you$cannot$debug$your$app$and$extension$at$the$same$4me • choose'your'extension's'scheme'in'Xcode • choose'the'host'app'that'you'will'invoke'your'extension'with • wait...'(be'pa<ent)
how$do$I$start?
file$>$new$>$target
None
ExtKitchenSink h"ps:/ /github.com/the/ios82extensions2kitchen2sink (h"p:/ /bit.ly/1pBwn5w)
more%informa*on • WWDC%2015:%sessions%205,%217 • App%Extension%Programming%Guide
thanks':))