Upgrade to Pro — share decks privately, control downloads, hide ads and more …

iOSDC 20190906: 動画アプリの投げ銭機能における
消耗型課金の仕組みと実装 with 発表ノート

Takeshi Ihara
September 06, 2019

iOSDC 20190906: 動画アプリの投げ銭機能における
消耗型課金の仕組みと実装 with 発表ノート

Takeshi Ihara

September 06, 2019
Tweet

More Decks by Takeshi Ihara

Other Decks in Programming

Transcript

  1. ಈըΞϓϦͷ౤͛મػೳʹ͓͚Δ

    ফ໣ܕ՝ۚͷ࢓૊Έͱ࣮૷
    2019/09/06 iOSDC 2019
    Takeshi Ihara
    ͓ർΕ༷Ͱ͢ɺʮಈըΞϓϦͷ౤͛મػೳʹ͓͚Δফ໣ܕ՝ۚͷ࢓૊Έͱ࣮૷ʯͱ͍͏λΠτϧͰൃද͍͖ͤͯͨͩ͞·͢ɻ
    Ҵݟ͞Μͷݍ࿦ͷ࿩΍-5ͷൃදͰ͸ͳ͘ɺ஍ຯͳλΠτϧͷηογϣϯʹདྷͯ͘Εͯ͋Γ͕ͱ͏͍͟͝·͢ɻ
    ·ͨɺ͜ͷτϥοΫ&ͷઌ΄ͲͷϩΫωϜ͞Μͷʮৄࡉ"VUP3FOFXBCMF4VCTDSJQUJPOTʯ͔Βଓ͚ͯݟ͍ͯΔਓ͸ɺಉ͡՝͕ۚςʔϚͰ͕͢ɺ"VUP3FOFXBCMF
    4VCTDSJQUJPOTͰ͸ͳ͘$POTVNBCMFͭ·Γফ໣ܕʹؔ͢ΔτʔΫͳͷͰɺ·ͨগ͠ҧ͏΋ͷʹͳΔͱࢥ͍·͢ɻ
    ଓ͚ͯݟΔਓ͸ͦͷࠩ෼΋ָ͠ΜͰΈ͍ͯͩ͘͞ɻ

    View Slide

  2. Takeshi Ihara
    • 2018.09.01 AbemaTV Join
    • 2018.09.02 iOSDC 2018 LT
    ʮখ͘͞͸͡ΊΔ୺຤؅ཧʯ
    • ϘϧμϦϯάͱ֨ಆήʔϜ͕झຯ
    • https://twitter.com/nonchalant0303
    ॳΊ·ͯ͠ͷਓ͸ॳΊ·ͯ͠ɺ"CFNB57ͰJ04ΤϯδχΞͱͯ͠ಇ͍͍ͯΔҪݪַࢤͰ͢ɻ
    ͪΐ͏Ͳࡢ೥ͷʹ"CFNB57ʹδϣΠϯͯ͠ɺॳͷ࢓ࣄ͕ͷڈ೥ͷJ04%$ͷʮখ͘͞͸͡ΊΔ୺຤؅ཧʯͱ͍͏-5Ͱͨ͠ɻ
    ୀࣾͨ͠ΒϘϧμϦϯά͔֨ಆήʔϜͷͲͪΒ͔Λ໷ͳ໷ͳ΍͍ͬͯ·͢ɻ
    ઌ݄ʹ֨ಆήʔϜͷੈքେձʹग़ΔͨΊʹϥεϕΨε·Ͱߦ͖ͬͯ·ͨ͠ɻ
    ͨ·ʹ͔ٕ͠ज़తͳπΠʔτ͸͠ͳ͍Ͱ͕͢ɺझຯͷπΠʔτ͸ଟ͍ͷͰڵຯ͋Δํ͸ϑΥϩʔͯ͘͠ΕΔͱخ͍͠Ͱ͢ɻ

    View Slide

  3. αϙʔτػೳ (AbemaTV)
    • 2019.04.22

    αϙʔτػೳΛ

    ϦϦʔεʂ

    ൪૊΍൪૊ग़ԋऀʹ
    ελϯϓΛૹͬͯ

    αϙʔτ͕Ͱ͖Δʂ
    ࠓճͷλΠτϧʹؚ·Ε͍ͯΔಈըΞϓϦͷ౤͛મػೳͰ͕͢ɺࠓ೥ͷ݄ʹ"CFNB57Ͱαϙʔτػೳͱ͍͏໊শͰϦϦʔε͠·ͨ͠ɻ
    "CFNB57Ͱ์ૹ͍ͯ͠Δ൪૊΍൪૊ग़ԋऀʹελϯϓΛૹͬͯαϙʔτͰ͖ΔػೳͰ͢ɻ
    αϙʔτ͞Εͨελϯϓ͸൪૊ͷ੍࡞අ΍ग़ԋऀͷग़ԋྉʹ্৐ͤ͞ΕɺϢʔβʔ͕൪૊΍ग़ԋऀʹ௚઀తʹߩݙ͢Δ͜ͱ͕Ͱ͖·͢ɻ
    ࠓ೥ͷ݄͔Β։ൃΛ։࢝ͯ͠ϦϦʔεͩͬͨͷͱɺʹ։࠵͞Εٕͨज़ॻలʹ"CFNB57ͷJ04νʔϜͰग़లͨ͠ͷͱॏͳΓɺਖ਼௚͚ͬ͜͏Ωπ͍εέ
    δϡʔϧͰͨ͠ʜ

    View Slide

  4. ։ൃʹؔΘͬͨϝϯόʔ΋ϦϦʔεͨ͠ͱ͖ʹ৭ʑͳࢥ͍͕ࠐ΋ͬͨπΠʔτΛ͍ͯ͠·ͨ͠ɻ
    ଟ͘͸ޠΒͳ͍ͱ͍ͬͨײ͡Ͱ͢Ͷɻ
    ͦΕҎ߱͸ձࣾͷ಺֎ͷਓʹ৭ʑͱ૬ஊͭͭ͠ϓϩδΣΫτશମͰεέδϡʔϧ΍ݟੵ΋Γͷํ๏Λࢼߦࡨޡͯ͠ɺ࠷ۙ͸ฏ࿨ͳ։ൃ͕Ͱ͖͍ͯ·͢ɻ

    View Slide

  5. αϙʔτ͢Δͧʂ
    ͔ͤͬ͘ͷػձͰ͢ͷͰɺ࣮ࡍʹαϙʔτػೳΛ࢖ͬͯΈ·͢ɻ
    σϞͷ࠷த͸ΞϓϦ಺ͷ൪૊͸࠶ੜ͞Ε·ͤΜ͕ɺͪ͜Β͸"CFNB57ͷػೳͰը໘࿥ըத͸ಈըͷ࠶ੜ͸͞Εͳ͍Α͏ʹ͍ͯ͠·͢ɻ
    ͜Ε͸ίϯςϯπͷݖརอޢ͕໨తͷػೳͰ͢ͷͰɺࠓճͷσϞʹ͸ؔ܎ͳ͍ͷͰؾʹ͠ͳ͍Ͱ͍ͩ͘͞ɻ
    Ͱ͸ͬͦ͘͞ݟ͍͖ͯ·͠ΐ͏ɻ

    View Slide

  6. 1. App಺՝ۚ
    2. ՝ۚܗࣜʹΑΔҧ͍
    3. AbemaTVʹ͓͚Δফ໣ܕ՝ۚͷઃܭ
    4. AbemaTVʹ͓͚Δফ໣ܕ՝ۚͷಈ࡞ݕূ
    5. ·ͱΊ
    d

    ࠓճͷτʔΫͰ͕͢ɺ࠷ॳʹ"QQ಺՝ۚʹ͍ͭͯܰ͘આ໌ͯ͠ɺࣗಈߋ৽αϒεΫϦϓγϣϯ΍ফ໣ܕͳͲͷ༷ʑͳ՝ۚܗࣜͷҧ͍ʹ͍ͭͯઆ໌͠·͢ɻ
    ͦͷҧ͍Λड͚ͯɺ"CFNB57ʹ͓͚Δফ໣ܕ՝ۚͷઃܭͷ֓ཁͱҙਤΛઆ໌͠·͢ɻ
    ·ͨɺ՝ۚॲཧͳͷͰϦϦʔεͨ͠ޙͷෆ۩߹͸க໋తͳ΋ͷʹͳΓಘΔͷͰɺϦϦʔεલʹͲͷΑ͏ͳಈ࡞ݕূ͔ͨ͠Λઆ໌ͯ͠ɺ࠷ޙʹ·ͱΊͯ͜ͷτʔΫ͸ऴྃʹ
    ͳΓ·͢ɻ

    View Slide

  7. App಺՝ۚ
    d

    ͸͡Ίʹ"QQ಺՝ۚʹ͍ͭͯܰ͘આ໌͠·͢ɻ

    View Slide

  8. App಺՝ۚͱ͸
    • App ಺՝ۚͱ͸ɺiOS σόΠε΍ίϯϐϡʔλ্ͷ 

    App ͷதͰ௥Ճͷίϯςϯπ΍ఆظߪಡίϯςϯπΛ

    ߪೖͰ͖Δ࢓૊Έ
    https://support.apple.com/ja-jp/HT202023
    "QQMFͷެࣜυΩϡϝϯτΛࢀߟʹ͢Δͱɺ"QQ಺՝ۚͱ͸ʮJ04σόΠε΍ίϯϐϡʔλ্ͷ"QQͷதͰ௥Ճͷίϯςϯπ΍ఆظߪಡίϯςϯπΛߪೖͰ͖Δ࢓૊
    ΈʯͰ͢ɻ

    View Slide

  9. ՝ۚܗࣜ
    • ফ໣ܕ (Consumable) - ΞϓϦ಺௨՟ͳͲ
    Ұ౓࢖͏ͱͳ͘ͳΓɺ࠶ߪೖ͢Δ͜ͱ͕Ͱ͖Δ

    • ඇফ໣ܕ (Non-Consumable) - ޿ࠂͷඇදࣔͳͲ
    Ұ౓ͷߪೖ͚ͩͰແ੍ݶʹ࢖༻Ͱ͖Δ
    • ࣗಈߋ৽αϒεΫϦϓγϣϯ (Auto-Renewable Subscriptions) - ֹ݄VODͳͲ
    ݄ؒαʔϏε΍ఆظతʹΞοϓσʔτ͞ΕͨίϯςϯπΛߪೖ͢Δ͜ͱ͕Ͱ͖Δ
    • ඇߋ৽αϒεΫϦϓγϣϯ (Non-Renewing Subscriptions) - γʔζϯύεͳͲ
    ظؒݶఆͷαʔϏε΍ίϯςϯπΛߪೖ͢Δ͜ͱ͕Ͱ͖Δ
    "QQ಺՝ۚ͸ফ໣ܕɺඇফ໣ܕɺࣗಈߋ৽αϒεΫϦϓγϣϯɺඇߋ৽αϒεΫϦϓγϣϯͷछྨ͕͋Γ·͢ɻ
    ࠓճͷςʔϚͰ͋Δফ໣ܕ͸͍ΘΏΔιγϟήͷຐ๏ੴͳͲͷΞϓϦ಺௨՟ͳͲͰ༻͍ΒΕ·͢ɻ
    ͜ͷ՝ۚΞΠςϜ͸Ұ౓࢖͏ͱͳ͘ͳΓɺ࠶ߪೖ͢Δ͜ͱ͕Ͱ͖·͢ɻ
    ඇফ໣ܕ͸޿ࠂͷඇදࣔػೳͳͲɺҰ౓ͷߪೖ͚ͩͰແ੍ݶʹ࢖༻Ͱ͖·͢ɻ
    ࣗಈߋ৽αϒεΫϦϓγϣϯ͸ֹ݄70%ͳͲͷఆظతʹΞοϓσʔτ͞ΕΔίϯςϯπΛߪೖ͢ΔͨΊʹ༻͍ΒΕ·͢ɻ
    ͪ͜ΒΛ࣮૷͍ͯ͠ΔΞϓϦ΍঺հ͍ͯ͠ΔهࣄͳͲ͕ଟ͍ͱࢥ͍·͢ɻ
    ඇߋ৽αϒεΫϦϓγϣϯ͸ࣗಈߋ৽αϒεΫϦϓγϣϯʹൺ΂ͯ͋·Γ༻͍ΒΕ͍ͯͳ͍ҹ৅ͳͷͰ͕͢ɺγʔζϯύεͳͲͷظؒݶఆͷαʔϏεʹ༻͍ΒΕ·͢ɻ
    ͜ͷΑ͏ʹαʔϏε͕ఏڙ͢Δੑ࣭ʹΑΓద੾ͳ՝ۚܗࣜΛબͿඞཁ͕͋Γ·͢ɻ

    View Slide

  10. AbemaTVʹ͓͚Δࣗಈߋ৽αϒεΫϦγϣϯ
    • ¥960/݄ͰϓϨϛΞϜػೳΛఏڙ
    1. ͢΂ͯͷ࡞඼͕ݟ์୊
    2. ޿ࠂͳ͠ͰϏσΦΛ͙͢࠶ੜ
    3. ์ૹதͰ΋࠷ॳ͔ΒΈΒΕΔ
    4. μ΢ϯϩʔυͰ௨৴ྔΛ΄΅θϩʹ
    5. ์ૹޙͷ൪૊Ͱ΋ίϝϯτָ͕͠ΊΔ
    "CFNB57Ͱ͸ͭͷ՝ۚܗࣜΛ༻͍ͯαʔϏεΛఏڙ͍ͯ͠·͢ɻ
    ͭ͸ࣗಈߋ৽αϒεΫϦϓγϣϯͷϓϨϛΞϜػೳͰ͢ɻ
    ͪ͜Β͸ֹ݄ԁͰ"CFNB57ͷ͢΂ͯͷ࡞඼͕ݟ์୊ʹͳΓɺμ΢ϯϩʔυػೳͳͲ༷ʑͳϓϨϛΞϜͳػೳΛ࢖༻͢Δ͜ͱͰ͖·͢ɻ

    View Slide

  11. AbemaTVʹ͓͚Δফ໣ܕ՝ۚ
    • ΞϓϦ಺௨՟(AbemaίΠϯ)
    ίΠϯͰελϯϓΛߪೖͯ͠ɺ

    ൪૊΍൪૊ग़ԋऀʹελϯϓΛૹͬͯ

    αϙʔτ͕Ͱ͖Δʂ
    ΋͏ͭ͸ࠓճͷςʔϚͷফ໣ܕ՝ۚͰ͢ɻ
    ͪ͜Β͸ࠓ೥ͷʹαϙʔτػೳͱಉ࣌ʹఏڙ͞Ε·ͨ͠ɻ
    "CFNB57ͷαϙʔτػೳͰ༻͍ΔελϯϓΛߪೖ͢ΔͨΊͷΞϓϦ಺௨՟ɺ"CFNBίΠϯΛߪೖ͢ΔͨΊʹ࢖༻͠·͢ɻ
    ࠓճ͸ͪ͜Βͷػೳʹ͍ͭͯઃܭͳͲΛத৺ʹ࿩͍͖ͯ͠·͢ɻ

    View Slide

  12. ՝ۚܗࣜʹΑΔҧ͍
    d

    ઌ΄Ͳ͸ͦΕͧΕͷ՝ۚܗࣜͷఏڙ͢ΔαʔϏεͷੑ࣭ͳͲΛઆ໌͠·͕ͨ͠ɺ͜͜Ͱ͸γεςϜతͳҧ͍ʹ͍ͭͯઆ໌͠·͢ɻ

    View Slide

  13. ՝ۚܗࣜʹΑΔػೳͷҧ͍
    ࠶ߪೖͷՄ൱ Ϩγʔτ΁ͷදࣔ
    σόΠεؒͰͷಉ
    ظ
    ෮ݩ
    ফ໣ܕ
    ˓

    Կ౓Ͱ΋

    ࠶ߪೖ·Ͱ ಉظͳ͠ ෮ݩ͞Εͳ͍
    ඇফ໣ܕ ✖ ৗʹ
    γεςϜʹΑΓಉ
    ظ
    γεςϜʹΑΓಉ
    ظ
    ࣗಈߋ৽

    αϒεΫϦϓγϣ
    ϯ
    ✖

    ࣗಈతʹߋ৽͞Ε
    Δ

    ৗʹ
    γεςϜʹΑΓಉ
    ظ
    γεςϜʹΑΓಉ
    ظ
    ඇߋ৽αϒεΫϦ
    ϓγϣϯ
    ˓
    ߋ৽͢Δ

    ৗʹ "QQʹΑΓಉظ "QQʹΑΓಉظ
    https://developer.apple.com/jp/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Products.html#//apple_ref/doc/uid/TP40008267-CH2-SW2
    https://developer.apple.com/jp/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Restoring.html#//apple_ref/doc/uid/TP40008267-CH8-SW9
    ͜ͷද͸ͦΕͧΕͷ՝ۚܗࣜͷʮ࠶ߪೖͷՄ൱ʯʮϨγʔτ΁ͷදࣔʯʮσόΠεؒͰͷಉظʯʮ෮ݩʯʹ͍ͭͯهࡌ͍ͯ͠·͢ɻ
    Š
    γεςϜʹΑΓಉظˠϨγʔτΛߋ৽͢Δ͚ͩͰߪೖ৘ใΛ෮ݩͰ͖Δ 4,3FDFJQU3FGSFTI3FRVFTU

    "QQʹΑΓಉظˠ׬ྃͨ͠τϥϯβΫγϣϯΛ"QQ4UPSFʹ໰͍߹ΘͤΔ SFTUPSF$PNQMFUFE5SBOTBDUJPOT

    View Slide

  14. ՝ۚܗࣜʹΑΔػೳͷҧ͍
    ࠶ߪೖͷՄ൱ Ϩγʔτ΁ͷදࣔ
    σόΠεؒͰͷಉ
    ظ
    ෮ݩ
    ফ໣ܕ
    ˓

    Կ౓Ͱ΋

    ࠶ߪೖ·Ͱ ಉظͳ͠ ෮ݩ͞Εͳ͍
    ඇফ໣ܕ ✖ ৗʹ
    γεςϜʹΑΓಉ
    ظ
    γεςϜʹΑΓಉ
    ظ
    ࣗಈߋ৽

    αϒεΫϦϓγϣ
    ϯ
    ✖

    ࣗಈతʹߋ৽͞Ε
    Δ

    ৗʹ
    γεςϜʹΑΓಉ
    ظ
    γεςϜʹΑΓಉ
    ظ
    ඇߋ৽αϒεΫϦ
    ϓγϣϯ
    ˓
    ߋ৽͢Δ

    ৗʹ "QQʹΑΓಉظ "QQʹΑΓಉظ
    https://developer.apple.com/jp/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Products.html#//apple_ref/doc/uid/TP40008267-CH2-SW2
    https://developer.apple.com/jp/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Restoring.html#//apple_ref/doc/uid/TP40008267-CH8-SW9
    ͜͜Ͱ஫໨ͯ͠ཉ͍͠ͷ͸ফ໣ܕͷʮ࠶ߪೖͷՄ൱ʯͱʮϨγʔτ΁ͷදࣔʯͷ߲໨Ͱ͢ɻ
    ઌ΄Ͳઆ໌ͨ͠௨Γফ໣ܕ͸Կ౓Ͱ΋࠶ߪೖͰ͖·͢ɻ
    ΞϓϦ಺՝ۚ͸ߪೖͨ͠ࡍʹ"QQ4UPSF͔ΒϨγʔτ͕ൃߦ͞ΕͯɺͦͷϨγʔτʹߪೖཤྺͳͲ͕ه͞Ε͍ͯ·͢ɻ
    ͦͷߪೖཤྺ͕͜ͷʮϨγʔτ΁ͷදࣔʯͱ͍͏߲໨Ͱ͢ɻ
    ফ໣ܕͷϨγʔτ΁ͷදࣔ͸࠶ߪೖ·Ͱʹͳ͍ͬͯ·͢ɻ
    ͜Ε͸Ͳ͏͍͏ҙຯ͔ͱ͍͏ͱ

    View Slide

  15. ࠶ߪೖ͕Կ౓Ͱ΋ग़དྷΔ
    • ϩʔΧϧͷϨγʔτͷߪೖཤྺ্͕ॻ͖͞ΕΔ
    ߪೖʹԠͨ͡ΠϯηϯςΟϒΛϢʔβʔʹ෇༩Ͱ͖ͳ͘ͳΔ

    AppStoreʹΑΔ՝ۚॲཧ͸׬͍ྃͯ͠Δ
    → ՝͚ۚͩൃੜͯ͠ϢʔβʔʹΠϯηϯςΟϒΛ

    ෇༩͍ͯ͠ͳ͍ঢ়ଶ
    ফ໣ܕΛ࠶ߪೖͨ͠ࡍʹɺҎલͷߪೖཤྺ্͕ॻ͖͞ΕΔͨΊɺʮϨγʔτ΁ͷදࣔʯ͕࠶ߪೖ·Ͱͱ͍͏͜ͱʹͳΓ·͢ɻ
    ্ॻ͖͞Εͨߪೖཤྺ͸෮ݩ͢Δ͜ͱ͸Ͱ͖·ͤΜɻ
    ଞͷ՝ۚܗࣜ͸࠶ߪೖ͕Ͱ͖ͳ͍ͷͰɺʮϨγʔτ΁ͷදࣔʯ͕ৗʹ͞ΕΔͱ͍͏දݱʹͳ͍ͬͯ·͢ɻ
    ߪೖʹԠͨ͡ΠϯηϯςΟϒɺࠓճͷྫͰ͍͏ͱ"CFNBίΠϯͰ͕͢ɺίΠϯΛ෇༩͢ΔલʹϢʔβʔ͕࠶ߪೖΛͯ͠͠·͏ͱɺҎલͷߪೖཤྺ্͕ॻ͖͞ΕΔͷͰɺ
    ߪೖཤྺΛݟͯίΠϯΛ෇༩͢Δ͜ͱ͕Ͱ͖ͳ͘ͳΓ·͢ɻ
    ͔͠͠ɺ͜Ε͸"QQ4UPSFʹΑΔ՝ۚॲཧࣗମ͸׬͍ྃͯ͠ΔͷͰɺ՝͚ۚͩൃੜͯ͠ϢʔβʔʹΠϯηϯςΟϒΛ෇༩͍ͯ͠ͳ͍ঢ়ଶʹͳΓɺ͜Ε͸ΧελϚʔαϙʔ
    τͳͲͰΫϨʔϜ͕͘Δۓٸ౓͕ߴ͍໰͍߹ΘͤʹͳΓಘ·͢ɻ

    View Slide

  16. {
    "receipt": {
    …,
    "in_app": [
    {
    "product_id": “com.nonchalant.consumable1”,
    "transaction_id": "1000000551439498",
    "purchase_date": "2019-09-01 00:00:00 Etc/GMT”,

    }
    ]
    }
    }
    Ϩγʔτ (ॳճߪೖ࣌)
    https://developer.apple.com/library/archive/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW1
    ࢀߟ·Ͱʹ࣮ࡍͷϨγʔτΛݟͯΈ·͠ΐ͏ɻ
    ͪ͜Β͸ॳճߪೖ࣌ʹൃߦ͞ΕΔϨγʔτͰ͢ɻ
    Ϩγʔτ͸KTPOܗࣜʹͳ͍ͬͯͯɺJO@BQQͱ͍͏ϑΟʔϧυʹ͸DPNOPODIBMBOUDPOTVNBCMFͱ͍͏QSPEVDU@JEͷΞΠςϜͷߪೖཤྺ͕͚ͭͩ͋Γ·͢ɻ

    View Slide

  17. {
    "receipt": {
    …,
    "in_app": [
    {
    "product_id": “com.nonchalant.consumable1",
    "transaction_id": "1000000556349963",
    "purchase_date": "2019-09-03 10:10:26 Etc/GMT”,

    }
    ]
    }
    }
    Ϩγʔτ (࠶ߪೖ࣌)
    https://developer.apple.com/library/archive/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW1
    ͪ͜Β͸࠶ߪೖͨ͠ࡍͷϨγʔτͰ͢ɻ
    ॳճߪೖ࣌ͱಉ༷ʹɺJO@BQQͱ͍͏ϑΟʔϧυʹ͸DPNOPODIBMBOUDPOTVNBCMFͱ͍͏QSPEVDU@JEͷΞΠςϜͷߪೖཤྺ͕͚ͭͩ͋Γ·͢ɻ
    ͔͠͠ɺ͜Ε͸USBOTBDUJPO@JEͱQVSDIBTF@EBUF͕ҟͳΔผͷߪೖཤྺʹͳ͍ͬͯ·͢ɻ
    ͜ͷΑ͏ʹಉ͡ΞΠςϜΛ࠶ߪೖͨ͠ࡍɺҎલͷߪೖཤྺ͸্ॻ͖͞Εͯ͠·͍·͢ɻ

    View Slide

  18. ࠶ߪೖ͕ग़དྷΔ৚݅
    • ಉ͡঎඼ͷ՝ۚτϥϯβΫγϣϯ͕ऴ͍ྃͯ͠Δ
    ՝ۚτϥϯβΫγϣϯ
    → SKPaymentTransaction
    τϥϯβΫγϣϯ͕ऴ͍ྃͯ͠Δ
    → SKPaymentQueue.finishTransaction(_:)
    ফ໣ܕ͸࠶ߪೖͰ͖Δͱઆ໌͠·͕ͨ͠ɺϢʔβʔ͕࠶ߪೖͰ͖ΔΑ͏ʹͳΔͨΊʹ͸৚͕݅͋Γ·͢ɻ
    ͦΕ͸ಉ͡঎඼ͷ՝ۚτϥϯβΫγϣϯ͕ऴ͍ྃͯ͠Δͱ͍͏͜ͱͰ͢ɻ
    ͪ͜Βͷը໘͸՝ۚτϥϯβΫγϣϯ͕ऴ͓ྃͯ͠Βͣɺ࠶ߪೖͰ͖ͳ͍ͱ͖ʹߪೖ͠Α͏ͱ͢Δͱදࣔ͞ΕΔμΠΞϩάʹͳΓ·͢ɻ
    ͦΕͧΕͷ༻ޠΛ۩ମతͳΫϥε΍ϝιου໊Ͱઆ໌͢Δͱɺ՝ۚτϥϯβΫγϣϯ͸4UPSF,JUʹ͓͚Δ4,1BZNFOU5SBOTBDUJPOΛࢦ͍ͯ͠·͢ɻ
    τϥϯβΫγϣϯ͕ऴ͍ྃͯ͠Δͱ͍͏͜ͱ͸4UPSF,JUʹ͓͚Δ4,1BZNFOU2VFVFͷpOJTI5SBOTBDUJPO͕ݺͼग़͞Ε͍ͯΔͱ͍͏͜ͱͰ͢ɻ
    ͪ͜Β͸Ұ౓՝ۚॲཧΛ࣮૷ͨ͜͠ͱ͕͋Δਓ͸͝ଘ஌͔ͱࢥ͍·͢ɻ

    View Slide

  19. ՝ۚτϥϯβΫγϣϯͷѻ͍ͷ஫ҙ఺
    • ΠϯηϯςΟϒΛ෇༩͢Δ·ͰτϥϯβΫγϣϯΛऴྃͯ͠͸͍͚ͳ͍
    > Once you’ve delivered the product, your application must call finishTransaction:
    to complete the transaction. When you call finishTransaction:, the transaction is
    removed from the payment queue. To ensure that products are not lost, your
    application should deliver the product before calling finishTransaction:.
    • ߪೖཤྺ͕Ϩγʔτʹৗʹදࣔ͞ΕΔ՝ۚܗࣜͰ͸

    ҙࣝ͠ͳͯ͘΋໰୊ͳ͍
    ඇফ໣ܕɺࣗಈߋ৽αϒεΫϦϓγϣϯɺඇߋ৽αϒεΫϦϓγϣϯ
    https://www.rapid-ideas.com/previews/wsa/page9/files/StoreKitGuide.pdf
    "QQMFͷ*"1՝ۚͷ࣮૷ΨΠυΛݟͯΈΔͱɺΠϯηϯςΟϒΛ෇༩͢Δ·ͰτϥϯβΫγϣϯΛऴྃͯ͠͸͍͚ͳ͍ͱॻ͍͍ͯ·͢ɻ
    ʮZPVSBQQMJDBUJPOTIPVMEEFMJWFSUIFQSPEVDUCFGPSFDBMMJOHpOJTI5SBOTBDUJPOʯͷจষͰ͢Ͷɻ
    ຊ೔͸͜ͷจষ͚֮ͩ͑ͯ΋ΒͬͨΒ΄΅΄΅େৎ෉Ͱ͢ɻ
    ωοτͳͲͷ՝࣮ۚ૷ͷϒϩάͳͲΛݟͯΈΔͱɺΠϯηϯςΟϒ͕෇༩͢Δલͷ"QQ4UPSFʹ͓͚Δߪೖ͕ऴྃͨ͠λΠϛϯάͰτϥϯβΫγϣϯΛऴ͍ྃͯ͠Δ΋ͷ
    ͕ଟ͘ɺ͜ͷΑ͏ͳ࣮૷͸ΨΠυʹॻ͔Ε͍ͯΔ͜ͱͱ൓͍ͯ͠·͢ɻ
    ͨͩɺΠϯηϯςΟϒΛ෇༩͢ΔલʹτϥϯβΫγϣϯΛऴྃͯ͠΋໰୊ͳ͍έʔε͕͋Γ·͢ɻ
    ͦΕ͸ʮϨγʔτ΁ͷදࣔʯ͕ৗʹ͞ΕΔ՝ۚܗࣜͰ͢ɻ
    ͢ͳΘͪɺʮඇফ໣ܕʯʮࣗಈߋ৽αϒεΫϦϓγϣϯʯʮඇߋ৽αϒεΫϦϓγϣϯʯͷͭʹͳΓ·͢ɻ
    ͜ΕΒ͸Ϣʔβʔͷಈ࡞Ͱ࠶ߪೖͰ͖ͳ͍ͷͰɺͲͷλΠϛϯάͰ΋ߪೖཤྺΛਖ਼ৗʹऔಘͰ͖·͢ɻ
    ͜ͷΑ͏ͳ৔߹͸࣮૷ָ͕ʹͳΔέʔε΋͋ΔͷͰɺΨΠυʹ൓͠·͕͢ΠϯηϯςΟϒΛ෇༩͢ΔલʹτϥϯβΫγϣϯΛऴྃ͢Δͷ΋͋Γ͔ͱࢥ͍·͢ɻ
    ͔͠͠ɺফ໣ܕͰͦͷΑ͏ͳ࣮૷Λͯ͠͠·͏ͱɺαʔϏεͱͯ͠க໋తͳෆ۩߹Λ๊͑ͯ͠·͏Մೳੑ͕͋ΔͷͰ஫ҙ͕ඞཁͰ͢ɻ

    View Slide

  20. AbemaTVʹ͓͚Δ

    ফ໣ܕ՝ۚͷઃܭ
    d

    ઌ΄Ͳͷ՝ۚτϥϯβΫγϣϯͷѻ͍ͷ஫ҙ఺Λ౿·͑ͯɺ"CFNB57ʹ͓͚Δফ໣ܕ՝ۚͷઃܭΛ঺հ͠·͢ɻ

    View Slide

  21. ফ໣ܕ՝ۚͷߪೖϑϩʔ
    4. ϨγʔτݕূϦΫΤετ
    5. Ϩγʔτݕূ݁Ռ 6. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    7. ׬ྃϨεϙϯε (201)
    1. ߪೖϦΫΤετ

    (τϥϯβΫγϣϯͷ։࢝)
    8. τϥϯβΫγϣϯ

    ͷऴྃ
    2. ߪೖ׬ྃ
    3. Ϩγʔτૹ৴
    ফ໣ܕ՝ۚͷߪೖϑϩʔ͸ɺΫϥΠΞϯτͷʮߪೖϦΫΤετʯ͢ͳΘͪʮτϥϯβΫγϣϯͷ։࢝ʯ͔Β࢝·ΓʮτϥϯβΫγϣϯͷऴྃʯ·ͰͷεςοϓͰߏ੒͞
    Ε͍ͯ·͢ɻ

    View Slide

  22. ফ໣ܕ՝ۚͷߪೖϑϩʔ
    4. ϨγʔτݕূϦΫΤετ
    5. Ϩγʔτݕূ݁Ռ 6. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    7. ׬ྃϨεϙϯε (201)
    1. ߪೖϦΫΤετ

    (τϥϯβΫγϣϯͷ։࢝)
    8. τϥϯβΫγϣϯ

    ͷऴྃ
    2. ߪೖ׬ྃ
    3. Ϩγʔτૹ৴
    ·ͣɺϢʔβʔ͕"QQ4UPSFʹରͯ͠ফ໣ܕͷ՝ۚΞΠςϜͷߪೖϦΫΤετΛͯ͠ɺτϥϯβΫγϣϯ͕։࢝͠·͢ɻ

    View Slide

  23. ফ໣ܕ՝ۚͷߪೖϑϩʔ
    4. ϨγʔτݕূϦΫΤετ
    5. Ϩγʔτݕূ݁Ռ 6. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    7. ׬ྃϨεϙϯε (201)
    1. ߪೖϦΫΤετ

    (τϥϯβΫγϣϯͷ։࢝)
    8. τϥϯβΫγϣϯ

    ͷऴྃ
    2. ߪೖ׬ྃ
    3. Ϩγʔτૹ৴
    ͦͷޙɺϢʔβʔ͕'BDF*%΍'JOHFS1SJOUɺύεϫʔυೖྗͳͲͷೝূΛߦ͍ɺೝূʹ੒ޭ͢Ε͹"QQ4UPSF͔Βߪೖ׬ྃͷϨεϙϯε͕ฦ͖ͬͯ·͢ɻ
    ͜ͷ࣌఺Ͱ"QQ4UPSFʹΑΔ՝ۚ͸׬͍ྃͯ͠·͢ɻ

    View Slide

  24. ফ໣ܕ՝ۚͷߪೖϑϩʔ
    4. ϨγʔτݕূϦΫΤετ
    5. Ϩγʔτݕূ݁Ռ 6. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    7. ׬ྃϨεϙϯε (201)
    1. ߪೖϦΫΤετ

    (τϥϯβΫγϣϯͷ։࢝)
    8. τϥϯβΫγϣϯ

    ͷऴྃ
    2. ߪೖ׬ྃ
    3. Ϩγʔτૹ৴
    ͦͷޙɺτϥϯβΫγϣϯͷऴྃΛͤͣʹɺϩʔΧϧʹ%BUBܕͰอଘ͞Ε͍ͯΔϨγʔτΛ#BTFͰΤϯίʔυͯ͠ฐࣾͷαʔόʔʹૹ৴͠·͢ɻ

    View Slide

  25. ফ໣ܕ՝ۚͷߪೖϑϩʔ
    4. ϨγʔτݕূϦΫΤετ
    5. Ϩγʔτݕূ݁Ռ 6. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    7. ׬ྃϨεϙϯε (201)
    1. ߪೖϦΫΤετ

    (τϥϯβΫγϣϯͷ։࢝)
    8. τϥϯβΫγϣϯ

    ͷऴྃ
    2. ߪೖ׬ྃ
    3. Ϩγʔτૹ৴
    #BTFͰΤϯίʔυ͞ΕͨϨγʔτΛड͚औͬͨαʔόʔ͸ɺͦͷϨγʔτΛ༻͍ͯ"QQ4UPSFʹݕূϦΫΤετΛ౤͛·͢ɻ

    View Slide

  26. ফ໣ܕ՝ۚͷߪೖϑϩʔ
    4. ϨγʔτݕূϦΫΤετ
    5. Ϩγʔτݕূ݁Ռ 6. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    7. ׬ྃϨεϙϯε (201)
    1. ߪೖϦΫΤετ

    (τϥϯβΫγϣϯͷ։࢝)
    8. τϥϯβΫγϣϯ

    ͷऴྃ
    2. ߪೖ׬ྃ
    3. Ϩγʔτૹ৴
    "QQ4UPSF͸ߪೖཤྺΛؚΜͩϨγʔτݕূ݁ՌΛฐࣾͷαʔόʔʹฦ٫͠·͢ɻ

    View Slide

  27. ফ໣ܕ՝ۚͷߪೖϑϩʔ
    4. ϨγʔτݕূϦΫΤετ
    5. Ϩγʔτݕূ݁Ռ 6. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    7. ׬ྃϨεϙϯε (201)
    1. ߪೖϦΫΤετ

    (τϥϯβΫγϣϯͷ։࢝)
    8. τϥϯβΫγϣϯ

    ͷऴྃ
    2. ߪೖ׬ྃ
    3. Ϩγʔτૹ৴
    ͦͷݕূ݁Ռʹج͖ͮɺϢʔβʔʹ"CFNBίΠϯΛ෇༩͠·͢ɻ

    View Slide

  28. ফ໣ܕ՝ۚͷߪೖϑϩʔ
    4. ϨγʔτݕূϦΫΤετ
    5. Ϩγʔτݕূ݁Ռ 6. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    7. ׬ྃϨεϙϯε (201)
    1. ߪೖϦΫΤετ

    (τϥϯβΫγϣϯͷ։࢝)
    8. τϥϯβΫγϣϯ

    ͷऴྃ
    2. ߪೖ׬ྃ
    3. Ϩγʔτૹ৴
    Ϣʔβʔʹ"CFNBίΠϯͷ෇༩͕׬ྃͨ͠ͷͪɺ׬ྃϨεϙϯεΛΫϥΠΞϯτʹฦ͠·͢ɻ

    View Slide

  29. ফ໣ܕ՝ۚͷߪೖϑϩʔ
    4. ϨγʔτݕূϦΫΤετ
    5. Ϩγʔτݕূ݁Ռ 6. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    7. ׬ྃϨεϙϯε (201)
    1. ߪೖϦΫΤετ

    (τϥϯβΫγϣϯͷ։࢝)
    8. τϥϯβΫγϣϯ

    ͷऴྃ
    3. Ϩγʔτૹ৴
    2. ߪೖ׬ྃ
    ͦͷϨεϙϯεΛड͚औͬͯɺΫϥΠΞϯτ͸՝ۚτϥϯβΫγϣϯΛऴྃ͠·͢ɻ
    ͜Ε͕ਖ਼ৗͳফ໣ܕ՝ۚͷߪೖϑϩʔʹͳΓ·͢ɻ

    View Slide

  30. ՝ۚ׬ྃޙʹࣦഊ͢Δέʔε 1
    4. ϨγʔτݕূϦΫΤετ
    5. Ϩγʔτݕূ݁Ռ 6. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    7. ׬ྃϨεϙϯε (201)
    1. ߪೖϦΫΤετ

    (τϥϯβΫγϣϯͷ։࢝)
    8. τϥϯβΫγϣϯ

    ͷऴྃ
    3. Ϩγʔτૹ৴
    2. ߪೖ׬ྃ
    ͔͠͠ɺ͜ͷϑϩʔʹ͸"QQ4UPSFͷ՝͕ۚ׬ྃͨ͠ޙʹࣦഊ͢Δέʔε͕ͭଘࡏ͠·͢ɻ
    ͭΊ͸ͷฐࣾͷαʔόʔʹϨγʔτૹ৴Λ͢ΔεςοϓʹͳΓ·͢ɻ

    View Slide

  31. Ϩγʔτૹ৴ʹࣦഊ͢Δέʔε
    • ωοτϫʔΫͳͲͷ໰୊Ͱ

    APIϦΫΤετͷ։࢝ʹࣦഊ͢Δέʔε
    • AppStoreʹΑΔ՝ۚ͸ൃੜ͍ͯ͠Δ
    • αʔόʔଆͰAbemaίΠϯ෇༩͕ग़དྷ͍ͯͳ͍
    • ՝ۚτϥϯβΫγϣϯ͸ऴ͍ྃͯ͠ͳ͍
    Ϣʔβʔ͕࠶ߪೖͰ͖ͳ͍
    Ϩγʔτૹ৴ʹࣦഊ͢Δέʔε͸ɺΫϥΠΞϯτͷωοτϫʔΫ؀ڥͳͲ༷ʑͳݪҼͰ"1*ϦΫΤετͷ։࢝ʹࣦഊ͢ΔέʔεͰ͢ɻ
    ͪ͜Β͸લͷͱͷεςοϓͰ"QQ4UPSFʹΑΔ՝ۚ͸׬͍ྃͯ͠Δʹ΋ؔΘΒͣɺ"CFNBίΠϯ͸෇༩Ͱ͖͍ͯ·ͤΜɻ
    ͭ·Γ͸Ϣʔβʔ͔Β͓͚͍͍͍ۚͩͨͩͯΔͱ͍͏ঢ়ଶʹͳΓ·͢ɻ
    ͔͠΋ɺ՝ۚτϥϯβΫγϣϯ͸ऴ͍ྃͯ͠ͳ͍ͷͰɺϢʔβʔ͸ಉ͡঎඼Λ࠶ߪೖ͢Δ͜ͱ΋Ͱ͖·ͤΜɻ
    ՝͕ۚҰ੾Ͱ͖ͳ͘ͳΓ٧Έͷঢ়ଶʹͳͬͯ͠·͍·͢ɻ

    View Slide

  32. ՝ۚ׬ྃޙʹࣦഊ͢Δέʔε 2
    4. ϨγʔτݕূϦΫΤετ
    5. Ϩγʔτݕূ݁Ռ 6. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    7. ׬ྃϨεϙϯε (201)
    1. ߪೖϦΫΤετ

    (τϥϯβΫγϣϯͷ։࢝)
    8. τϥϯβΫγϣϯ

    ͷऴྃ
    2. ߪೖ׬ྃ
    3. Ϩγʔτૹ৴
    ͭΊͷࣦഊ͢Δέʔε͸ͷฐࣾͷαʔόʔ͔ΒͷϨεϙϯεΛड͚औΔεςοϓʹͳΓ·͢ɻ

    View Slide

  33. ׬ྃϨεϙϯεʹࣦഊ͢Δέʔε
    • ΞϓϦͷΫϥογϡͳͲͰ

    APIϨεϙϯεͷड৴ʹࣦഊ͢Δέʔε
    • AppStoreʹΑΔ՝ۚ͸ൃੜ͍ͯ͠Δ
    • αʔόʔଆͰAbemaίΠϯ෇༩͕׬͍ྃͯ͠ΔՄೳੑ͕͋Δ
    • ՝ۚτϥϯβΫγϣϯ͸ऴ͍ྃͯ͠ͳ͍
    Ϣʔβʔ͕࠶ߪೖͰ͖ͳ͍
    ׬ྃϨεϙϯεͷड͚औΓʹࣦഊ͢Δέʔε͸ɺ"1*ϦΫΤετ͸։͍࢝ͯ͠·͕͢ɺϨεϙϯεΛड͚औΔલʹΞϓϦ͕Ϋϥογϡͨ͠Γɺαʔόʔ͕λΠϜΞ΢τ͠
    ͨΓͳͲͷέʔεͰ͢ɻ
    ͪ͜Β΋ಉ༷ʹલͷͱͷεςοϓͰ"QQ4UPSFʹΑΔ՝ۚ͸׬͍ྃͯ͠Δʹ΋ؔΘΒͣɺ"CFNBίΠϯΛ෇༩Ͱ͖͍ͯͳ͍Մೳੑ͕͋Γ·͢ɻ
    ϦΫΤετ͸։͍࢝ͯ͠ΔͷͰɺαʔόʔଆͰ"CFNBίΠϯΛ෇༩Ͱ͖͍ͯΔՄೳੑ͸͋Γ·͕͢ɺϨεϙϯε͸ฦ͖͍ͬͯͯ·ͤΜɻ
    ͜Ε΋Ϣʔβʔ͔Β͓͚͍͍͍ۚͩͨͩͯΔՄೳੑ͕͋Δͱ͍͏ঢ়ଶʹͳΓ·͢ɻ
    ͞Βʹɺ՝ۚτϥϯβΫγϣϯ͸ऴ͍ྃͯ͠ͳ͍ͷͰɺϢʔβʔ͸ಉ͡঎඼Λ࠶ߪೖ͢Δ͜ͱ΋Ͱ͖·ͤΜɻ
    ͪ͜Β΋՝͕ۚҰ੾Ͱ͖ͳ͘ͳΓ٧Έͷঢ়ଶʹͳͬͯ͠·͍·͢ɻ

    View Slide

  34. ະ׬ྃτϥϯβΫγϣϯͷ
    ϦτϥΠ͕ඞཁ
    ͪ͜Βͷͭͷέʔε͕ൃੜͨ͠ࡍͷղܾखஈͱͯ͠ɺτϥϯβΫγϣϯͷऴ͕ྃݺ͹Ε͍ͯͳ͍ະ׬ྃτϥϯβΫγϣϯͷϦτϥΠػߏ͕ඞཁʹͳΓ·͢ɻ

    View Slide

  35. AbemaίΠϯະ෇༩ͷϦτϥΠ
    3. ϨγʔτݕূϦΫΤετ
    4. Ϩγʔτݕূ݁Ռ 5. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    6. ׬ྃϨεϙϯε (201)
    7. τϥϯβΫγϣϯ

    ͷऴྃ
    2. Ϩγʔτૹ৴
    1. ະ׬ྃτϥϯβΫγϣϯͷऔಘ

    (SKPaymentQueue.transactions)
    ະ׬ྃͷτϥϯβΫγϣϯ͕ଘࡏ͢Δέʔε΋छྨʹ෼ྨͰ͖ɺ"CFNBίΠϯ͕ະ෇༩͔෇༩ࡁΈͷͭͷέʔε͕͋Γ·͢ɻ
    ͪ͜Β͸"CFNBίΠϯ͕ະ෇༩ͷέʔεͰ͢ɻ

    View Slide

  36. AbemaίΠϯະ෇༩ͷϦτϥΠ
    3. ϨγʔτݕূϦΫΤετ
    4. Ϩγʔτݕূ݁Ռ 5. AbemaίΠϯ

    ෇༩
    App Store
    AbemaTV iOS AbemaTV Server
    6. ׬ྃϨεϙϯε (201)
    7. τϥϯβΫγϣϯ

    ͷऴྃ
    2. Ϩγʔτૹ৴
    1. ະ׬ྃτϥϯβΫγϣϯͷऔಘ

    (SKPaymentQueue.transactions)
    ·ͣɺΫϥΠΞϯτ͸4,1BZNFOU2VFVFUSBOTBDUJPOT͔Βະ׬ྃτϥϯβΫγϣϯΛऔಘ͠ɺϨγʔτૹ৴Λ͠·͢ɻ
    ͦͷޙ͸ਖ਼ৗͷߪೖϑϩʔͱಉ༷ʹɺαʔόʔ͔ΒͷϨεϙϯεΛड͚औͬͨΒτϥϯβΫγϣϯΛऴྃ͠·͢ɻ
    ͜ΕͰɺ"CFNBίΠϯະ෇༩ͷະ׬ྃτϥϯβΫγϣϯΛਖ਼ৗʹऴྃͤ͞Δ͜ͱ͕Ͱ͖·͢ɻ

    View Slide

  37. AbemaίΠϯ෇༩ࡁΈͷϦτϥΠ
    3. ϨγʔτݕূϦΫΤετ
    4. Ϩγʔτݕূ݁Ռ
    App Store
    AbemaTV iOS AbemaTV Server
    5. AbemaίΠϯ෇༩ࡁΈΤϥʔ (409)
    6. τϥϯβΫγϣϯ

    ͷऴྃ
    2. Ϩγʔτૹ৴
    1. ະ׬ྃτϥϯβΫγϣϯͷऔಘ

    (SKPaymentQueue.transactions)
    ࣍͸"CFNBίΠϯ͸͢Ͱʹ෇༩͞Ε͍ͯ·͕͢ɺαʔόʔ͔ΒͷϨεϙϯεΛड͚औΕͣɺτϥϯβΫγϣϯ͕ະ׬ྃʹͳ͍ͬͯΔέʔεͰ͢ɻ

    View Slide

  38. AbemaίΠϯ෇༩ࡁΈͷϦτϥΠ
    3. ϨγʔτݕূϦΫΤετ
    4. Ϩγʔτݕূ݁Ռ
    App Store
    AbemaTV iOS AbemaTV Server
    5. AbemaίΠϯ෇༩ࡁΈΤϥʔ (409)
    6. τϥϯβΫγϣϯ

    ͷऴྃ
    2. Ϩγʔτૹ৴
    1. ະ׬ྃτϥϯβΫγϣϯͷऔಘ

    (SKPaymentQueue.transactions)
    ͪ͜Β͸ઌ΄Ͳͱಉ༷ʹະ׬ྃͷτϥϯβΫγϣϯΛऔಘ͠ɺϨγʔτΛૹ৴͠·͢ɻ

    View Slide

  39. AbemaίΠϯ෇༩ࡁΈͷϦτϥΠ
    3. ϨγʔτݕূϦΫΤετ
    4. Ϩγʔτݕূ݁Ռ
    App Store
    AbemaTV iOS AbemaTV Server
    5. AbemaίΠϯ෇༩ࡁΈΤϥʔ (409)
    6. τϥϯβΫγϣϯ

    ͷऴྃ
    2. Ϩγʔτૹ৴
    1. ະ׬ྃτϥϯβΫγϣϯͷऔಘ

    (SKPaymentQueue.transactions)
    αʔόʔ͸Ϩγʔτͷݕূޙʹͦͷߪೖཤྺʹରͯ͠"CFNBίΠϯ͸͢Ͱʹ෇༩͍ͯ͠ΔͷͰɺ"CFNBίΠϯ෇༩ࡁΈΛҙຯ͢ΔεςʔλείʔυΛฦ٫͠·
    ͢ɻ
    ΫϥΠΞϯτ͸͜ͷεςʔλείʔυΛݟͯɺτϥϯβΫγϣϯΛऴྃ͠·͢ɻ
    ͜ΕͰɺ"CFNBίΠϯ෇༩ࡁΈͷະ׬ྃτϥϯβΫγϣϯ΋ਖ਼ৗʹऴྃͤ͞Δ͜ͱ͕Ͱ͖·͢ɻ

    View Slide

  40. τϥϯβΫγϣϯ͕

    ऴ͍ྃͯ͠Δ
    → AbemaίΠϯ͕

    ෇༩͞Ε͍ͯΔ
    ͜ͷΑ͏ʹͯ͠ະ׬ྃτϥϯβΫγϣϯͷϦτϥΠॲཧΛߦ͏͜ͱʹΑΓɺτϥϯβΫγϣϯ͕ऴ͍ྃͯ͠ΔͳΒ͹"CFNBίΠϯ͕෇༩͞Ε͍ͯΔͱ͍͏ঢ়ଶΛอূ͠
    ·͢ɻ

    View Slide

  41. ϦτϥΠॲཧͷݺͿλΠϛϯά
    • ىಈ࣌ɺόοΫϑΥΞ࣌ɺίΠϯ࢒ߴදࣔ࣌ʹ

    ϦτϥΠॲཧΛߦ͏
    Ϣʔβʔ͕ίΠϯ࢒ߴΛ֬ೝ͢ΔલʹϦτϥΠ͢ΔΑ͏ʹͯ͠ɺ

    ෆ੔߹ʹؾ෇͔ͤͮΒ͍ͤͯ͘͞Δ
    ͜ͷϦτϥΠॲཧͷݺͿλΠϛϯάͰ͕͢ɺىಈ࣌ɺόοΫϑΥΞ࣌ɺίΠϯ࢒ߴදࣔ࣌ʹߦ͍ͬͯ·͢ɻ
    ߪೖ࣌ͷଈ࣌ϦτϥΠͩͱωοτϫʔΫ΍αʔόʔෆௐͳͲ͕ଈ࣌ʹղܾ͞Εͳ͍͜ͱ͕ߟ͑ΒΕΔͨΊɺىಈ࣌΍όοΫϑΥΞ࣌΍ίΠϯ࢒ߴදࣔ࣌ͳͲϢʔβʔ͕
    ࣗ෼ͷίΠϯ࢒ߴΛ֬ೝ͢Δ௚લʹϦτϥΠ͢ΔΑ͏ʹͯ͠ɺϢʔβʔʹෆ੔߹Λؾ෇͔ͤͮΒ͍ͤͯ͘͞·͢ɻ
    Ϣʔβʔ͔Β՝͚ۚͩ͞ΕͨͳͲͷ͓໰͍߹Θ͕͖ͤͨࡍ͸ɺ࠶ىಈͳͲͷϦτϥΠॲཧ͕ߦΘΕΔಈ࡞Λ͓ئ͍͍ͯ͠·͢ɻ

    View Slide

  42. ϦτϥΠॲཧͷ஫ҙ఺
    • ະ׬ྃτϥϯβΫγϣϯ͸SKPaymentQueue.transactionsͰ
    औಘͰ͖Δ
    ߪೖதͷτϥϯβΫγϣϯ΋ؚ·ΕΔ

    • ਖ਼ৗͳߪೖϑϩʔͷࡍ͸ϦτϥΠॲཧ

    ΛߦΘͳ͍ͳͲͷॲཧ͕ඞཁ
    ઌ΄Ͳະ׬ྃτϥϯβΫγϣϯ͸4,1BZNFOU2VFVFUSBOTBDUJPOTͰऔಘͰ͖Δͱઆ໌͠·͕ͨ͠ɺ͜ͷະ׬ྃτϥϯβΫγϣϯʹ͸ݱࡏߪೖதͷτϥϯβΫγϣϯ΋
    ؚ·Ε·͢ɻ
    ͪ͜Β͸ࣦഊஊͳͷͰ͕͢ɺ4,1BZNFOU2VFVFUSBOTBDUJPOTʹߪೖதͷτϥϯβΫγϣϯ΋ؚ·ΕΔ͜ͱΛؾ͔ͮͣɺϦτϥΠॲཧΛ࠷ॳʹ࣮૷͠·ͨ͠ɻ
    "CFNB57ͷίΠϯߪೖը໘͸ίΠϯ࢒ߴ͕දࣔ͞Ε͍ͯΔͷͰɺϦτϥΠॲཧ͕ߦΘΕ·͢ɻ
    ͭ·Γ͸ߪೖதͷτϥϯβΫγϣϯͷϦτϥΠ΋ߦͬͯ͠·͍ɺશͯͷτϥϯβΫγϣϯͷϨγʔτૹ৴Λ࠷௿Ͱ΋ߪೖ࣌ͱߪೖ࣌ͷϦτϥΠͷճߦ͏ͱ͍͏࣮૷ʹ
    ͳ͍ͬͯ·ͨ͠ɻ
    Ϩγʔτૹ৴Λճߦ͏ͷͰɺͲͪΒ͔Ͱ"CFNBίΠϯ͕෇༩͞Εͯɺ΋͏ยํ͸෇༩ࡁΈͷΤϥʔ͕ฦ͖͍ͬͯͯ·ͨ͠ɻ
    ͪ͜Β͸αʔόʔଆͷϩάͰ໌Β͔ʹ"CFNBίΠϯ෇༩ࡁΈͷεςʔλείʔυ͕ى͖͍͗ͯ͢Δͱ͍͏͜ͱͰൃ֮͠·ͨ͠ɻ
    ಈ࡞తʹ͸க໋తͰͳ͍ͷͰ͕͢ɺແବʹαʔόʔʹෛՙΛ͔͚ͨΓϩάΛԚͯ͠͠·͏ͷͰɺਖ਼ৗͳߪೖϑϩʔͷࡍ͸ϦτϥΠॲཧΛߦΘͳ͍Α͏ʹ࣮૷͠·ͨ͠ɻ
    ϦτϥΠॲཧΛ࣮૷͢Δࡍ͸஫ҙ͕ඞཁͰ͢ɻ

    View Slide

  43. AbemaTVʹ͓͚Δ

    ফ໣ܕ՝ۚͷ

    ಈ࡞ݕূ
    d

    ফ໣ܕ՝ۚͷઃܭΛͬ͘͟Γͱઆ໌ͨ͠ͷͰɺͪ͜ΒΛݟฦͤ͹ফ໣ܕ՝ۚΛ໰୊ͳ࣮͘૷Ͱ͖ΔΑ͏ʹͳ͍ͬͯΔͱࢥ͍·͢ɻ
    ͔͠͠ɺઌ΄Ͳͷઃܭ͕ਖ਼࣮͘͠૷͞Ε͍ͯΔ͜ͱΛϦϦʔε͢Δલʹݕূ͢Δඞཁ͕͋Γ·͢ɻ
    ՝ۚपΓͷॲཧͳͷͰɺக໋తͳ࣮૷ϛε͕͋Δͱ4/4΍ΧελϚʔαϙʔτ͕େมʹͳͬͯ͠·͍·͢ɻ
    ͔͜͜Β͸࣮ࡍʹͲ͏ݕূΛਐΊͨͷ͔ͱ͍͏͓࿩͕ϝΠϯʹͳ͖ͬͯ·͢ͷͰɺؾܰʹฉ͍͍ͯͩ͘͞ɻ

    View Slide

  44. ݕূ߲໨ͷೝࣝ߹Θͤ
    • ߪೖϑϩʔ͕τϥϯβΫγϣϯͳͲͷ಺෦ͷঢ়ଶʹґଘͯ͠
    ͍ΔͷͰɺQAνʔϜʹγʔέϯεਤΛ౉ͯ͠΋

    ݕূ߲໨Λ࡞੒͢Δͷ͕೉͍͠
    • ࣮ࡍʹͲͷΑ͏ͳঢ়گͰͲͷΑ͏ͳૢ࡞Λ͢Ε͹ɺͲͷΑ͏
    ͳঢ়ଶʹͳΔ͔ͷೝࣝ߹ΘͤΛ͠ͳ͍ͱ

    ݕূ߲໨Λ࡞੒Ͱ͖ͳ͍
    ফ໣ܕ՝ۚͷ࣮૷͸ແࣄʹ׬ྃͨ͠ͷͰ͕͢ɺ2"νʔϜͱͷೝࣝ߹Θ͕ͤେมͰͨ͠ɻ
    ͳͥͳΒɺߪೖϑϩʔ͕τϥϯβΫγϣϯͳͲͷ಺෦ͷঢ়ଶʹґଘ͍ͯ͠ΔͷͰɺ2"νʔϜʹγʔέϯεਤΛ౉ͯ͠΋۩ମతʹͲ͏ͳΔ͔Πϝʔδ͕͖ͭͮΒ͍͔ͬͨ
    ͨΊͰ͢ɻ
    ՝ۚॲཧͱ͍͏͜ͱ΋͋Γ৻ॏʹਐΊ͔ͨͬͨͷͰɺ2"νʔϜͱαʔόʔ୲౰ऀͱࣗ෼ͷϓϥοτϑΥʔϜؒͰೝࣝ߹ΘͤΛͭͭ͠ݕূ߲໨Λ࡞੒͢Δ͜ͱʹ͠·͠
    ͨɻ
    ͦ͜Ͱҙࣝͨ͠ͷ͸ɺ2"νʔϜ͕࣮ࡍʹͲͷΑ͏ͳঢ়گͰͲͷΑ͏ͳૢ࡞Λ͢Ε͹ͲͷΑ͏ͳঢ়ଶʹͳΔ͔ΛݴޠԽ͢Δ͜ͱͰͨ͠ɻ

    View Slide

  45. Mind Meister
    • ϚΠϯυϚοϓ࡞੒πʔϧͷMind MeisterΛ༻͍ͯ

    ೝࣝ߹ΘͤΛ͠·ͨ͠
    https://www.mindmeister.com/1309256136?t=X6wMB2GxG6
    ೝࣝ߹ΘͤͷͨΊʹϚΠϯυϚοϓ࡞੒πʔϧͷ.JOE.FJTUFSΛ༻͍·ͨ͠ɻ
    ͪ͜Β͸࣮ࡍʹ༻͍ͨ΋ͷΛ໛ͨ͠΋ͷͳͷͰ͕͢ɺಛʹϩάΠϯͳͲ͸ඞཁͳ͍ͷͰɺڵຯ͕͋Δํ͸ͪ͜Βͷ23ίʔυΛಡΈऔͬͯݟ͍ͯͩ͘͞ɻ
    Ͱ͸ɺ࣮ࡍʹͲͷΑ͏ʹೝࣝ߹ΘͤΛ͔ͨ͠ݟ͍͖ͯ·͠ΐ͏ɻ

    View Slide

  46. ίΠϯपΓͷදࣔܥ
    ͪ͜Β͸γϯϓϧͳදࣔܥͷݕূ߲໨ʹͳΓ·͢ɻ
    ͜ͷ྘ͷνΣοΫϚʔΫ͕෇͍͍ͯΔ߲໨͕ݕূ߲໨ʹͳΓ·͢ɻ
    ϚΠϖʔδͱίΠϯ؅ཧͱίΠϯߪೖͷը໘ͰͦΕͧΕίΠϯपΓͷද͕ࣔਖ਼ৗʹදࣔ͞Ε͍ͯΔ͜ͱͷݕূ߲໨ʹͳΓ·͢ɻ

    View Slide

  47. ίΠϯपΓͷදࣔܥ
    ࣮ࡍͷը໘͸ͪ͜ΒʹͳΓ·͢ɻ
    ࠨ͔ΒϚΠϖʔδɺίΠϯ؅ཧɺίΠϯߪೖը໘ʹͳΓ·͢ɻ
    ੺ؙ͍ͰғΘΕ͍ͯΔՕॴ͕ݕূ͢ΔՕॴʹͳΓ·͢ɻ

    View Slide

  48. ੒ޭ͢Δߪೖϑϩʔ
    ࣍͸ίΠϯߪೖը໘ͷ੒ޭ͢Δߪೖϑϩʔͷݕূ߲໨ʹͳΓ·͢ɻ
    ಈ࡞ͱͯ͠͸঎඼Λબ୒ͯ͠ߪೖͯ͠ίΠϯ࢒ߴ͕ߋ৽͞Ε͍ͯΔ͜ͱͷ֬ೝʹͳΓ·͢ɻ
    ͪ͜Βͷ੕ϚʔΫ͕෇͍͍ͯΔ߲໨͕ɺ࣮ࡍͷૢ࡞ʹͳΓ·͢ɻ
    ͜ͷΑ͏ʹ2"νʔϜ͕௨ৗۀ຿Ͱߦ͏Α͏ͳલఏ৚݅ͱೖྗͱग़ྗΛ໌֬Խ͢ΔΑ͏͜ͱΛҙࣝ͠·ͨ͠ɻ
    ͪ͜Β͸Ұ੾τϥϯβΫγϣϯ΍Ϩγʔτͱ͍͏༻ޠ͸༻͍͍ͯͳ͍ͷͰ͕͢ɺߪೖϑϩʔͷγʔέϯεਤ΋Ұॹʹ౉͍ͯͨ͠ͷͰɺ࠷ऴతʹ2"νʔϜ΋಺෦ͷγες
    Ϝ΋ཧղ͍ͯ͠·ͨ͠ɻ
    ࣮૷ଆ͸γεςϜ͔Βઃܭɾ࣮૷Λͯ͠ɺσόοά΍ςετͰ֬ೝ͢ΔͷͰ͕͢ɺ2"νʔϜ͸ٯʹݕূಈ࡞͔ΒγεςϜΛཧղ͢Δͱ͍͏ϑϩʔͷ΄͏͕ཧղ͠΍ͦ͢
    ͏Ͱͨ͠ɻ

    View Slide

  49. ࣦഊ͢Δߪೖϑϩʔ
    ͪ͜Β͸ࣦഊ͢ΔߪೖϑϩʔͳͷͰ͕͢ɺ߲໨͕ଟ͍ͷͰ࣮ࡍʹ.JOE.FJTUFSଆͰݟ͍͖ͯ·͠ΐ͏ɻ
    IUUQTXXXNJOENFJTUFSDPN U9X.#(Y(

    View Slide

  50. ߪೖϑϩʔͷಈ࡞ݕূ
    • ফ໣ܕ՝ۚͷߪೖϑϩʔΛ࣮૷ͨ͠αϯϓϧϓϩδΣΫτ
    https://github.com/Nonchalant/Consumable
    - Consumable In-App Purchase
    - Combine
    - SwiftUI
    Ͱ͸࣮ࡍʹαϯϓϧϓϩδΣΫτΛ༻͍ͯߪೖϑϩʔͷಈ࡞ݕূΛͯ͠Έ·͢ɻ
    ࠷ॳ͸͜ͷαϯϓϧϓϩδΣΫτ͸ϓϩμΫγϣϯͷํ͔Βίϐʔָͯ͠ʹ࡞Ζ͏ͱࢥ͍ͬͯͨͷͰ͕͢ɺ్தͰ๞͖ͯ͠·ͬͨͷͰɺ$PNCJOFͱ4XJGU6*Λ༻͍࣮ͯ૷
    ͯ͠Έ·ͨ͠ɻ
    ͸ͨͯ͜͠Ε͸αϯϓϧͳͷ͔ͱ͍͏݁Ռʹͳͬͯ͠·͍·ͨ͠ɻ
    Ͱ͸࣮ࡍʹݟ͍͖ͯ·͠ΐ͏ɻ

    View Slide

  51. ಈըΛྲྀͭͭ͠આ໌͢Δ

    ͜ͷσϞ͸͋͘·ͰҰྫͳͷͰɺ࣮ࡍʹ͸΋ͬͱଟ༷ͳύλʔϯͰ2"͍ͯ͠·͢ɻ

    View Slide

  52. ·ͱΊ
    d

    ࠷ޙʹ·ͱΊͰ͢ɻ

    View Slide

  53. ·ͱΊ
    • ফ໣ܕ՝ۚ͸ΠϯηϯςΟϒΛ෇༩͢Δ·Ͱ

    τϥϯβΫγϣϯΛऴྃ͠ͳ͍
    ࠶ߪೖ͢Δͱߪೖཤྺ্͕ॻ͖͞ΕΔͨΊ
    • ߪೖϑϩʔͰࣦഊ͢Δ͜ͱ͕͋ΔͷͰϦτϥΠػߏ͕ඞཁ
    ਖ਼ৗͳߪೖಋઢ্ͰϦτϥΠ͠ͳ͍
    ͍Ζ͍Ζͱ࿩͠·͕ͨ͠ɺ͜ͷൃදͷେࣄͳϙΠϯτ͸ͭͰ͢ɻ
    ͭΊ͸ʮফ໣ܕ՝ۚ͸ΠϯηϯςΟϒΛ෇༩͢Δ·ͰτϥϯβΫγϣϯΛऴྃ͠ͳ͍ʯͱ͍͏͜ͱɻ
    ͜Ε͸࠶ߪೖ͢Δͱߪೖཤྺ্͕ॻ͖͞ΕͯΠϯηϯςΟϒ͕෇༩Ͱ͖ͳ͘ͳΔͨΊͰ͢ɻ
    ͭΊ͸ߪೖϑϩʔͰࣦഊ͢Δ͜ͱ͕͋ΔͷͰϦτϥΠػߏ͸ඞཁͰ͢ɻ
    ͨͩɺϦτϥΠػߏΛਖ਼ৗͳߪೖಋઢ্Ͱಈ࡞͠ͳ͍Α͏ʹؾΛ͚ͭ·͠ΐ͏ɻ

    View Slide

  54. Thank you
    Ҏ্ʹͳΓ·͢ɺ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ

    View Slide

  55. ֨ήʔاۀަྲྀձ
    • ओʹετVͰ֨ήʔاۀަྲྀձ͍ͯ͠·͢
    • BizReach
    • CyberAgent
    • Cygames
    • DeNA
    • Microsoft
    • Supership
    • Yahoo!
    • ίϜγʔυ
    • ελʔτΞοϓςΫϊϩδʔ
    ौ୩ք۾ͷ*5اۀ͔Βঃʑʹ޿͕ͬͯɺओʹετϦʔτϑΝΠλʔ7ͰަྲྀձΛ͍ͯ͠·͢ɻ
    ΋͠ɺετϦʔτϑΝΠλʔ7Λ΍͍ͬͯͯɺڵຯ͕͋Δํ͕͍Ε͹࠙਌ձͳͲͰ࿩͔͚͍ͯͩ͘͞ʂ
    ަྲྀձͷதͰϛχେձͳͲ΋͋ͬͯɺΘ͍Θָ͍͠ΜͰ͍·͢ɻ

    View Slide