Slide 1

Slide 1 text

ߦ໦ ઍय़ʢͳΊ͖ ͪ͸Δʣ גࣜձࣾαΠόʔΤʔδΣϯτ Firebase Dynamic Links ಋೖࣄྫ CA.swift #7 2018 Dec. 12 Twitter, Qiita, GitHub @Ridwy

Slide 2

Slide 2 text

ࣗݾ঺հ ߦ໦ ઍय़ (ͳΊ͖ ͪ͸Δ) 2015೥த్ೖࣾ Ameba iOSΤϯδχΞ ݩ macOSιϑτ΢ΣΞΤϯδχΞ WWDC 2015, 2017ࢀՃ

Slide 3

Slide 3 text

Firebase Dynamic Linksͱ͸ʁ

Slide 4

Slide 4 text

͜ͷػೳΛ࣮ݱͯ͘͠ΕΔϦϯΫ ΞϓϦͰ։͘

Slide 5

Slide 5 text

ϢʔβΛঢ়ଶʹΑͬͯ࠷దͳભҠઌ΁ ΞϓϦͰ։͘ ΠϯετʔϧࡁΈ ະΠϯετʔϧͳΒετΞ΁ ΞϓϦىಈ
 &
 linkʹ֘౰͢Δը໘ʹભҠ
 (=σΟʔϓϦϯΫॲཧ)

Slide 6

Slide 6 text

Firebase Dynamic Linksͷಛ௃ • ແྉ • ຊՈͷυΩϡϝϯτ͕͔ͬ͠Γ͍ͯ͠Δ • OSS https://github.com/firebase • iOS, Android • ωΠςΟϒSDK • C++ SDK • UnityϓϥάΠϯ • ୹ॖURL & ΞφϦςΟΫεػೳ

Slide 7

Slide 7 text

૝ఆ͞Ε͍ͯΔར༻γʔϯ • ΞϓϦ΁ͷಋઢ
 e.g. ʮΞϓϦͰ։͘ʯϘλϯ
 ΩϟϯϖʔϯLP಺ͷϘλϯ • ϓϩϞʔγϣϯ༻ͷϦϯΫΛSNSͰ֦ࢄ • ΞϓϦͷϢʔβಉ࢜ͰϦϯΫΛڞ༗

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

ओͳύϥϝʔλ ڞ௨ link σΟʔϓϦϯΫ iOS ibi iOSΞϓϦͷόϯυϧID isi App Store্ͷΞϓϦͷID ifl ະΠϯετʔϧ࣌ʹετΞҎ֎ʹભҠ͍ͤͨ͞৔߹ɺભҠઌURL Android apn AndroidΞϓϦͷύοέʔδ໊ afl ະΠϯετʔϧ࣌ʹετΞҎ֎ʹભҠ͍ͤͨ͞৔߹ɺભҠઌURL PC ofl PCͰlinkҎ֎ʹભҠ͍ͤͨ͞৔߹ɺભҠઌURL

Slide 10

Slide 10 text

ϦονϓϨϏϡʔ༻ͷύϥϝʔλ΋ st λΠτϧ sd આ໌ si ը૾URL 300 x 200 ϐΫηϧҎ্ɺ300 KB ະຬ SNS֦ࢄ࣌ͷݟͨ໨΍ετΞϓϨϏϡʔΛϦονʹͰ͖Δ Rich Link Preview

Slide 11

Slide 11 text

ετΞϓϨϏϡʔ • App StoreભҠલʹFirebaseʹΑͬͯ
 දࣔ͞ΕΔϓϨϏϡʔ • ࠓͷॴiOSͷΈ • ΫϦοϓϘʔυΛར༻ͯ͠
 ϢʔβͷಉҰੑΛ୲อ • efr=1Λ͚ͭΔͱදࣔΛεΩοϓՄೳ

Slide 12

Slide 12 text

ετΞϓϨϏϡʔ st, sd, si Λઃఆͨ͠ྫ

