Slide 1

Slide 1 text

In-App Purchasesͷ
 ࣮૷લʹ஌͓͖͍ͬͯͨ
 ϋϚΓϙΠϯτ ΈͯͶͷMeetup #5 ܾࡁΛࢧ͑Δٕज़ 2019/05/20 גࣜձࣾϛΫγΟ ΈͯͶࣄۀ෦ ϩΫωϜ@rockname

Slide 2

Slide 2 text

ϩΫωϜ@rockname • גࣜձࣾϛΫγΟ 2018೥৽ଔೖࣾ • Ո଒ΞϧόϜΈͯͶ • ΞϓϦ։ൃάϧʔϓ
 iOS(Swift, objc) > Android(Kotlin, Java) == Rails(ruby) • झຯ: VTuberؑ৆ • WWDC 2019 ࢀՃ͠·͢ ✈
 ࣗݾ঺հ

Slide 3

Slide 3 text

ΞδΣϯμ ࿩͢͜ͱ • In-App Purchasesͱ͸Կ͔ • ΈͯͶʹ͓͚ΔIn-App Purchasesͷେ·͔ͳ࣮૷ • In-App PurchasesͰϋϚͬͨ͜ͱͱͦͷճආࡦ
 ࿩͞ͳ͍͜ͱ • αʔόʔαΠυͷ࣮૷ • iOSͷࡉ͔͍࣮૷

Slide 4

Slide 4 text

In-App Purchasesͱ͸ʁ

Slide 5

Slide 5 text

In-App Purchases • iOSʹ͓͚ΔΞϓϦ಺՝ۚͷ໊শ • ΞϓϦ಺ͷػೳΛఏڙ͢Δࡍʹ࢖༻ ͢Δඞཁ͕͋Δ • ࠷ۙApple͕αϒεΫϦϓγϣϯΛ ਪͯ͠Δײ͕͋͡Δ

Slide 6

Slide 6 text

ΞϓϦ಺՝͕ۚ
 ൓ө͞ΕΔ·ͰͷྲྀΕ

Slide 7

Slide 7 text

1. AppStoreͷtransactionΛ؂ࢹ

Slide 8

Slide 8 text

2. ՝ۚΞΠςϜΛදࣔ

Slide 9

Slide 9 text

3. AppStoreͰߪೖॲཧ

Slide 10

Slide 10 text

4. ϨγʔτͷόϦσʔγϣϯ

Slide 11

Slide 11 text

ࣗಈߋ৽αϒεΫϦϓγϣϯ ͷ৔߹͸͞Βʹ…

Slide 12

Slide 12 text

ঢ়ଶߋ৽௨஌ • ࣗಈߋ৽αϒεΫϦϓγϣϯͷঢ়ଶ͕੾ΓସΘͬͨ͜ͱΛ௨஌ "QQ4UPSF

Slide 13

Slide 13 text

ঢ়ଶߋ৽௨஌ • ࣗಈߋ৽αϒεΫϦϓγϣϯͷঢ়ଶ͕੾ΓସΘͬͨ͜ͱΛ௨஌ αϒεΫϦϓγϣϯΛΩϟϯηϧ "QQ4UPSF

Slide 14

Slide 14 text

ঢ়ଶߋ৽௨஌ • ࣗಈߋ৽αϒεΫϦϓγϣϯͷঢ়ଶ͕੾ΓସΘͬͨ͜ͱΛ௨஌ αϒεΫϦϓγϣϯΛΩϟϯηϧ 5ZQF$"/$&- "QQ4UPSF

Slide 15

Slide 15 text

ঢ়ଶߋ৽௨஌ • ࣗಈߋ৽αϒεΫϦϓγϣϯͷঢ়ଶ͕੾ΓସΘͬͨ͜ͱΛ௨஌ αϒεΫϦϓγϣϯΛΩϟϯηϧ Ϣʔβʔσʔλͷߋ৽ 5ZQF$"/$&- "QQ4UPSF

Slide 16

Slide 16 text

ຊ୊

Slide 17

Slide 17 text

In-App Purchasesͷ࣮૷Ͱ
 ϋϚͬͨ5ͭͷপ

Slide 18

Slide 18 text

1. SandboxͰ͔͠ ߪೖͷಈ࡞֬ೝ͕Ͱ͖ͳ͍

Slide 19

Slide 19 text

