Slide 1

Slide 1 text

ϞόΠϧΞϓϦͷΦϒβʔόϏςΟ Λ޲্ͤ͞ΔϓϥΫςΟε iOSDC JAPAN 2022 nade @kazuma_nagano

Slide 2

Slide 2 text

ࣗݾ঺հ ͳͰʢ @kazuma_nagano ʣ ॴଐ ● αΠόʔΤʔδΣϯτ ○ λοϓϧ ■ SREνʔϜ ● iOSΤϯδχΞ ● ࠷ۙ͸BFFΛKMMܦ༝ͰiOS͔Βݺͼग़࣮͢૷ΛҰ௨Γ ॻ͘τϦϦϯΨϧͳΤϯδχΞΛ΍ͬͯ·͢

Slide 3

Slide 3 text

SREॴଐͷϞόΠϧΤϯδχΞʹ ● SREνʔϜʹϞ バ ΠϧΤϯ ジ χΞ(iOSɺAndroid֤1ਓ) が ઐଐ で ॴଐ͢Δܗ ● ϛογϣϯ͸ʮαʔϏεͷ৴པੑͷ޲্ʯ 
 ❌ ϞόΠϧͷج൫։ൃɺϦΞʔΩςΫνϟਪਐɺQA

Slide 4

Slide 4 text

SRE NEXT 2022 https://www.youtube.com/watch?v=mjUGAItLWhQ

Slide 5

Slide 5 text

ͦ΋ͦ΋SREͬͯͳΜ͚ͩͬʁ

Slide 6

Slide 6 text

SREͱ͸ʁ from wikipedia ● αΠτɾϦϥΠΞϏϦςΟɾΤϯδχΞϦϯάʢӳɿSite Reliability Engineeringɺ ུɿSREʣ͸ɺGoogle͕ࣾఏএɺ࣮ફ͍ͯ͠ΔγεςϜ؅ཧͱαʔϏεӡ༻ͷํ๏ ࿦Ͱ͋Δ ● αΠτϦϥΠΞϏϦςΟΤϯδχΞϦϯάΛ୲౰͢ΔΤϯδχΞΛαΠτϦϥΠΞϏ ϦςΟΤϯδχΞʢSREʣͱݺͿ https://ja.wikipedia.org/wiki/αΠτϦϥΠΞϏϦςΟΤϯδχΞϦϯά

Slide 7

Slide 7 text

Site Reliability Engineering ● ʮαΠτɺαʔ ビ εͷ৴པੑΛकΔ ʯ ● Googleʹ͓͚ΔDevOpsΛ࣮ફ͢ΔνʔϜ ○ 2004೥͔Β͋ΔΒ͍͠ ● ಠࣗͷӡ༻ プ ϥΫςΟε͕·ͱ·ͬͯΔ 
 e.g.) SLI / SLO, SLA, ΤϥʔόδΣοτɺɺɺ 
 → ʮαʔϏεͷՄ༻ੑʯΛͲ͏ଛͳΘͣʹ࡞Γଓ͚Δ͔ʁ

Slide 8

Slide 8 text

Site Reliability Engineering https://sre.google

Slide 9

Slide 9 text

ϞόΠϧʹ͓͚ΔSREʁ

Slide 10

Slide 10 text

Engineering Reliable Mobile Applications ● GoogleͷSREνʔϜͷߟ͑ΔϞ バ ΠϧΞ プ Ϧʹ͓͚Δ SREͱ͸Կ͔ʁ ● ৴པੑͷ؍఺͔ΒΈͨ࣌ͷWebΞϓϦͱͷҧ͍ ● Case Studies https://www.oreilly.com/library/view/engineering-reliable-mobile/9781492057444/

Slide 11

Slide 11 text

WebΞϓϦͱͷҧ͍ɺɺʁ

Slide 12

Slide 12 text

ϞόΠϧΞϓϦͷ৴པੑΊͬͪΌϜζΠ 
 😇

Slide 13

Slide 13 text

