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
86
空間再現力の鍵、APMPを読み解く
ridwy
1
440
空間ビデオフォーマット、MV-HEVCが写し撮る世界
ridwy
4
2.8k
空間オーディオを活用しよう!
ridwy
1
720
AVPlayerのHLS再生時のエラーをハンドリングする
ridwy
0
930
AirPlayの裏舞台
ridwy
0
3.1k
AVPlayerできちんとコンテンツ保護
ridwy
0
2.2k
検証 SharePlay media playback
ridwy
1
2.1k
カスタムInstrumentsでアプリをピカピカに!
ridwy
5
13k
Other Decks in Technology
See All in Technology
最高のシステムプロンプトを作るためにフィードバック機能を導入した話
alchemy1115
1
330
サイバー捜査員研修(後半)
nomizone
1
590
AIは実装を速くする。では、私たちは何を今作るべきか?-立場を越えてリリースに向き合ったチーム開発の実践 / 20260801 Hiromi Nakaya and Naoki Takahashi
shift_evolve
PRO
3
370
【Google Cloud Next Tokyo'26】Gemini Enterprise と Oracle AI Database で実現する、業務データ活用を実現する AI エージェント実装
shisyu_gaku
0
210
Service Connect 上のサービスに ECS Service の外側から到達できなかった話
ota1022
1
120
PLaMo 3.0 Primeの事後学習
pfn
PRO
0
270
修正PRを食べてレビュースキルが賢くなる:Claude Codeによる自己改善サイクル
yuyaumetsu
4
1.1k
トヨタ⽣産⽅式(TPS)⼊⾨
recruitengineers
PRO
1
350
[しろおび夏祭り2026] チャットするAIから、作業するAIへ - 使われ方の変化と、その裏側で起きていること
kk0n
0
1.6k
NetBoxを利用した作業効率化の試み_NetDevNight4
tnoha
0
460
AIエージェントの知識表現と推論に なぜグラフが使われるのか - 記号的AIの復権とニューラルAIとの統合
yohei1126
1
280
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.1k
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
480
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
200
Color Theory Basics | Prateek | Gurzu
gurzu
0
410
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Exploring anti-patterns in Rails
aemeredith
3
450
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
350
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
440
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ʹΠϯετʔϧ͞ΕΔඞཁ ͕͋Δ • அใͷૹ৴ʹಉҙͨ͠ϢʔβͷΈͷࣈ
ॴײ • ؔ࿈ٕज़ηΩϡϦςΟͱརศੑͷτϨʔυΦϑ • ඞཁेͳػೳ • ಛʹಉҰυϝΠϯͰͷΞϓϦಋઢʹྑ͍ • ϦϦʔεͨͯ͠ͳͷͰυΩυΩ͠ͳ͕Βݟक͍ͬͯ·͢
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