ΞϓϦ಺՝ۚͷςετ • App Store ConnectͰSandboxςελʔ Λ࡞੒ • SandboxςελʔͰߪೖ͢Δ͜ͱͰ AppleͷςεταʔόʔͰϨγʔτ͕ॲཧ ͞ΕΔ • Sandbox؀ڥͷϨγʔτ͕෷͍ग़͞ΕΔ

Slide 20

Slide 20 text

ΞϓϦ಺՝ۚͷਃ੥ • ΞϓϦͷϨϏϡʔ΋Appleͷ SandboxͰϨγʔτ͕ॲཧ ͞ΕΔ • ຊ൪Ͱॲཧ͞ΕΔͷ͸ΞϓϦ ΛϦϦʔε͔ͯ͠Β͚ͩ…

Slide 21

Slide 21 text

αʔόʔଆͰͷຊ൪Ϩγʔτ ॲཧͷಈ࡞֬ೝ͕Ͱ͖ͳ͍

Slide 22

Slide 22 text

ϓϩϞίʔυ

Slide 23

Slide 23 text

ϓϩϞʔγϣϯίʔυͱ͸ • ਃ੥ͷ௨ͬͨΞϓϦͳͲΛެ։લͰ΋഑෍͢ Δ͜ͱ͕Ͱ͖Δ • ެࣜυΩϡϝϯτతʹ͸ʮજࡏސ٬΍Ϩ Ϗϡʔهࣄͷ࡞੒ऀ΁ͷ഑෍ͳͲϓϩϞʔ γϣϯͷͨΊͷ࢖༻ʯ͕૝ఆ͞Ε͍ͯΔ

Slide 24

Slide 24 text

ϓϩϞʔγϣϯίʔυͷ͓͔͛Ͱ ແࣄʹϦϦʔεલʹຊ൪Ͱͷ
 ಈ࡞֬ೝ͕Ͱ͖ͨ

Slide 25

Slide 25 text

2. Ϩγʔτ͕ ΋ͷ͘͢͝௕͘ͳΔ

Slide 26

Slide 26 text

SandboxςελʔͰಈ࡞֬ೝ͍ͯͨ͋͠Δ೔ • Կ౓՝ۚͯ͠΋ࣦഊ͢Δ • αʔόʔʹೖͬͯϩάΛݟΔͱݪҼ͕Θ͔ͬͨ…

Slide 27

Slide 27 text

SandboxςελʔͰಈ࡞֬ೝ͍ͯͨ͋͠Δ೔ • Կ౓՝ۚͯ͠΋ࣦഊ͢Δ • αʔόʔʹೖͬͯϩάΛݟΔͱݪҼ͕Θ͔ͬͨ…

Slide 28

Slide 28 text

ফ໣ܕϓϩμΫτҎ֎ͷ
 ϓϩμΫτߪೖ৘ใ͸Ϩγʔτʹ࢒Γଓ͚Δ • ͭ ެࣜυΩϡϝϯτ w ফ໣ܕϓϩμΫτͷ৘ใ͸ɺࢧ෷͍͕ߦΘΕΔͱγʔτʹ௥Ճ͞Εɺ τϥϯβΫγϣϯΛऴྃ͢Δ·ͰϨγʔτ্ʹ࢒Γ·͢ɻτϥϯβΫ γϣϯͷऴྃޙɺ͜ͷ৘ใ͸Ϩγʔτ͕࣍ʹߋ৽͞ΕΔͱ͖ɺͨͱ͑ ͹Ϣʔβʔ͕࣍ʹߪೖΛߦͬͨͱ͖ʹ࡟আ͞Ε·͢ɻ
 ͜ΕҎ֎ͷछྨͷϓϩμΫτߪೖͷ৘ใ͸ɺࢧ෷͍͕ߦΘΕΔͱϨ γʔτʹ௥Ճ͞ΕɺϨγʔτʹ࢒Γଓ͚·͢ɻ • DBʹอଘ͢Δͱ͖ʹ͸Ұ޻෉ඞཁͦ͏

Slide 29

Slide 29 text

FYDMVEFPME USBOTBDUJPOT

Slide 30

Slide 30 text

Key: exclude-old-transactions • ϨγʔτͷόϦσʔγϣϯΛߦ͏ࡍʹ
 `exclude-old-transactions` Λࢦఆ͢Δ͜ͱͰ
 αϒεΫϦϓγϣϯͷ࠷৽ͷtransactionͷΈΛऔಘͰ͖Δʂʂʂ

Slide 31

Slide 31 text