Ϟ バ ΠϧΞ プ ϦͳΒ で ͸ͷ೉͠͞ ● デ バ Πε਺ɺϞ デ ϧͷछྨଟ͗͢ ○ ෆ۩߹ͷ࠶ݱ΍ݪҼಛఆ͕ࠔ೉ ● ίϯτϩʔϧͰ͖ͳ͗͢͞ ○ Ϟ バ Πϧ͸Ξο プデ ʔτͷλΠϛϯ グ ΍ద༻͸Ϣʔ ザ ࣍ୈ ● ϞχλϦϯάେม͗͢ ○ ϋʔ ド ΢ΣΞͷछྨɺঢ়ଶɺOSɺෳ਺ バ ʔ ジ ϣϯͱϩ グが ଟ࣍ݩ ● มߋ؅ཧΉͣա͗ ○ Ϟ バ Πϧʹ͸ϩʔϧϑΥϫʔ ド ͔͠ͳ͍ ɺมߋʹඞཁͳϦʔ ド λΠϜ΋௕͍

Slide 14

Slide 14 text

ωΠςΟϒͷΤϯδχΞͷྗͳͯ͘͠ ʮ৴པੑͷ୲อʯΛߦ͏ͷ͸ࠔ೉

Slide 15

Slide 15 text

ϞόΠϧΞϓϦͷΦϒβʔόϏςΟ Λ޲্ͤ͞ΔϓϥΫςΟε iOSDC JAPAN 2022 nade @kazuma_nagano

Slide 16

Slide 16 text

ࠓճͷΰʔϧ ࠓճͷΰʔϧ ໌೔͔ΒωΠςΟϒΤϯδχΞͷօ͞Μ͕αʔϏεͷ৴པੑΛ޲্Ͱ͖ΔΑ͏ʹͳΔ ֓ཁ ● ϞόΠϧαʔϏεʹ͓͚ΔΦϒβʔόϏϦςΟͱ͸ʁ ● ΦϒβʔόϏϦςΟͷ࣮ݱʹඞཁͳ̏ͭͷཁૉ ● λοϓϧͰऔΓ૊ΜͰ͍ΔͦΕͧΕͷཁૉ΁ͷΞϓϩʔνͷ঺հ

Slide 17

Slide 17 text

ΦϒβʔόϏϦςΟͱ͸ʁ

Slide 18

Slide 18 text

ΦϒβʔόϏϦςΟͱ͸ʁ Wikipedia ͋ΔγεςϜͷ֎෦ग़ྗʹؔ͢Δ஌͔ࣝΒɺͦͷγεςϜͷ಺෦ঢ়ଶΛͲΕ͚ͩ ͏·͘ਪଌͰ͖Δ͔Λࣔ͢ई౓ Google 
 νʔϜ͕γεςϜͷσόοάΛੵۃతʹߦ͑ΔΑ͏ʹ͢Δπʔϧ΍ٕज़తͳ 
 ιϦϡʔγϣϯ https://en.wikipedia.org/wiki/Observability https://cloud.google.com/architecture/devops/devops-measurement-monitoring-and-observability

Slide 19

Slide 19 text

ΦϒβʔόϏϦςΟͷ޲্ ద੾ͳΦϒβʔόϏϦςΟΛ࣮ݱ͢Δʹ͸ɺ࣍ͷ΋ͷ͕ඞཁ 
 Ϩϙʔτ ● γεςϜશମͷঢ়ଶʢػೳ͍ͯ͠Δ͔ɺϦιʔεෆ଍͕ͳ͍͔ʣ ● γεςϜͷϢʔβʔମݧʢར༻Ͱ͖Δ͔ʁૢ࡞্ͷ໰୊͸ͳ͍͔ʁʣ ϞχλϦϯά ● ओͳϏδωεࢦඪͱγεςϜࢦඪ τϨʔε ● ຊ൪؀ڥͷγεςϜͷঢ়ଶΛ֬ೝͯ͠σόοάͰ͖Δπʔϧ ● ͜Ε·ͰೝࣝͰ͖ͳ͔ͬͨ͜ͱΛ֬ೝͰ͖Δπʔϧ ● ຊ൪؀ڥͷ໰୊ͷτϨʔεɺ֬ೝɺ਍அʹ໾ཱͭπʔϧ

Slide 20

Slide 20 text

͜ͷ̏ͭΛϞόΠϧΤϯδχΞͷྗͰ֦ு͢Δ

Slide 21

Slide 21 text