Slide 13

Slide 13 text

શύϥϝʔλͱৄࡉ͸ެࣜυΩϡϝϯτͰʂ https://firebase.google.com/docs/dynamic-links/create-manually

Slide 14

Slide 14 text

ϦϯΫͷੜ੒ํ๏ • खಈͰύϥϝʔλΛ૊Έཱͯ • Firebaseͷίϯιʔϧ্Ͱ࡞੒ • SDKͰ࡞੒ 3ͭͷํ๏͕͋Δ

Slide 15

Slide 15 text

Firebaseίϯιʔϧ

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

ϦϯΫͷσόοά ϦϯΫʹEΛ͚ͭͯϒϥ΢βͰΞΫηεʂ

Slide 18

Slide 18 text

iOS 9Ҏ߱ iOS 8

Slide 19

Slide 19 text

୹ॖURLػೳ • SDK΍REST APIͰURLΛ୹ॖͰ͖Δ • ୹ॖURLղܾ࣌ʹΫϦοΫ਺ͳͲ͕ूܭ͞ΕΔ • ूܭ݁Ռ͸REST APIͳͲͰऔಘՄೳ CLICK ΫϦοΫ਺ REDIRECT ετΞ(or ࢦఆͨ͠ભҠઌ)΁ͷૹ٬਺ APP_INSTALL Πϯετʔϧ਺ (AndroidͷΈ) APP_FIRST_OPEN ΠϯετʔϧޙΞϓϦΛ։͍ͨ਺ APP_RE_OPEN ΞϓϦΛ։͍ͨ਺

Slide 20

Slide 20 text

※ Firebaseͷίϯιʔϧ্Ͱ࡞੒Ͱ͖ΔURL΋୹ॖURL
 ίϯιʔϧ্Ͱ࡞੒ͨ͠৔߹ɺूܭ݁Ռ΋ίϯιʔϧʹදࣔ͞ΕΔ

Slide 21

Slide 21 text