3. υΩϡϝϯτʹͳ͍ Τϥʔίʔυ͕ฦͬͯ͘Δ

Slide 32

Slide 32 text

ΤϥʔϋϯυϦϯά • ΞϓϦͷ՝ۚʹࣦഊͨ͠৔߹ʹద੾ͳΤϥʔϝοηʔδΛ
 Ϣʔβʔʹݟͤͯ͋͛Δඞཁ͕͋Δ • StoreKitͰͷΤϥʔίʔυ͸ `SKErrorDomain` ͱͳΔ

Slide 33

Slide 33 text

ߪೖ్தͰͷΩϟϯηϧ΋Τϥʔѻ͍ • ߪೖ్தग़ͯ͘ΔΞϥʔτͷΩϟϯηϧΛબ୒͢ΔͱɺͦΕ΋Τ ϥʔͱͯ͠ྲྀΕͯ͘Δ • Τϥʔίʔυ͸ `SKErrorDomain.paymentCancelled` ͱͳΔ • Ωϟϯηϧͷ৔߹͚ͩ guard ͯ͋͛͠Δඞཁ͕͋Δ guard error.code != SKError.paymentCancelled.rawValue else { return }

Slide 34

Slide 34 text

෮ݩ్தͰͷΩϟϯηϧ͸…? • In-App PurchasesͰ͸ߪೖͨ͠ϓϩμΫτΛ෮ݩ͢ΔखஈΛఏڙ ͢Δඞཁ͕͋Δ (rejectҊ݅) • ͦͷࡍʹߦ͏ɺAppϨγʔτͷߋ৽ॲཧͷ్தग़ͯ͘ΔΞϥʔτ ͷΩϟϯηϧΛબ୒͢ΔͱɺͦΕ΋Τϥʔͱͯ͠ྲྀΕͯ͘Δ • Τϥʔίʔυ͸ `SSErrorDomain` …

Slide 35

Slide 35 text

෮ݩ్தͰͷΩϟϯηϧ͸…? • In-App PurchasesͰ͸ߪೖͨ͠ϓϩμΫτΛ෮ݩ͢ΔखஈΛఏڙ ͢Δඞཁ͕͋Δ (rejectҊ݅) • ͦͷࡍʹߦ͏ɺAppϨγʔτͷߋ৽ॲཧͷ్தग़ͯ͘ΔΞϥʔτ ͷΩϟϯηϧΛબ୒͢Δͱ… • Τϥʔίʔυ͸ `SSErrorDomain` …

Slide 36

Slide 36 text

υΩϡϝϯτʹࡌͬͯΔ
 Τϥʔίʔυ SKErrorDomain ෮ݩΩϟϯηϧ࣌ʹฦ͖ͬͯͨ
 Τϥʔίʔυ SSErrorDomain

Slide 37

Slide 37 text

υΩϡϝϯτʹࡌͬͯΔ
 Τϥʔίʔυ SKErrorDomain ෮ݩΩϟϯηϧ࣌ʹฦ͖ͬͯͨ
 Τϥʔίʔυ SSErrorDomain

Slide 38

Slide 38 text

υΩϡϝϯτʹࡌͬͯΔ
 Τϥʔίʔυ SKErrorDomain ෮ݩΩϟϯηϧ࣌ʹฦ͖ͬͯͨ
 Τϥʔίʔυ SSErrorDomain ͳΜ͔ͪΐͬͱҧ͏

Slide 39

Slide 39 text

SSErrorDomain • StoreKit಺෦Ͱൃੜ͢ΔΤϥʔͷίʔυ͕࿙ΕͨΑ͏ • Open Radar: https://openradar.appspot.com/25502597
 • υΩϡϝϯτԽ͞Ε͍ͯͳ͍ͷͰϋϯυϦϯάͷ͠Α͏͕ͳ͍
 • ݱঢ়ΈͯͶͰ͸ͪ͜ΒͷΤϥʔίʔυ΋guardจͰ return ͯ͠
 ରॲ͍ͯ͠Δ

Slide 40

Slide 40 text

4. υΩϡϝϯτʹͳ͍ ௨஌λΠϓ͕ฦͬͯ͘Δ

Slide 41

Slide 41 text

͋Δ೔ͷSlack • ϨγʔτॲཧपΓͷΤϥʔ͕ྲྀΕͯ͘ΔSlackͷνϟϯωϧʹͯ
 ෆԺͳϝοηʔδ͕දࣔ͞ΕΔ