ҰൠతͳΦϒβʔόϏϦςΟͷ੹຿ൣғ όοΫΤϯυϕʔεͷΦϒβʔόϏϦςΟͱͷൺֱ UI / UX Server Apps Infra ● Request Latency ● Success Rate ● CPU Usage ● DB Connection

Slide 22

Slide 22 text

ཧ૝తͳΦϒβʔόϏϦςΟ όοΫΤϯυϕʔεͷΦϒβʔόϏϦςΟͱͷൺֱ UI / UX Server Apps Infra ● Request Latency ● Success Rate ● CPU Usage ● DB Connection ΞϓϦ಺෦Ͱى͖͍ͯΔ໰୊ 
 ࣮ࡍͷϢʔβʔମݧ

Slide 23

Slide 23 text

࣮ࡍͷϓϥΫςΟε঺հ

Slide 24

Slide 24 text

ΦϒβʔόϏϦςΟͷ޲্ ద੾ͳΦϒβʔόϏϦςΟΛ࣮ݱ͢Δʹ͸ɺ࣍ͷ΋ͷ͕ඞཁ 
 Ϩϙʔτ ● γεςϜશମͷঢ়ଶʢػೳ͍ͯ͠Δ͔ɺϦιʔεෆ଍͕ͳ͍͔ʣ ● γεςϜͷϢʔβʔମݧʢར༻Ͱ͖Δ͔ʁૢ࡞্ͷ໰୊͸ͳ͍͔ʁʣ ϞχλϦϯά ● ओͳϏδωεࢦඪͱγεςϜࢦඪ τϨʔε ● ຊ൪؀ڥͷγεςϜͷঢ়ଶΛ֬ೝͯ͠σόοάͰ͖Δπʔϧ ● ͜Ε·ͰೝࣝͰ͖ͳ͔ͬͨ͜ͱΛ֬ೝͰ͖Δπʔϧ ● ຊ൪؀ڥͷ໰୊ͷτϨʔεɺ֬ೝɺ਍அʹ໾ཱͭπʔϧ

Slide 25

Slide 25 text

ఆظతͳϝτϦΫε֬ೝ

Slide 26

Slide 26 text

ఆظతͳϝτϦΫε֬ೝ ● ຖϦϦʔε͝ͱʹόοΫΤϯυɺωΠςΟϒͦΕͧΕͰγεςϜͷϝτϦΫεࢦඪͷ ֬ೝΛߦ͏ ● ֬ೝͨ͠΋ͷΛϨϙʔτͱͯ͠։ൃνʔϜʹڞ༗ɺ஝ੵ͍ͯ͘͠

Slide 27

Slide 27 text

ࢀߟ) ϝτϦΫε֬ೝͰݟ͍ͯΔ΋ͷ શମ ● DAU όοΫΤϯυ ● APMʢApplication Performance Managementʣ ● ֤छΠϯϑϥͷεςʔλε

Slide 28

Slide 28 text

ࢀߟ) ϝτϦΫε֬ೝͰݟ͍ͯΔ΋ͷ ωΠςΟϒ ● Firebase Crashlytics ○ Ϋϥογϡ཰ ● Firebase Performance ○ ىಈ଎౓ɺωοτϫʔΫ଎౓ɺϨϯμϦϯά଎౓ ● Xcode Metrics ○ Battery Usage, Disk Write, Hang Rate, Launch Time, Memory, Scrolling, Terminations ● ͦͷଞ ○ ΞϓϦαΠζʢϦϦʔεϏϧυͷipaαΠζʣ

Slide 29

Slide 29 text

Xcode Organizer

Slide 30

Slide 30 text

ݟΔ৔ॴ͕෼͔Εͯͯେมͦ͏ʂ 🖋🍍ͱײͨͦ͜͡ͷ͋ͳͨ🍎🖋

Slide 31

Slide 31 text

߹ମͰ͖·͢ʂ 🖋🍍🍎🖋

Slide 32

Slide 32 text

App Store Connect API

Slide 33

Slide 33 text

1ͭͷμογϡϘʔυʹू໿ Firebase Xcode Metrics Firebase Performance Firebase Crashlytics User Crash Key Metrics Google Data Portal Auto Export BigQuery Intermediate table BigQuery = Intermediate table BigQuery App Store Connect API Google Data Portal

Slide 34

Slide 34 text

