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
Firebase Dynamic Links 導入事例
Search
Chiharu Nameki
December 12, 2018
Technology
2.9k
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Firebase Dynamic Links 導入事例
CA.swift #7
Chiharu Nameki
December 12, 2018
More Decks by Chiharu Nameki
See All by Chiharu Nameki
iPhoneでの空間メディア視聴体験の探求
ridwy
1
77
空間再現力の鍵、APMPを読み解く
ridwy
1
410
空間ビデオフォーマット、MV-HEVCが写し撮る世界
ridwy
4
2.8k
空間オーディオを活用しよう!
ridwy
1
700
AVPlayerのHLS再生時のエラーをハンドリングする
ridwy
0
900
AirPlayの裏舞台
ridwy
0
3k
AVPlayerできちんとコンテンツ保護
ridwy
0
2.1k
検証 SharePlay media playback
ridwy
1
2.1k
カスタムInstrumentsでアプリをピカピカに!
ridwy
5
12k
Other Decks in Technology
See All in Technology
手塩にかけりゃいいってもんじゃない
ming_ayami
0
610
10年間のブログ発信を振り返って見えたWebアプリケーションエンジニアとしての軌跡
stefafafan
0
170
Agile and AI Redmine Japan 2026
hiranabe
3
290
AI-DLCを “そのまま導入しなかった”話 ~組織に合わせてアジャストした 私たちの実践共有~
hiroramos4
PRO
0
210
自分が詳しくない領域でAIを使う #プロヒス2026
konifar
13
5.3k
FPGAの開発コンペでZephyrを使ってみた
iotengineer22
0
140
Android の公式 Skill / Android skills
yanzm
0
160
ACE-Step-1.5で見る 音楽生成AIのしくみと“破綻だけ直す”Retake機能の開発【zennfes spring 2026 登壇資料】
personabb
1
540
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
140
小さく始める AI 活用推進 ― 日経電子版 Web チームの事例/nikkei-tech-talk47
nikkei_engineer_recruiting
0
300
200個のGitHubリポジトリを横断調査したかった
icck
0
140
ザ・データベース、MySQL ~ OSC 2026 Sendai ~
sakaik
0
140
Featured
See All Featured
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
1.7k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Skip the Path - Find Your Career Trail
mkilby
1
150
エンジニアに許された特別な時間の終わり
watany
107
250k
Embracing the Ebb and Flow
colly
88
5.1k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
Context Engineering - Making Every Token Count
addyosmani
9
970
Everyday Curiosity
cassininazir
0
230
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
600
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
410
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Transcript
ߦ ઍय़ʢͳΊ͖ ͪΔʣ גࣜձࣾαΠόʔΤʔδΣϯτ Firebase Dynamic Links ಋೖࣄྫ CA.swift #7
2018 Dec. 12 Twitter, Qiita, GitHub @Ridwy
ࣗݾհ ߦ ઍय़ (ͳΊ͖ ͪΔ) 2015த్ೖࣾ Ameba iOSΤϯδχΞ ݩ macOSιϑτΣΞΤϯδχΞ
WWDC 2015, 2017ࢀՃ
Firebase Dynamic Linksͱʁ
͜ͷػೳΛ࣮ݱͯ͘͠ΕΔϦϯΫ ΞϓϦͰ։͘
ϢʔβΛঢ়ଶʹΑͬͯ࠷దͳભҠઌ ΞϓϦͰ։͘ ΠϯετʔϧࡁΈ ະΠϯετʔϧͳΒετΞ ΞϓϦىಈ & linkʹ֘͢Δը໘ʹભҠ (=σΟʔϓϦϯΫॲཧ)
Firebase Dynamic Linksͷಛ • ແྉ • ຊՈͷυΩϡϝϯτ͕͔ͬ͠Γ͍ͯ͠Δ • OSS https://github.com/firebase
• iOS, Android • ωΠςΟϒSDK • C++ SDK • UnityϓϥάΠϯ • ॖURL & ΞφϦςΟΫεػೳ
ఆ͞Ε͍ͯΔར༻γʔϯ • ΞϓϦͷಋઢ e.g. ʮΞϓϦͰ։͘ʯϘλϯ ΩϟϯϖʔϯLPͷϘλϯ • ϓϩϞʔγϣϯ༻ͷϦϯΫΛSNSͰ֦ࢄ • ΞϓϦͷϢʔβಉ࢜ͰϦϯΫΛڞ༗
Firebase Dynamic Links (Ҏ߱FDLͱུ)ͷྫ FDLͷ࣮ମඞཁͳใΛύϥϝʔλͱͯ࣋ͭ͠URL ͜ͷURLΛʮΞϓϦͰ։͘ʯϘλϯͳͲʹࠐΜͰ͏ https://example.page.link/? link=https://www.example.com/foo &apn=com.example.android &amv=3
&ibi=com.example.ios &isi=1234567 ↑Subdomain
ओͳύϥϝʔλ ڞ௨ link σΟʔϓϦϯΫ iOS ibi iOSΞϓϦͷόϯυϧID isi App Store্ͷΞϓϦͷID
ifl ະΠϯετʔϧ࣌ʹετΞҎ֎ʹભҠ͍ͤͨ͞߹ɺભҠઌURL Android apn AndroidΞϓϦͷύοέʔδ໊ afl ະΠϯετʔϧ࣌ʹετΞҎ֎ʹભҠ͍ͤͨ͞߹ɺભҠઌURL PC ofl PCͰlinkҎ֎ʹભҠ͍ͤͨ͞߹ɺભҠઌURL
ϦονϓϨϏϡʔ༻ͷύϥϝʔλ st λΠτϧ sd આ໌ si ը૾URL 300 x 200
ϐΫηϧҎ্ɺ300 KB ະຬ SNS֦ࢄ࣌ͷݟͨετΞϓϨϏϡʔΛϦονʹͰ͖Δ Rich Link Preview
ετΞϓϨϏϡʔ • App StoreભҠલʹFirebaseʹΑͬͯ දࣔ͞ΕΔϓϨϏϡʔ • ࠓͷॴiOSͷΈ • ΫϦοϓϘʔυΛར༻ͯ͠ ϢʔβͷಉҰੑΛ୲อ
• efr=1Λ͚ͭΔͱදࣔΛεΩοϓՄೳ
ετΞϓϨϏϡʔ st, sd, si Λઃఆͨ͠ྫ
શύϥϝʔλͱৄࡉެࣜυΩϡϝϯτͰʂ https://firebase.google.com/docs/dynamic-links/create-manually
ϦϯΫͷੜํ๏ • खಈͰύϥϝʔλΛΈཱͯ • Firebaseͷίϯιʔϧ্Ͱ࡞ • SDKͰ࡞ 3ͭͷํ๏͕͋Δ
Firebaseίϯιʔϧ
None
ϦϯΫͷσόοά ϦϯΫʹEΛ͚ͭͯϒϥβͰΞΫηεʂ
iOS 9Ҏ߱ iOS 8
ॖURLػೳ • SDKREST APIͰURLΛॖͰ͖Δ • ॖURLղܾ࣌ʹΫϦοΫͳͲ͕ूܭ͞ΕΔ • ूܭ݁ՌREST APIͳͲͰऔಘՄೳ CLICK
ΫϦοΫ REDIRECT ετΞ(or ࢦఆͨ͠ભҠઌ)ͷૹ٬ APP_INSTALL Πϯετʔϧ (AndroidͷΈ) APP_FIRST_OPEN ΠϯετʔϧޙΞϓϦΛ։͍ͨ APP_RE_OPEN ΞϓϦΛ։͍ͨ
※ Firebaseͷίϯιʔϧ্Ͱ࡞Ͱ͖ΔURLॖURL ίϯιʔϧ্Ͱ࡞ͨ͠߹ɺूܭ݁Ռίϯιʔϧʹදࣔ͞ΕΔ
ॖURLػೳ • ͍ (TwitterͳͲͰͷ֦ࢄʹศརʣ • ༰͕૾Ͱ͖ͳ͍ͷͰΞϓϦ͕ϋοΫ͞Εʹ͍͘ • Firebase͕ूܭΛߦͬͯ͘ΕΔ • ΞϓϦͰड৴ޙɺ௨৴ΛߦͬͯϦϯΫΛղܾ͢Δඞཁ͕͋Δ
εϜʔζͳσΟʔϓϦϯΫॲཧͷ͛ʹͳΔέʔε Pros. Cons.
iOSΞϓϦʹΈࠐΉ
• Universal Links • ΧελϜεΩʔϚURLʹΑΔΞϓϦىಈ FDLʹར༻͞Ε͍ͯΔiOSͷΈʹ͍ͭͯগ͠ ΠϯετʔϧࡁΈఆɾΞϓϦىಈʹҎԼ͕ར༻͞Ε͍ͯΔ
Universal Links • υϝΠϯͱΞϓϦΛؔ࿈͚ͮΔ • αʔόʹઃఆϑΝΠϧ apple-app-site-association Λஔ • ΞϓϦͷEntitlementsͷAssociated
Domainsʹ֘υϝΠϯΛهड़ • ΞϓϦͷΠϯετʔϧ / Ξοϓσʔτ࣌ʹؔ࿈͚͕ߦΘΕΔ • ϦϯΫΛ։͘ͱ͖ʹ֘ΞϓϦ͕͋ͬͨΒͦͷΞϓϦΛىಈ • ಉҰυϝΠϯͷ߹ΞϓϦΛىಈ͠ͳ͍ ͢ͰʹϢʔβαΠτͰαʔϏεΛମݧதͷͨΊ • ΞϓϦΛىಈ͢Δ͔ԡ͠ͷϝχϡʔͰϢʔβ͕બՄೳ ࠷ޙͷબ͕OSʹهԱ͞ΕΔ iOS 9Ͱొͨ͠Deep LinkͷΈ
Universal Links ҙ • ΞϓϦΛ։͘ڍಈɺϢʔβͷͷOSʹΑ੍ͬͯޚ͞Ε͍ͯΔ • ڍಈΛม͑ΔτϦΨʔΞϓϦͷΞοϓσʔτ • apple-app-site-association͚ͩॻ͖͑ͯޮՌ͕ͳ͍
͍͟ಋೖ
ಋೖͷྲྀΕ 1. FirebaseϓϩδΣΫτʹΞϓϦΛ݁ͼ͚ͭΔ 2. SDKΛΠϯετʔϧ 3. Firebase Dynamic Links ίϯιʔϧͰαϒυϝΠϯΛऔಘ
4. EntitlementsΛઃఆ 5. ड৴ॲཧΛ࣮
FirebaseϓϩδΣΫτʹΞϓϦΛ݁ͼ͚ͭΔ ࢦࣔ௨ΓΞϓϦͷใΛೖྗ & ηοτΞοϓ ҙ νʔϜIDʹ x νʔϜID Ͱͳ͘ o
Provisioning ProfileͷApp IDͷPrefix Λઃఆʢݹ͍ΞϓϦͰҟͳΔ͜ͱ͕͋Δʣ
SDKΛΠϯετʔϧ CocoaPodsΛར༻ pod 'Firebase/Core' pod 'Firebase/DynamicLinks' $pod install
FirebaseίϯιʔϧͰαϒυϝΠϯΛऔಘ 5ݸ·Ͱొ/আͰ͖Δ
ૣ͍ऀউ͔ͪͱࢥ͍͖…ʁ amebloΛऔΖ͏ͱͨ͠Β͜Μͳը໘͕ ΞϝʔόϒϩάͷυϝΠϯ ameblo.jp Ͱ͢ ͋Γ͕ͱ͏͍͟͝·͢ʂ
EntitlementsΛઃఆ Associated Domainsʹઌ΄Ͳऔಘͨ͠υϝΠϯΛՃ
ड৴ॲཧΛ࣮ ४උ import Firebase // Firebaseͷڞ௨ΠϯελϯεΛηοτΞοϓ FirebaseApp.configure()
ड৴ॲཧΛ࣮ ΞϓϦʹͬͯདྷͨURL͔ΒSDKͰlinkΛऔΓग़͠ɺ֘ը໘ભҠ URLड৴ϝιου • ΧελϜεΩʔϚURL application(_:open:options:) • Universal Links application(_:continue:restorationHandler:)
※ ىಈ࣌launchOptionsʹURL͕ͬͯ͘ΔͷͰ ΑΓૣ͘ॲཧΛ։࢝Մೳ
Firebase iOS SDK FDLͷॲཧΛߦ͏I/F FIRDynamicLinks.h ಡΜͰΈΔ
͓͜ͱΘΓ SwiftͰهࡌ͍ͯ͠·͕͢ ࣮ࡍObjective-CͰ͢ CA.swift
// ΧελϜεΩʔϚURLΛFDLͱͯ͠ॲཧ͖͔͢Ͳ͏͔ func shouldHandleDynamicLink(fromCustomSchemeURL: URL) -> Bool // ΧελϜεΩʔϚURLΛύʔε func
dynamicLink(fromCustomSchemeURL: URL) -> DynamicLink? // ͍Universal LinkΛύʔε func dynamicLink(fromUniversalLink: URL) -> DynamicLink? // Universal Link(͍URLॖURLOK!)Λॲཧ͢Δศརϝιου func handleUniversalLink(_: URL, completion: (DynamicLink?, Error?)->()) -> BOOL // ॖURLΛղܾ func resolveShortLink(_: URL, completion: (DynamicLink?, Error?)->()) -> BOOL // FDLͷॖURL͔Ͳ͏͔ func matchesShortLinkFormat(_: URL) -> Bool FIRDynamicLinks.h FDLॲཧΛ୲͏γϯάϧτϯ DynamicLinks.dynamicLinks() ͷI/F
FIRDynamicLink.h FDLΛදݱ͢ΔΫϥε class DynamicLink: NSObject { private(set) var url: URL?
/// Ϣʔβʔ͕Ұக͍ͯ͠Δ࣮֬ੑ private(set) var matchType: DLMatchType }
࣮ͯ͠ΈͨΒ…
ςετͰԿϦϯΫΛ౿ΜͩͨΊ͔ɺ ϦϯΫΛ౿ΜͰ͍ͳͯ͘ΞϓϦΛىಈͨ͠Β σΟʔϓϦϯΫॲཧ͕ΔΑ͏ʹͳͬͯ͠·͍· ͨ͠ ςετνʔϜ • ࣌ؒܦաͰղফ • efr=1Λࢦఆͯ͠ϓϨϏϡʔϖʔδΛόΠύε͍ͯͨ͠ •
ͦͷ߹ΠϯετʔϧΛڬΜͰϢʔβͷใΛ࣮֬ʹҾ͖ܧ͙Έͳ͍ • λΠϜελϯϓ༷ʑͳใΛΈ߹ΘͤͯແཧΓߦ͍ͬͯΔͱࢥΘΕΔ • ͜͏ͨ͠ෆ࣮֬ੑ͕͋ΔͷͰɺԿ͔Λ֬ఆ͢ΔΑ͏ͳॲཧͷલʹ ඞͣ֬ೝΛߦ͏͖
ͨ·ʹىಈޙ͙͢Ͱͳ͘ɺগ͠Εͯදࣔ͞ ΕΔΜ͚ͩͲେৎʁ σΟϨΫλʔ σόοάͨ͠ΒɺͳΜͱ Firebase iOS SDKͷ matchesShortLinkFormat(_:) ͕͍63-ʹରͯ͠ true
͜ͷ͍࣌··ͷURLͩͬͨͷͰ ड৴͔ͯ͠Βൃಈ͢Δ·ͰλΠϜϥάͳ͍ͣ
firebase-ios-sdk/Firebase/DynamicLinks/Utilities/FDLUtilities.m let url = URL(string: "https://hoge.page.link/?abc=123")! url.path // -> "/"
ॖURLͱޡఆ͞ΕΔ͍URLͷྫ
let dl = DynamicLinks.dynamicLinks() if dl.matchesShortLinkFormat(url) && url.path != "/"
{ dl.handleUniversalLink(url) { [weak self] dynamicLink, _ in self?.dynamicLink = dynamicLink } } else { self.dynamicLink = dl.dynamicLink(fromUniversalLink: url) } W/AͰରԠ
ϦϯΫΛ౿Ήͷ͕2ճ͔ͩΒɺදࣔ͞Εͳ͍Μ Ͱ͢Ͷʂ σβΠφʔ ͢Έ·ͤΜɺෆ۩߹Ͱ͢ɻ • ॖURLͷղܾʹωοτϫʔΫ௨৴͕ඞཁ • Universal Linksड৴࣌ application(_:continue:restorationHandler:)
ΞϓϦ͕ActiveͰͳ͍͜ͱ͋Δ • ΞϓϦ͕ActiveͰͳ͍࣌ʹ௨৴͠Α͏ͱ͢Δ → ࣌ʑ௨৴Τϥʔ ॖURLͷղܾʹ࣌ʑࣦഊ͍ͯͨ͠ ॖURLͷղܾΛߦ͏λΠϛϯάΛௐͯ͠ରԠ
ΞϓϦΛΠϯετʔϧࡁΈͳͷʹετΞʹߦͬͯ ͠·͏͕͋ΔΜͰ͚͢Ͳ... ϑϩϯτΤϯδχΞ • ΠϯετʔϧఆʹUniversal LinksΛར༻͍ͯ͠Δ͕ނͷ՝ Universal Links →ͲͪΒͰ։͔͘Ϣʔβ͕બΔ ֘υϝΠϯΛΞϓϦͰ։͔ͳ͍Α͏ʹ͍ͯ͠Δέʔε
• ετΞʹભҠ͢ΔͱΠϯετʔϧࡁΈͳͷͰΠϯετʔϧϘλϯ͕ ʮ։͘ʯϘλϯʹͳ͍ͬͯΔɻ • ͜ͷϘλϯͰ։͍ͨ߹ɺ೦ͳ͕ΒσΟʔϓϦϯΫॲཧߦΘΕͳ͔ͬͨ • ϓϨϏϡʔϖʔδΛܦ༝͢Ε͋Δ͍…ʁ ະղܾ
ӡ༻͢Δʹ͋ͨͬͯߦͬͨࣄ
ӡ༻୲ऀʹଘࡏΛͬͯΒ͏ ษڧձΛ։࠵
؆୯͔ͭ҆શʹ͑ΔΑ͏ʹ͢Δ Ωϟϯϖʔϯ୲ऀ͕ϦϯΫΛ࡞ & ཧ & ੳͰ͖ΔΑ͏ʹ • linkΛೖྗ͢Δͱ͍FDL͕ੜ͞ΕΔεϓϨουγʔτΛ༻ҙ • ΫϦοΫɺΞϓϦॳճىಈɺΞϓϦ࠶ىAmebaͰར༻͍ͯ͠Δ
طଘͷΈͰૹ৴
උߟ: App Store ConnectͷApp Analyticsͷύϥϝʔλ FDLʹ༩ՄೳɻͲͷΩϟϯϖʔϯ͕༗ޮ͔ͷஅࡐྉʹɻ • ct : Ωϟϯϖʔϯ໊,
40จࣈҎ • pt :ϓϩόΠμID, App Store ConnectͷʮΩϟϯϖʔϯϦϯΫΛ࡞ʯ ϖʔδͰ֬ೝͰ͖Δ • ݁Ռʹදࣔ͞ΕΔʹ5ͭҎ্ͷApple IDʹΠϯετʔϧ͞ΕΔඞཁ ͕͋Δ • அใͷૹ৴ʹಉҙͨ͠ϢʔβͷΈͷࣈ
ॴײ • ؔ࿈ٕज़ηΩϡϦςΟͱརศੑͷτϨʔυΦϑ • ඞཁेͳػೳ • ಛʹಉҰυϝΠϯͰͷΞϓϦಋઢʹྑ͍ • ϦϦʔεͨͯ͠ͳͷͰυΩυΩ͠ͳ͕Βݟक͍ͬͯ·͢
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