Slide 42

Slide 42 text

͋Δ೔ͷSlack • ϨγʔτॲཧपΓͷΤϥʔ͕ྲྀΕͯ͘ΔSlackͷνϟϯωϧʹͯ
 ෆԺͳϝοηʔδ͕දࣔ͞ΕΔ

Slide 43

Slide 43 text

͋Δ೔ͷSlack

Slide 44

Slide 44 text

Ṗͷঢ়ଶߋ৽௨஌λΠϓ
 DID_CHANGE_RENEWAL_STATUS

Slide 45

Slide 45 text

࣍ͷ೔ͷSlack

Slide 46

Slide 46 text

Subscription Offers • iOS 12.2͔Βར༻ՄೳʹͳΔɺαϒεΫϦϓγϣϯΛղ໿ͨ͠Ϣʔβʔʹର͠ ͯఏڙͰ͖ΔDiscountͷ৽͍͠ϓϩϞʔγϣϯϓϥϯ • `DID_CHANGE_RENEWAL_STATUS` ͸ͦΕʹ෇ਵͯ͠ఏڙ͞Εͨ৽͍͠௨஌ λΠϓ • ΈͯͶ͸هࣄެ։લʹ͜ͷ௨஌λΠϓͷଘࡏʹ͍ͭͯ஌ͬͨ਺গͳ͍νʔϜ
 ࠓޙ΋ෆ༻ҙʹ৽͍͠௨஌λΠϓΛ଍͞ΕΔՄೳੑ͕͋ΔͷͰɺ
 ߟྀͯ͠αʔόʔαΠυ͸࣮૷͠Α͏

Slide 47

Slide 47 text

5. ਃ੥ͨ͠ߪೖΞΠςϜ͸ औΓԼ͛Δ͜ͱ͕Ͱ͖ͳ͍

Slide 48

Slide 48 text

rejectͷόοϑΝͱͯ͠Ծਃ੥ • Կճ͔reject͞ΕΔ͜ͱΛݟӽͯ͠ΈͯͶ͸iOSΞϓϦΛ2݄Լ० ʹԾਃ੥͍ͯͨ͠ • ҊͷఆԿ౓͔ϦδΣΫτΛ͘Βͬͨ ❌
 ͕ɺແࣄʹ৹͕ࠪ௨Δʂʂʂ

Slide 49

Slide 49 text

਺೔ޙ… • ϓϨϛΞϜެ։લʹόάϑΟοΫεͷࠩ෼ΛผϦϦʔεͱͯ͠ग़͢ ͜ͱʹ • ;ͱAppStoreΛͷ͍͍ͧͯΔͱ…

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

ϓϨϛΞϜ͕ϦϦʔε͞Ε͍ͯΔ

Slide 54

Slide 54 text

ΞϓϦ಺՝ۚͷਃ੥ • ΞϓϦ಺՝ۚͷ࠷ॳͷਃ੥͸ରԠ͢Δipa(όΠφϦ)ʹඥ͚ͮͯਃ ੥͢Δඞཁ͕͋Δ • ࣍ճҎ߱ͷΞϓϦ಺՝ۚͷਃ੥͸ͦΕࣗ਎ͷΈͰՄೳ

Slide 55

Slide 55 text

Կ͕μϝͩͬͨʁ • ΞϓϦ಺՝ۚͷਃ੥࣌ʹAppStoreConnect্Ͱʮ഑৴Մೳʯͷ νΣοΫϘοΫεΛ unchecked ʹ͢Δ΂͖ͩͬͨʁ

Slide 56

Slide 56 text

ޙ͔Β֎ͤͳ͍ͷʁ • `disabled` ʹͳ͍ͬͯͯ֎ͤͳ͔ͬͨ • ެࣜυΩϡϝϯτతʹ͸ݖݶ͕͋Ε͹ૢ࡞Ͱ͖Δ͸ͣͳͷʹ • https://help.apple.com/app-store-connect/#/ dev360aba524 • AppleʹԿ౓΋໰͍߹Θ͕ͤͨͪ͜Βͷ༧ظ͢Δճ౴͸ಘΒΕͳ ͔ͬͨ…

Slide 57

Slide 57 text

Έͳ͞Μ͸ؾΛ͚͍ͭͯͩ͘͞

Slide 58

Slide 58 text

WWDCͰ৭ʑฉ͍͖ͯ·͢ ✈

Slide 59

Slide 59 text

Thank you!!!