1ͭͷμογϡϘʔυʹू໿ FastlaneͰApp Store Connect APIͰMetricsΛऔಘͯ͠DataDogʹϩάΛૹΔExample https://github.com/kazumanagano/FetchAppstoreMetricAction

Slide 35

Slide 35 text

ఆظతͳϝτϦΫε֬ೝ ஫ҙ఺ ● ݸʑʹ֬ೝ͢Δ͚ͩ͡Όͳ͘૬ޓʹى͖͏ΔӨڹʹؔ͢ΔίϛϡχέʔγϣϯΛͱΔ ྫʣ ● ϦΫΤετ਺ͷ૿Ճ → ViewModelͷϝϞϦʔϦʔΫىҼ ● ը૾αΠζͷංେԽ → ΩϟογϡʹΑΔϝϞϦރׇʹΑΔΫϥογϡ

Slide 36

Slide 36 text

ϞχλϦϯά΁ͷΞϓϩʔν

Slide 37

Slide 37 text

ΦϒβʔόϏϦςΟͷ޲্ ద੾ͳΦϒβʔόϏϦςΟΛ࣮ݱ͢Δʹ͸ɺ࣍ͷ΋ͷ͕ඞཁ 
 Ϩϙʔτ ● γεςϜશମͷঢ়ଶʢػೳ͍ͯ͠Δ͔ɺϦιʔεෆ଍͕ͳ͍͔ʣ ● γεςϜͷϢʔβʔମݧʢར༻Ͱ͖Δ͔ʁૢ࡞্ͷ໰୊͸ͳ͍͔ʁʣ ϞχλϦϯά ● ओͳϏδωεࢦඪͱγεςϜࢦඪ τϨʔε ● ຊ൪؀ڥͷγεςϜͷঢ়ଶΛ֬ೝͯ͠σόοάͰ͖Δπʔϧ ● ͜Ε·ͰೝࣝͰ͖ͳ͔ͬͨ͜ͱΛ֬ೝͰ͖Δπʔϧ ● ຊ൪؀ڥͷ໰୊ͷτϨʔεɺ֬ೝɺ਍அʹ໾ཱͭπʔϧ

Slide 38

Slide 38 text

ϞόΠϧΞϓϦͷSLI / SLOߏங

Slide 39

Slide 39 text

ϞόΠϧΞϓϦͷSLI / SLOߏங SLI / SLOͱ͸ SLI(Service Level Indicator) : αʔ ビ εͷՄ༻ੑɺ඼࣭Λܭଌ͢Δࢦඪ SLO(Service Level Objective) : ֤SLIʹର͢Δ໨ඪ஋

Slide 40

Slide 40 text

ϞόΠϧΞϓϦͷSLI / SLOߏங ϞόΠϧΞϓϦͷՄ༻ੑ

Slide 41

Slide 41 text

ϞόΠϧΞϓϦͷSLI / SLOߏங Մ༻ੑͷఆٛΛ޿͛Δ Ξ プ Ϧέʔγϣϯ が ར༻Մೳ で ͳ͍ঢ়ଶͷྫ ● ΞΠίϯΛλο プ ͨ͠ が ɺΞ プ Ϧ が ͳ͔ͳ͔ىಈ͠ͳ͍ 
 => ىಈ࣌ؒ ● ボ λϯΛλο プ ͯ͠΋ɺΞ プ Ϧ が ൓Ԡ͢Δؾ഑ が ͳ͍ 
 => ը໘଺ࡏ࣌ؒ ● ͭͶʹԿ΋ͳ͍ը໘ が දࣔ͞Ε͍ͯͯɺίϯςϯπ が ݟΕͳ͍ 
 => ϨεϙϯεͷύʔεΤϥʔ ● ಈ͖ が ΋ͬ͞Γ͢͠ ぎ ͯ࢖͍෺ʹͳΒͳ͍ 
 => ϑϨʔϜͷϨϯ ダ Ϧϯ グ ଎౓

Slide 42

Slide 42 text

