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

課金処理とたたかう.pdf

 課金処理とたたかう.pdf

potatotips #62で発表したスライドです!
https://potatotips.connpass.com/event/129207/

Nobuyuki Nishiyama

June 18, 2019
Tweet

More Decks by Nobuyuki Nishiyama

Other Decks in Programming

Transcript

  1. QPUBUPUJQT
    ՝ۚॲཧͱ͔ͨͨ͏ʂ
    ΅ͬͪήʔϜσϕϩού
    ੢ࢁ৴ߦɹ

    View Slide


  2. ੿࡞ΞϓϦʮύζϧˍϞφʔΫʯ
    ສμ΢ϯϩʔυಥഁ

    View Slide


  3. ࣮͸՝ۚॲཧͷ࣮૷͸ॳΊͯʂ

    View Slide


  4. ࠓͲ͖0CKFDUJWF$Ͱ՝ۚॲཧΛ
    ॻ͍ͨϨΞέʔεʂ

    View Slide


  5. ʮ՝ۚͨ͠ΒΞϓϦ͕ىಈ͠ͳ͘
    ͳͬͨʂʯ

    View Slide


  6. खݩͷ؀ڥͰ࠶ݱͰ͖ͳ͍ʜ

    View Slide


  7. ͱΓ͋͑ͣιʔείʔυΛಡΉ

    View Slide

  8. ͓΍ʁ
    // 課金成功時に記録を保存する
    void purchased(std::string id)
    {
    // 課金ID→内部ID
    std::map tbl{
    { "PERCHASE01", "PERCHASE-01" },
    { "PERCHASE02", "PERCHASE-02" },
    };
    // 課金ID→内部ID にしたのを保存
    setRecord(tbl.at(id));
    }

    View Slide

  9. // 課金成功時に記録を保存する
    void purchased(std::string id)
    {
    // 課金ID→内部ID
    std::map tbl{
    { "PERCHASE01", "PERCHASE-01" },
    { "PERCHASE02", "PERCHASE-02" },
    };
    // 無効な課金IDだとここでアプリが落ちる
    setRecord(tbl.at(id));
    }

    View Slide

  10. ͬ͞͞ͱमਖ਼
    // 課金成功時に記録を保存する
    void purchased(std::string id)
    {
    // 課金ID→内部ID
    std::map tbl{
    { "PERCHASE01", "PERCHASE-01" },
    { "PERCHASE02", "PERCHASE-02" },
    };
    // 無効なIDでなければ処理する
    if (tbl.count(id))
    {
    setRecord(tbl.at(id));
    }
    }

    View Slide


  11. ͬͦ͘͞௚ͯ͠όʔδϣϯΞοϓ
    ਃ੥ʂ

    View Slide


  12. ʮ΍ͬͺΓىಈ͠·ͤΜɻʯ

    View Slide


  13. ;ͨͨͼιʔείʔυΛಡΉ

    View Slide

  14. ͓΍ʁ
    // 課金情報を取得
    void price(NSString* product_id, id viewController)
    {
    NSSet* id_set = [NSSet setWithObject:product_id];
    // リクエストを生成
    SKProductsRequest* request =
    [[[SKProductsRequest alloc]
    initWithProductIdentifiers:id_set] autorelease];
    request.delegate = viewController;
    // 取得開始!
    [request start];
    }

    View Slide

  15. উखʹղ์ͨ͠Βμϝͳ΍ͭʜʁ
    // 課金情報を取得
    void price(NSString* product_id, id viewController)
    {
    NSSet* id_set = [NSSet setWithObject:product_id];
    // リクエストを生成
    SKProductsRequest* request =
    [[[SKProductsRequest alloc]
    initWithProductIdentifiers:id_set] autorelease];
    request.delegate = viewController;
    // 取得開始!
    [request start];
    }

    View Slide


  16. ͬͦ͘͞௚ͯ͠όʔδϣϯΞοϓ
    ਃ੥ʂ

    View Slide


  17. ʮ΍ͬͺΓىಈ͠·ͤΜɻʯ

    View Slide


  18. ·ͨιʔείʔυΛಡΉͱ͜Ζ͔
    Β͔ʜ

    View Slide


  19. ͱʜ͜͜ͰϢʔβʔ͔Βͷوॏͳ
    ৘ใ͕ʂ

    View Slide

  20. ৘ใ̍ʮ՝ۚ࣌ʹΫϨδοτΧʔ
    υ൪߸Λొ࿥ͨ͠ʯ

    View Slide

  21. wϢʔβʔ͕ॳΊͯ՝ۚͨ࣌͠ͷڍಈ
    wΞϓϦ͔Β"QQ4UPSF΁ը໘ભҠͯ͠ɺ·ͨΞϓ
    Ϧʹ໭ͬͯ͘Δύλʔϯ

    View Slide

  22. ৘ใ̎ʮΫϥογϡϩάʹͦΕΒ
    ͖͠৘ใ͕ʂʯ

    View Slide

  23. View Slide

  24. ͜Ε͔ʂ
    // 課金成功時の処理
    void provideContent(NSString* productIdentifier)
    {
    // IDをNSString→std::stringにして課金完了処理へ
    purchase_completed([productIdentifier UTF8String]);
    }
    // 課金完了処理
    void purchase_completed(std::string& id)
    {
    // 色々処理
    }

    View Slide

  25. // 課金成功時の処理
    void provideContent(NSString* productIdentifier)
    {
    // 変換結果が null の場合があり得る
    purchase_completed([productIdentifier UTF8String]);
    }
    // 課金完了処理
    void purchase_completed(std::string& id)
    {
    // idが null の場合にアプリが落ちる
    }

    View Slide

  26. ͜͏௚ͨ͠
    // 課金成功時の処理
    - (void)provideContent:(NSString *)productIdentifier
    {
    std::string id = productIdentifier
    ? [productIdentifier UTF8String]
    : "";
    ngs::purchase_completed(id);
    }
    // 課金完了処理
    void purchase_completed(std::string& id)
    {
    // idがnullになることはない
    }

    View Slide


  27. ʮىಈ͠·ͨ͠ʂ͋Γ͕ͱ͏͟͝
    ͍·͢ʂʂʂʂʯ

    View Slide


  28. ໿̎ϲֻ݄͚ͯղܾʂ

    View Slide

  29. wखݩͰ࠶ݱͰ͖ͳ͍ෆ۩߹ͷղܾ͸೉͍͠
    wϢʔβʔ͔Βͷࠣ͘͝ࡉͳใࠂ΋ݟಀ͞ͳ͍
    w͖͋ΒΊͳ͍ؾ࣋ͪ
    ·ͱΊ

    View Slide

  30. w5XJUUFS!NJOHBNF
    w'BDFCPPLNJOHBNF
    w(JU)VCUFLOJTIJ
    wΞϓϦͷιʔείʔυIUUQTHJUIVCDPN
    UFLOJTIJ1V[[MF"OE.POBSDI
    ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ

    View Slide