୹ॖURLػೳ • ୹͍ (TwitterͳͲͰͷ֦ࢄʹศརʣ • ಺༰͕૝૾Ͱ͖ͳ͍ͷͰΞϓϦ͕ϋοΫ͞Εʹ͍͘ • Firebase͕ूܭΛߦͬͯ͘ΕΔ • ΞϓϦͰड৴ޙɺ௨৴ΛߦͬͯϦϯΫΛղܾ͢Δඞཁ͕͋Δ
 εϜʔζͳσΟʔϓϦϯΫॲཧͷ๦͛ʹͳΔέʔε΋ Pros. Cons.

Slide 22

Slide 22 text

iOSΞϓϦʹ૊ΈࠐΉ

Slide 23

Slide 23 text

• Universal Links • ΧελϜεΩʔϚURLʹΑΔΞϓϦىಈ FDLʹར༻͞Ε͍ͯΔiOSͷ࢓૊Έʹ͍ͭͯগ͠ ΠϯετʔϧࡁΈ൑ఆɾΞϓϦىಈʹ͸ҎԼ͕ར༻͞Ε͍ͯΔ

Slide 24

Slide 24 text

Universal Links • υϝΠϯͱΞϓϦΛؔ࿈͚ͮΔ • αʔόʹઃఆϑΝΠϧ apple-app-site-association Λ഑ஔ • ΞϓϦͷEntitlementsͷAssociated Domainsʹ֘౰υϝΠϯΛهड़ • ΞϓϦͷΠϯετʔϧ / Ξοϓσʔτ࣌ʹؔ࿈෇͚͕ߦΘΕΔ • ϦϯΫΛ։͘ͱ͖ʹ֘౰ΞϓϦ͕͋ͬͨΒͦͷΞϓϦΛىಈ • ಉҰυϝΠϯ಺ͷ৔߹͸ΞϓϦΛىಈ͠ͳ͍
 ͢ͰʹϢʔβ͸αΠτ಺ͰαʔϏεΛମݧதͷͨΊ • ΞϓϦΛىಈ͢Δ͔͸௕ԡ͠ͷϝχϡʔͰϢʔβ͕બ୒Մೳ
 ࠷ޙͷબ୒͕OSʹهԱ͞ΕΔ iOS 9Ͱొ৔ͨ͠Deep Linkͷ࢓૊Έ

Slide 25

Slide 25 text

Universal Links ஫ҙ఺ • ΞϓϦΛ։͘ڍಈ͸ɺϢʔβͷ୺຤ͷOSʹΑ੍ͬͯޚ͞Ε͍ͯΔ • ڍಈΛม͑ΔτϦΨʔ͸ΞϓϦͷΞοϓσʔτ • apple-app-site-association͚ͩॻ͖׵͑ͯ΋ޮՌ͕ͳ͍

Slide 26

Slide 26 text

͍͟ಋೖ

Slide 27

Slide 27 text

ಋೖͷྲྀΕ 1. FirebaseϓϩδΣΫτʹΞϓϦΛ݁ͼ͚ͭΔ 2. SDKΛΠϯετʔϧ 3. Firebase Dynamic Links ίϯιʔϧͰαϒυϝΠϯΛऔಘ 4. EntitlementsΛઃఆ 5. ड৴ॲཧΛ࣮૷

Slide 28

Slide 28 text

FirebaseϓϩδΣΫτʹΞϓϦΛ݁ͼ͚ͭΔ ࢦࣔ௨ΓΞϓϦͷ৘ใΛೖྗ & ηοτΞοϓ ஫ҙ νʔϜIDʹ͸ x νʔϜID Ͱ͸ͳ͘ o Provisioning ProfileͷApp IDͷPrefix Λઃఆʢݹ͍ΞϓϦͰ͸ҟͳΔ͜ͱ͕͋Δʣ

Slide 29

Slide 29 text

SDKΛΠϯετʔϧ CocoaPodsΛར༻ pod 'Firebase/Core' pod 'Firebase/DynamicLinks' $pod install

Slide 30

Slide 30 text

FirebaseίϯιʔϧͰαϒυϝΠϯΛऔಘ 5ݸ·Ͱొ࿥/࡟আͰ͖Δ

Slide 31

Slide 31 text

ૣ͍ऀউ͔ͪͱࢥ͍͖΍…ʁ amebloΛऔΖ͏ͱͨ͠Β͜Μͳը໘͕ ΞϝʔόϒϩάͷυϝΠϯ͸ ameblo.jp Ͱ͢ ͋Γ͕ͱ͏͍͟͝·͢ʂ

Slide 32

Slide 32 text

EntitlementsΛઃఆ Associated Domainsʹઌ΄Ͳऔಘͨ͠υϝΠϯΛ௥Ճ

Slide 33

Slide 33 text

ड৴ॲཧΛ࣮૷ ४උ import Firebase // Firebaseͷڞ௨ΠϯελϯεΛηοτΞοϓ FirebaseApp.configure()

Slide 34

Slide 34 text

ड৴ॲཧΛ࣮૷ ΞϓϦʹ౉ͬͯདྷͨURL͔ΒSDKͰlinkΛऔΓग़͠ɺ֘౰ը໘΁ભҠ URLड৴ϝιου • ΧελϜεΩʔϚURL
 application(_:open:options:)
 • Universal Links
 application(_:continue:restorationHandler:)
 
 ※ ىಈ࣌͸launchOptionsʹ΋URL͕౉ͬͯ͘ΔͷͰ
 ΑΓૣ͘ॲཧΛ։࢝Մೳ


Slide 35

Slide 35 text

Firebase iOS SDK FDLͷॲཧΛߦ͏I/F FIRDynamicLinks.h ಡΜͰΈΔ

Slide 36

Slide 36 text

͓͜ͱΘΓ SwiftͰهࡌ͍ͯ͠·͕͢ ࣮ࡍ͸Objective-CͰ͢ CA.swift

Slide 37

Slide 37 text

// ΧελϜεΩʔϚURLΛFDLͱͯ͠ॲཧ͢΂͖͔Ͳ͏͔ func shouldHandleDynamicLink(fromCustomSchemeURL: URL) -> Bool // ΧελϜεΩʔϚURLΛύʔε func dynamicLink(fromCustomSchemeURL: URL) -> DynamicLink? // ௕͍Universal LinkΛύʔε func dynamicLink(fromUniversalLink: URL) -> DynamicLink? // Universal Link(௕͍URL΋୹ॖURL΋OK!)Λॲཧ͢Δศརϝιου 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

Slide 38

Slide 38 text

FIRDynamicLink.h FDLΛදݱ͢ΔΫϥε class DynamicLink: NSObject { private(set) var url: URL? /// Ϣʔβʔ͕Ұக͍ͯ͠Δ࣮֬ੑ private(set) var matchType: DLMatchType }

Slide 39

Slide 39 text

࣮૷ͯ͠ΈͨΒ…

Slide 40

Slide 40 text

ςετͰԿ౓΋ϦϯΫΛ౿ΜͩͨΊ͔ɺ ϦϯΫΛ౿ΜͰ͍ͳͯ͘΋ΞϓϦΛىಈͨ͠Β σΟʔϓϦϯΫॲཧ͕૸ΔΑ͏ʹͳͬͯ͠·͍· ͨ͠ ςετνʔϜ • ࣌ؒܦաͰղফ • efr=1Λࢦఆͯ͠ϓϨϏϡʔϖʔδΛόΠύε͍ͯͨ͠ • ͦͷ৔߹ΠϯετʔϧΛڬΜͰϢʔβͷ৘ใΛ࣮֬ʹҾ͖ܧ͙࢓૊Έ͸ͳ͍ • λΠϜελϯϓ΍༷ʑͳ৘ใΛ૊Έ߹Θͤͯແཧ΍Γߦ͍ͬͯΔͱࢥΘΕΔ • ͜͏ͨ͠ෆ࣮֬ੑ͕͋ΔͷͰɺԿ͔Λ֬ఆ͢ΔΑ͏ͳॲཧͷલʹ͸ ඞͣ֬ೝΛߦ͏΂͖

Slide 41

Slide 41 text

ͨ·ʹىಈޙ͙͢Ͱ͸ͳ͘ɺগ͠஗Εͯදࣔ͞ ΕΔΜ͚ͩͲେৎ෉ʁ σΟϨΫλʔ σόοάͨ͠ΒɺͳΜͱ Firebase iOS SDKͷ matchesShortLinkFormat(_:) ͕௕͍63-ʹରͯ͠΋ true ͜ͷ࣌͸௕͍··ͷURLͩͬͨͷͰ
 ड৴͔ͯ͠Βൃಈ͢Δ·ͰλΠϜϥά͸ͳ͍͸ͣ

Slide 42

Slide 42 text

firebase-ios-sdk/Firebase/DynamicLinks/Utilities/FDLUtilities.m let url = URL(string: "https://hoge.page.link/?abc=123")! url.path // -> "/" ୹ॖURLͱޡ൑ఆ͞ΕΔ௕͍URLͷྫ

Slide 43

Slide 43 text

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ͰରԠ

Slide 44

Slide 44 text

ϦϯΫΛ౿Ήͷ͕2ճ໨͔ͩΒɺදࣔ͞Εͳ͍Μ Ͱ͢Ͷʂ σβΠφʔ ͢Έ·ͤΜɺෆ۩߹Ͱ͢ɻ • ୹ॖURLͷղܾʹ͸ωοτϫʔΫ௨৴͕ඞཁ • Universal Linksड৴࣌ application(_:continue:restorationHandler:) ͸
 ΞϓϦ͕ActiveͰͳ͍͜ͱ΋͋Δ • ΞϓϦ͕ActiveͰͳ͍࣌ʹ௨৴͠Α͏ͱ͢Δ → ࣌ʑ௨৴Τϥʔ ୹ॖURLͷղܾʹ࣌ʑࣦഊ͍ͯͨ͠ ୹ॖURLͷղܾΛߦ͏λΠϛϯάΛௐ੔ͯ͠ରԠ

Slide 45

Slide 45 text

ΞϓϦΛΠϯετʔϧࡁΈͳͷʹετΞʹߦͬͯ ͠·͏୺຤͕͋ΔΜͰ͚͢Ͳ... ϑϩϯτΤϯδχΞ • Πϯετʔϧ൑ఆʹUniversal LinksΛར༻͍ͯ͠Δ͕ނͷ՝୊
 Universal Links →ͲͪΒͰ։͔͘͸Ϣʔβ͕બ΂Δ
 ֘౰υϝΠϯΛΞϓϦͰ։͔ͳ͍Α͏ʹ͍ͯ͠Δέʔε • ετΞʹભҠ͢ΔͱΠϯετʔϧࡁΈͳͷͰΠϯετʔϧϘλϯ͕ ʮ։͘ʯϘλϯʹͳ͍ͬͯΔɻ • ͜ͷϘλϯͰ։͍ͨ৔߹ɺ࢒೦ͳ͕ΒσΟʔϓϦϯΫॲཧ͸ߦΘΕͳ͔ͬͨ • ϓϨϏϡʔϖʔδΛܦ༝͢Ε͹͋Δ͍͸…ʁ ະղܾ

Slide 46

Slide 46 text

ӡ༻͢Δʹ͋ͨͬͯߦͬͨࣄ

Slide 47

Slide 47 text

ӡ༻୲౰ऀʹଘࡏΛ஌ͬͯ΋Β͏ ษڧձΛ։࠵

Slide 48

Slide 48 text

؆୯͔ͭ҆શʹ࢖͑ΔΑ͏ʹ͢Δ Ωϟϯϖʔϯ୲౰ऀ͕ϦϯΫΛ࡞੒ & ؅ཧ & ෼ੳͰ͖ΔΑ͏ʹ • linkΛೖྗ͢Δͱ௕͍FDL͕ੜ੒͞ΕΔεϓϨουγʔτΛ༻ҙ • ΫϦοΫɺΞϓϦॳճىಈɺΞϓϦ࠶ى͸AmebaͰར༻͍ͯ͠Δ طଘͷ࢓૊ΈͰૹ৴

Slide 49

Slide 49 text

උߟ: App Store ConnectͷApp Analyticsͷύϥϝʔλ FDLʹ෇༩ՄೳɻͲͷΩϟϯϖʔϯ͕༗ޮ͔ͷ൑அࡐྉʹɻ • ct : Ωϟϯϖʔϯ໊, 40จࣈҎ಺ • pt :ϓϩόΠμID, App Store ConnectͷʮΩϟϯϖʔϯϦϯΫΛ࡞੒ʯ ϖʔδͰ֬ೝͰ͖Δ • ݁Ռʹදࣔ͞ΕΔʹ͸5ͭҎ্ͷApple IDʹΠϯετʔϧ͞ΕΔඞཁ ͕͋Δ • ਍அ৘ใͷૹ৴ʹಉҙͨ͠ϢʔβͷΈͷ਺ࣈ

Slide 50

Slide 50 text

ॴײ • ؔ࿈ٕज़͸ηΩϡϦςΟͱརศੑͷτϨʔυΦϑ • ඞཁे෼ͳػೳ • ಛʹಉҰυϝΠϯ಺ͰͷΞϓϦಋઢʹྑ͍ • ϦϦʔεͨͯ͠ͳͷͰυΩυΩ͠ͳ͕Βݟक͍ͬͯ·͢

Slide 51

Slide 51 text

͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