ϞόΠϧΞϓϦͷSLI / SLOߏங Մ༻ੑͷఆٛΛ޿͛Δ Ξ プ Ϧέʔγϣϯ が ར༻Մೳ で ͳ͍ঢ়ଶͷྫ ● ΞΠίϯΛλο プ ͨ͠ が ɺΞ プ Ϧ が ͳ͔ͳ͔ىಈ͠ͳ͍ 
 => ىಈ࣌ؒ ● ボ λϯΛλο プ ͯ͠΋ɺΞ プ Ϧ が ൓Ԡ͢Δؾ഑ が ͳ͍ 
 => ը໘଺ࡏ࣌ؒ ● ͭͶʹԿ΋ͳ͍ը໘ が දࣔ͞Ε͍ͯͯɺίϯςϯπ が ݟΕͳ͍ 
 => ϨεϙϯεͷύʔεΤϥʔ ● ಈ͖ が ΋ͬ͞Γ͢͠ ぎ ͯ࢖͍෺ʹͳΒͳ͍ 
 => ϑϨʔϜͷϨϯ ダ Ϧϯ グ ଎౓

Slide 43

Slide 43 text

͞Βʹ޿͛Δͱɺɺ

Slide 44

Slide 44 text

Մ༻ੑ ⊃ ϢʔβʔͷUXͷظ଴஋

Slide 45

Slide 45 text

ϞόΠϧΞϓϦͷSLI / SLOߏங Ϣʔβʔͷظ଴͢ΔUXΛΧόʔ͢ΔՄ༻ੑͷఆٛ ϝϯόʔ͔ΒʮαʔϏεͷՄ༻ੑʯͷٵ্͍͛ ● औΓ͍ͨࢦඪɺఆٛɺܭଌํ๏ɺѱԽͨ͠৔߹ʹଛͳΘΕΔUXΛώΞϦϯά ● ϑΥʔΧε͢ΔࢦඪɺίΞͳମݧΛ࢈ΜͰ͍ΔUXΛܾఆ͢Δ

Slide 46

Slide 46 text

Մ༻ੑΛ΋ͱʹͨ͠SLIΛઃఆ ڞ௨ ● Ϋϥογϡ / ANR ػೳ͝ͱͷΩʔϝτϦΫε 
 ྫ) ● ϝοηʔδ: ಡΈࠐΈ଎౓ ● ΧʔυϑϦοΫ: ࠶ϑϦοΫՄೳʹͳΔ·Ͱͷ࣌ؒ

Slide 47

Slide 47 text

SLIҧ൓Λ࠶ݱͨ͠ΞϓϦΛ࢖ͬͨSLOܾΊ ● աڈͷΠϯγσϯτ࣌ͷࢦඪ΍ɺࣄલώΞϦϯά͔Βɺ͖͍͠஋ʹ͋ͨΓΛ͚ͭΔ 
 ● σόοάػೳͰৄࡉͳ͖͍͠஋Λௐ੔ՄೳͳΞϓϦΛ༻ҙ͠ɺ৮Γͳ͕Βٞ࿦

Slide 48

Slide 48 text

FirebaseΛ࢖ͬͨՄ༻ੑͷܭଌྫ

Slide 49

Slide 49 text

Ξϥʔτͷઃఆͷࣗ༝౓ Firebase Performance ● ࡞੒ͨ͠ࢦඪ͝ͱʹΞϥʔτͷઃఆ͕Մೳ ● ͖͍͠஋Λ50ʙ95ύʔηϯλΠϧͷࢦఆ͕Մೳ Firebase Crashlytics ● ௚ۙ1࣌ؒͷηογϣϯʹର͢ΔΫϥογϡ཰ ● ͖͍͠஋Λ0.1%ʙ1.0%ͰίϯτϩʔϧՄೳ

Slide 50

Slide 50 text

Ϋϥογϡϩάͷ෼ྨ https://firebase.google.com/docs/crashlytics/customize-crash-reports import UIKit import FirebaseCrashlytics final class LoginViewController: UIViewController { // ը໘Λදࣔ͢ΔλΠϛϯάͰCrashlyticsʹΧελϜΩʔΛઃఆ override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) Crashlytics.crashlytics().setCustomValue("login", forKey: "domain") } iOSΞϓϦͰͷϩάΠϯը໘ʹର͢Δ࣮૷ྫ ֤ػೳͷը໘දࣔ࣌ʹCrashlyticsʹΧελϜΩʔΛઃఆ͢Δ ● ΧελϜΩʔΛ΋ͱʹBigQuery (Data Portal) ্ͰػೳυϝΠϯ͝ͱͷΫϥογϡΛूܭ ● ػೳ͝ͱͷΞϥʔτ͸ઃఆͰ͖ͳ͍ ○ Velocity Alert → μογϡϘʔυͰػೳӨڹ֬ೝ

