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
Thomas Eichmann
August 19, 2014
Programming
100
0
Share
iOS 8 Extensions
Quick intro into iOS 8 extensions.
Thomas Eichmann
August 19, 2014
Other Decks in Programming
See All in Programming
Oxlintとeslint-plugin-react-hooks 明日から始められそう?
t6adev
0
320
WebAssembly を読み込むベストプラクティス 2026年春版 / Best Practices for Loading WebAssembly (Spring 2026)
petamoriken
5
1.1k
From Formal Specification to Property Based Test
ohbarye
0
710
Structured Concurrency, Scoped Values and Joiners in the JDK 25 26 27
josepaumard
1
140
Cache-moi si tu peux : patterns et pièges du cache en production - Devoxx France 2026 - Conférence
slecache
0
330
AIを導入する前にやるべきこと
negima
2
330
Back to the roots of date
jinroq
0
700
JOAI2026 1st solution - heron0519 -
heron0519
0
180
「Linuxサーバー構築標準教科書」を読んでみた #ツナギメオフライン.7
akase244
0
1.4k
AIベース静的検査器の偽陽性率を抑える工夫3選
orgachem
PRO
4
440
ソースコード→AST→オペコード、の旅を覗いてみる
o0h
PRO
1
120
ローカルLLMでどこまでコードが書けるか / How much code can be written on a local LLM
kishida
2
310
Featured
See All Featured
How to make the Groovebox
asonas
2
2.2k
How to build a perfect <img>
jonoalderson
1
5.5k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
130
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
Statistics for Hackers
jakevdp
799
230k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
900
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
55k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
510
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
200
The Art of Programming - Codeland 2020
erikaheidi
57
14k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
560
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':))