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
アプリへの導線の増やし方.pdf
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
PKPK-Carnage
December 24, 2019
Programming
750
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
アプリへの導線の増やし方.pdf
PKPK-Carnage
December 24, 2019
More Decks by PKPK-Carnage
See All by PKPK-Carnage
iOSアプリを堅牢にデザインするために知っておくべきたった1つのこと
pkpkcarnage
0
520
「シェア機能」について考えてみた
pkpkcarnage
0
120
リリースビルドでのみ起こる謎のバグに見舞われた話
pkpkcarnage
0
230
Any型をprotocolにキャストする時に 気をつけた方がいい話
pkpkcarnage
0
310
今日から使える! Optionalをいい感じに扱うtips
pkpkcarnage
0
1.3k
もっと早く教えて欲しかった画面遷移
pkpkcarnage
0
370
iOSの通信処理を簡潔に書く
pkpkcarnage
0
320
Other Decks in Programming
See All in Programming
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
190
共通化で考えるべきは、実装より公開する型だった
codeegg
0
220
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
9k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
210
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
250
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
120
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
520
yield再入門 #phpcon
o0h
PRO
0
200
えっ!!コードを読まずに開発を!?
hananouchi
0
200
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
260
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
350
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.4k
The agentic SEO stack - context over prompts
schlessera
0
840
Producing Creativity
orderedlist
PRO
348
40k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
Technical Leadership for Architectural Decision Making
baasie
3
440
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
510
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
30 Presentation Tips
portentint
PRO
1
350
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Transcript
؆୯ʹͰ͖Δʂ ΞϓϦͷಋઢͷ૿͠ํ Tomosuke Okada 2019/12/24 ͋Δ͋ΔLTʙ ΫϦεϚεͩΑʂAndroid & iOS߹ಉ େLTେձ
ʙ Vol.9 1
About me • Tomosuke Okada • iOSྺ3 • ອըͷΞϓϦΛ࡞ͬͯ·͢ •
SNS • Qiita → @fr0g_fr0g • Github → Frog-Frog • Twitter → @fr0g_fr0g • μϒϧϑϩοά
ΞϓϦ։ൃऀͷئ͍ɾɾɾ 3
ΞϓϦΛͬͯཉ͍͠ʂʂ 4
ಋઢΛ૿͞ͳ͖Όʂ 5
ΞϓϦΛ։ͨ͘Ίͷํ๏ͬͯͳʹ͕͋ΔͩΖ͏ʁ • ϗʔϜ • AppStore • ϓογϡ௨ • URLεΩʔϜ •
ϢχόʔαϧϦϯΫ • TodayExtension • Spotlightݕࡧ 7
SpotlightݕࡧΛհ͍ͨ͠ 8
Spotlightݕࡧͬͯͳʹʁ 9
10
͜͜ʹࣗͷΞϓϦͷίϯςϯπΛද͍ࣔͨ͠ 11
12 CoreSpotlight.frameworkͱMobileCoreServices.frameworkΛՃ͢Δ
13 struct Movie { /// өըݻ༗ͷࣝผ൪߸ let id = 0
/// ໊લ let title = "εύΠμʔϚϯ" /// ͋Β͢͡ let summary = "ฏຌͳগɺϐʔλʔɾύʔΧʔ์ࣹೳԚછ͞Εͨᥨʹט·Εͨ͜ͱͰɺਓతͳ ೳྗΛಘͯ͠·͏ɾɾɾ" /// ը૾ let thumbnail = UIImage(named: "spider") /// ऀ໊ͷྻ let actorNames = ["τϏʔɾϚάϫΠΞ", "ΩϧεςΟϯɾμϯετ", "δΣʔϜζɾϑϥϯί"] }
14 import Foundation import CoreSpotlight import MobileCoreServices final class SpotlightManager
{ func save(_ movie: Movie) { let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeData as String) // ᶃλΠτϧ attributeSet.title = movie.title // ᶄઆ໌จ attributeSet.contentDescription = movie.summary // ᶅը૾ attributeSet.thumbnailData = movie.thumbnail?.pngData() // Ωʔϫʔυʢදࣔ͞Εͳ͍͕ɺλΠτϧઆ໌จʹೖͬͯͳ͍จݴΛ͜͜ʹೖΕ͓͚ͯɺݕࡧͨ࣌͠ʹҾ͔͔ͬΔΑ͏ʹͳΔʣ attributeSet.keywords = movie.actorNames /* uniqueIdentifierAppDelegateͰऔΓग़͢͜ͱ͕Ͱ͖ΔͷͰɺ Spotlightݕࡧܦ༝ͰΞϓϦΛ։͍ͨ࣌ͷͨΊͷURLεΩʔϜΛೖΕ͓ͯ͘ */ let item = CSSearchableItem( uniqueIdentifier: "my-app://open/movie?id=\(movie.id)", domainIdentifier: "my-app", attributeSet: attributeSet ) CSSearchableIndex.default().indexSearchableItems([item], completionHandler: nil) } }
15
16
ͨͬͨ͜Ε͚ͩͷίʔυͰදࣔͰ͖Δʂ 17
18 import CoreSpotlight extension AppDelegate { func application(_ application: UIApplication,
continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { // SpotlightͰ։͔Ε͔ͨͲ͏͔ΛνΣοΫ͢Δ switch userActivity.activityType { case CSSearchableItemActionType: return self.openApplicationFromSpotlight(userActivity) default: return false } } private func openApplicationFromSpotlight(_ userActivity: NSUserActivity) -> Bool { // userActivity͔ΒURLεΩʔϜΛऔಘ͢Δ guard let urlScheme = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String else { return false } // URLεΩʔϜΛ։͍ͨ࣌ͷॲཧΛ࣮͢Δ return true } }
࣮ࡍʹͱ͋ΔΞϓϦͰೖΕͯΈͨ 19
શવΘΕͯͳ͍ 21
ͦΜͳʹ൵؍తʹͳΔ͜ͱͰͳ͍ 22
͜͏ࢥͬͨ 27 • ͦͦͦΜͳʹΘΕΔͱࢥͬͯͳ͍ • ίϯςϯπϏδωε(ອը)ΛߦͬͯΔ • ڝ߹ΞϓϦ͕ͻ͠Ί͖߹ͬͯΔ • Spotlightݕࡧʹ࡞໊Λೖྗ͢ΔϢʔβʔɺྔ͕ߴ͍ͣ
• ͦ͏͍ͬͨϢʔβʔ͕ΞϓϦΛ։͖͔͚ͬ͘Λ࡞Δ͜ͱ͕Ͱ͖Δ
·ͱΊ • Spotlightݕࡧ͔ͳΓ؆୯ʹ࣮Ͱ͖Δ • ͦΜͳʹେྔʹΘΕΔػೳͱ͍͏Θ͚Ͱແ͍ • SpotlightݕࡧʹίϯςϯπΛද͓ࣔͤͯ͘͜͞ͱʹҙຯ͕͋Δ • ࣮ʹؔͯ͠Qiitaʹৄ͘͠ॻ͍ͨ 31
32
Qiitaͱ͍͑ɾɾɾ 33
and factory Advent Calendar 2019 34
35
͓ΘΓ 36