Slide 51

Slide 51 text

τϨʔε΁ͷΞϓϩʔν

Slide 52

Slide 52 text

ΦϒβʔόϏϦςΟͷ޲্ ద੾ͳΦϒβʔόϏϦςΟΛ࣮ݱ͢Δʹ͸ɺ࣍ͷ΋ͷ͕ඞཁ 
 Ϩϙʔτ ● γεςϜશମͷঢ়ଶʢػೳ͍ͯ͠Δ͔ɺϦιʔεෆ଍͕ͳ͍͔ʣ ● γεςϜͷϢʔβʔମݧʢར༻Ͱ͖Δ͔ʁૢ࡞্ͷ໰୊͸ͳ͍͔ʁʣ ϞχλϦϯά ● ओͳϏδωεࢦඪͱγεςϜࢦඪ τϨʔε ● ຊ൪؀ڥͷγεςϜͷঢ়ଶΛ֬ೝͯ͠σόοάͰ͖Δπʔϧ ● ͜Ε·ͰೝࣝͰ͖ͳ͔ͬͨ͜ͱΛ֬ೝͰ͖Δπʔϧ ● ຊ൪؀ڥͷ໰୊ͷτϨʔεɺ֬ೝɺ਍அʹ໾ཱͭπʔϧ

Slide 53

Slide 53 text

ϨεϙϯεͷύʔεΤϥʔͷݕ஌

Slide 54

Slide 54 text

ϨεϙϯεͷύʔεΤϥʔͷݕ஌ ● REST APIͷϨεϙϯεΛCodable౳Λ༻͍ͯΫϥΠΞϯτଆʹఆٛ͞Ε͍ͯΔEntity ʹύʔε͠Α͏ͱ͢ΔࡍʹඞཁͳεΩʔϚ͕ܽଛ͍ͯͨ͠৔߹ʹड͚औΕͳ͘ͳΔ ○ όοΫΤϯυͰ͸ݕ஌͕Ͱ͖ͳ͍ ● ࠷৽όʔδϣϯͰͷػೳ࡟আ࣌ʹɺաڈόʔδϣϯΞϓϦʹඞཁͳεΩʔϚ͕ܽଛ͢ ΔͳͲɺόοΫΤϯυͷϦϦʔεىҼͰൃੜ͢Δ ○ ϦΞϧλΠϜͳݕ஌͕༗ޮ

Slide 55

Slide 55 text

ύʔεΤϥʔʹΑΔো֐ͷྫ ϨεϙϯεͷύʔεΤϥʔͷݕ஌ // αʔόʔϦϦʔεલ { "_id": 1234, "name": "user" } // αʔόʔϦϦʔεޙ { "id": 1234, "name": "user" } struct User: Codable { let id: Int let name: String } API Response ͷjson ରԠ͢ΔSwiftଆͷCodable

Slide 56

Slide 56 text

ϨεϙϯεͷύʔεΤϥʔͷݕ஌

Slide 57

Slide 57 text

ϨεϙϯεͷύʔεΤϥʔͷݕ஌

Slide 58

Slide 58 text

ϨεϙϯεͷύʔεΤϥʔͷݕ஌ do { try JSONDecoder().decode(Response.self, from: data) } catch { var errString = error.localizedDescription // dev؀ڥͷΈ࣮ࡍͷϨεϙϯεΛૹ৴ #if DEBUG var jsonString = "" if let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) { jsonString = String(describing: json) } errString += ", response: \(jsonString)" #endif // pathதͷidΛਖ਼نԽ let normalizedPath = path // uuidΛਖ਼نԽ .replacingUUID() // numberͷidΛਖ਼نԽ .replacingNumId() Logger.warn(.parseError(endPoint: normalizedPath, message: error.localizedDescription, error: error)

Slide 59

Slide 59 text

Ϣʔβʔ໰͍߹ΘͤௐࠪͷτϨʔαϏϦςΟ޲্

Slide 60

Slide 60 text

Ϣʔβʔ໰͍߹ΘͤௐࠪͷτϨʔαϏϦςΟ޲্ ● Ϣʔβʔ͔Βෆ۩߹ͷ໰͍߹Θ͕ͤ͋ͬͨ৔߹ʹ࠶ݱ͕Ͱ͖ͳ͍ ● ໰͍߹ΘͤϢʔβʔͷΞϓϦ಺Ͱ ○ ͲͷλΠϛϯάͰ ○ ͲΜͳΤϥʔ͕ग़͍ͯΔ͔ ͕஌Γ͍ͨ

Slide 61

Slide 61 text

Ϣʔβʔ໰͍߹ΘͤௐࠪͷτϨʔαϏϦςΟ޲্ ● μΠΞϩάʹΤϥʔίʔυΛهࡌ ○ Ϣʔβʔ͔ΒεΫϦʔϯγϣοτΛૹͬͯ΋Β͏ ○ ಉλΠϛϯάͰCrashlyticsʹϩάૹ৴ ● CrashlyticsͰ೔෇ɺ࣌ؒɺϢʔβʔIDɺΤϥʔίʔυͰ 
 ಉ͡λΠϛϯάͰൃੜ͍ͯ͠ΔΤϥʔ಺༰͕ΈΕΔΑ͏ʹ

Slide 62

Slide 62 text

Ϣʔβʔ໰͍߹ΘͤௐࠪͷτϨʔαϏϦςΟ޲্

Slide 63

Slide 63 text

Ϣʔβʔ໰͍߹ΘͤௐࠪͷτϨʔαϏϦςΟ޲্ ࣮ࡍʹಛఆͰ͖ͨ໰͍߹ΘͤݪҼ ● WiFiىҼͷSSLΤϥʔ ● ୺຤ͷηΩϡϦςΟιϑτʹΑΔIP੍ݶ ● ViewModelͷϝϞϦϦʔΫىҼͷଟॏϦΫΤετ

Slide 64

Slide 64 text

֎෦SNSͷೝূαʔϏεͷো֐ݕ஌

Slide 65

Slide 65 text

֎෦ͷೝূαʔϏεͷো֐ݕ஌ ● ֎෦ͷೝূαʔϏεͷো֐࣌ʹૉૣ͘Ϣʔβʔʹڞ༗͍ͨ͠ ● ໰͍߹Θ͕ͤ૿͑ΔલʹνʔϜʹঢ়گΛڞ༗͓͖͍ͯͨ͠

Slide 66

Slide 66 text

֎෦ͷೝূαʔϏεͷো֐ݕ஌ Ωϟϯηϧ౳ͷط஌ͷΤϥʔݪҼΛϑΟϧλʔͯ͠ϩάૹ৴Λߦ͏ let authError = error as? ASAuthorizationError switch authError?.code { case .canceled: break default: Logger.warn( .snsError(provider: .apple), error: error ) } let errorCode = GIDSignInError.Code(rawValue: error.code) switch authError?.code { case .canceled: break default: Logger.warn( .snsError(provider: .apple), error: error ) Sign in with Apple Google

Slide 67

Slide 67 text

֎෦ͷೝূαʔϏεͷো֐ݕ஌ Ұఆظؒͷϩάͷྔͷฏۉ͔ΒΞϥʔτͷᮢ஋ΛܾΊΔ

Slide 68

Slide 68 text

·ͱΊ ● SREྖҬʹϞόΠϧΤϯδχΞ͕׆༂Ͱ͖ΔྖҬ͕·ͩ·ͩ͋Δ ● ΦϒβʔόϏϦςΟΛߏ੒͢ΔϨϙʔτɺϞχλϦϯάɺτϨʔεͷ̏ͭ΁ͷ 
 λοϓϧͰऔΓ૊ΜͰ͍Δ5ͭͷΞϓϩʔνͷ঺հ 1. ϝτϦΫε֬ೝ 2. SLI / SLOࡦఆ 3. ύʔεΤϥʔݕ஌ 4. ໰͍߹ΘͤͷτϨʔαϏϦςΟ޲্ 5. ֎෦SNSىҼͷো֐ݕ஌

Slide 69

Slide 69 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 
 Ξϯέʔτ͓଴ͪͯ͠·͢ʂ