アプリ内課金
プラグインの現状 / Present situation of in-app purchase in Flutter

アプリ内課金
プラグインの現状 / Present situation of in-app purchase in Flutter

2019/03/26 Flutter Meetup Tokyo #8 15分LT資料
https://flutter-jp.connpass.com/event/121387/

English title: Present situation of in-app purchase in Flutter

Ce6acc3536b0e0340b5f0569d3394c9c?s=128

Yasutaka Kawamoto

March 26, 2019
Tweet

Transcript

  1. ΞϓϦ಺՝ۚ
 ϓϥάΠϯͷݱঢ় 2019/03/26 Flutter Meetup Tokyo #8 Տຊ ହ޹ Present

    situation of in-app purchase in Flutter
  2. 2 ΞδΣϯμ • ࣗݾ঺հ • ΞϓϦ಺՝ۚͱ͸ • ΞϓϦ಺՝ۚͷ5ͭͷϓϥάΠϯ • ·ͱΊ

  3. • Տຊ ହ޹(Yasutaka Kawamoto) • ॴଐɿגࣜձࣾ tech vein (େࡕ) •

    ϞόΠϧΞϓϦΤϯδχΞ • GitHub: kwmt 
 twitter: kwmt27 • Google I/O2018 ॳࢀՃ • Flutterྺɿ9ϲ݄ 3 ࣗݾ঺հ
  4. 4 ιϑτ΢ΣΞσβΠϯ2019೥4݄ʹدߘ͠·ͨ͠ ʮॳग़ɿٕज़ධ࿦ࣾץʰιϑτ΢ΣΞσβΠϯ2019೥4݄߸ʱʯ

  5. 5 ΞϓϦ಺՝ۚ(ఆظߪೖ)Λ࣮૷ͨ͠ΞϓϦΛϦϦʔε

  6. 5 ΞϓϦ಺՝ۚ(ఆظߪೖ)Λ࣮૷ͨ͠ΞϓϦΛϦϦʔε

  7. 6 ΞϓϦ಺՝ۚը໘

  8. ΞϓϦ಺՝ۚͱ͸

  9. 8 ΞϓϦ಺՝ۚ • ΞϓϦ಺ͷίϯςϯπΛߪೖͰ͖Δ࢓૊Έ

  10. 9 ΞϓϦ಺՝ۚͷछྨ(App Store) छྨ આ໌(ίϯςϯπͷྫ) ఆظߪಡ ݄୯Ґ΍೥୯ҐͰ՝ۚ͞Εɺղ໿͢Δ·Ͱܧଓ͢ Δ΋ͷɻ(ఆظߪಡͷ৽ฉͳͲ) ফඅܕ ඞཁͳͱ͖ʹຖճߪೖ͢ΔλΠϓͰແྉͰ࠶μ΢

    ϯϩʔυͰ͖ͳ͍΋ͷɻ(ήʔϜͷ௨՟ͳͲ) ඇফඅܕ 1ճͷΈߪೖ͕ՄೳͰͦΕҎ߱͸AppleIDʹؔ࿈෇ ͚ΕΒΕ͍ͯΔσόΠεʹసૹͰ͖Δ΋ͷɻ
 (޿ࠂͷ࡟আͳͲ) https://support.apple.com/ja-jp/HT202023
  11. 10 ΞϓϦ಺՝ۚͷछྨ(Google Play) छྨ આ໌(ίϯςϯπͷྫ) ఆظߪೖ (Subscriptions) Ϣʔβʔ޲͚ίϯςϯπɺαʔϏεɺػ ೳΛΞϓϦ಺Ͱ݄୯Ґ·ͨ͸೥୯ҐͰ ՝ۚͰ͖Δ΋ͷɻ(ΦϯϥΠϯࡶࢽͳͲ)

    ؅ཧର৅ͷ
 ΞϓϦ಺ΞΠςϜ (One-time products) ຖճࢧ෷͍͕ඞཁͳ΋ͷɻ (ήʔϜ಺௨՟ɺ৯ྐɺढจͳͲ) https://developer.android.com/google/play/billing/api.html?hl=ja#producttypes
  12. 11 ΞϓϦ಺՝ۚͷछྨ App Store Google Play ఆظߪಡ ఆظߪೖ ফඅܕ ؅ཧର৅ͷ


    ΞϓϦ಺ΞΠςϜ ඇফඅܕ
  13. 11 ΞϓϦ಺՝ۚͷछྨ App Store Google Play ఆظߪಡ ఆظߪೖ ফඅܕ ؅ཧର৅ͷ


    ΞϓϦ಺ΞΠςϜ ඇফඅܕ ఆظߪೖ
  14. 11 ΞϓϦ಺՝ۚͷछྨ App Store Google Play ఆظߪಡ ఆظߪೖ ফඅܕ ؅ཧର৅ͷ


    ΞϓϦ಺ΞΠςϜ ඇফඅܕ ఆظߪೖ ఆظߪೖҎ֎
  15. ΞϓϦ಺՝ۚͷ5ͭͷϓϥάΠϯ

  16. 13 ΞϓϦ಺՝ۚͷ5ͭͷϓϥάΠϯ 1.flutter_inapp_purchase 2.flutter_billing 3.iap 4.flutter_payments 5.in_app_purchase

  17. 14 1. flutter_inapp_purchase (Basic) ఆظߪೖ Մೳ ఆظߪೖҎ֎ Մೳ Overall score

    97 GitHub star 196 last updated Mar 18, 2019 version 0.9.2 Dart code static methods AndroidɺiOS javaɺobj-c ※2019/03/24࣌఺ͷσʔλ
  18. 15 1. flutter_inapp_purchase (How to use) class IAPDataSource {
 void

    sample() async {
 
 await FlutterInappPurchase.initConnection; List<String> skus = []..add(sku);
 /// ఆظߪೖͷ঎඼Λऔಘ
 List<IAPItem> list = await 
 FlutterInappPurchase.getSubscriptions(skus); /// ఆظߪೖҎ֎ͷ঎඼Λऔಘ
 List<IAPItem> list = await FlutterInappPurchase.getProducts(skus);
 // ߪೖ(ߪೖϑϩʔ΁) PurchasedItem item = await 
 FlutterInappPurchase.buySubscription(productId); PurchasedItem item = await FlutterInappPurchase.buyProduct(productId) // ߪೖޙͷॲཧ 
 // ޙॲཧ await FlutterInappPurchase.endConnection;
 } }
  19. 15 1. flutter_inapp_purchase (How to use) class IAPDataSource {
 void

    sample() async {
 
 await FlutterInappPurchase.initConnection; List<String> skus = []..add(sku);
 /// ఆظߪೖͷ঎඼Λऔಘ
 List<IAPItem> list = await 
 FlutterInappPurchase.getSubscriptions(skus); /// ఆظߪೖҎ֎ͷ঎඼Λऔಘ
 List<IAPItem> list = await FlutterInappPurchase.getProducts(skus);
 // ߪೖ(ߪೖϑϩʔ΁) PurchasedItem item = await 
 FlutterInappPurchase.buySubscription(productId); PurchasedItem item = await FlutterInappPurchase.buyProduct(productId) // ߪೖޙͷॲཧ 
 // ޙॲཧ await FlutterInappPurchase.endConnection;
 } } ίωΫγϣϯ։࢝
  20. 15 1. flutter_inapp_purchase (How to use) class IAPDataSource {
 void

    sample() async {
 
 await FlutterInappPurchase.initConnection; List<String> skus = []..add(sku);
 /// ఆظߪೖͷ঎඼Λऔಘ
 List<IAPItem> list = await 
 FlutterInappPurchase.getSubscriptions(skus); /// ఆظߪೖҎ֎ͷ঎඼Λऔಘ
 List<IAPItem> list = await FlutterInappPurchase.getProducts(skus);
 // ߪೖ(ߪೖϑϩʔ΁) PurchasedItem item = await 
 FlutterInappPurchase.buySubscription(productId); PurchasedItem item = await FlutterInappPurchase.buyProduct(productId) // ߪೖޙͷॲཧ 
 // ޙॲཧ await FlutterInappPurchase.endConnection;
 } } ঎඼औಘ
  21. 15 1. flutter_inapp_purchase (How to use) class IAPDataSource {
 void

    sample() async {
 
 await FlutterInappPurchase.initConnection; List<String> skus = []..add(sku);
 /// ఆظߪೖͷ঎඼Λऔಘ
 List<IAPItem> list = await 
 FlutterInappPurchase.getSubscriptions(skus); /// ఆظߪೖҎ֎ͷ঎඼Λऔಘ
 List<IAPItem> list = await FlutterInappPurchase.getProducts(skus);
 // ߪೖ(ߪೖϑϩʔ΁) PurchasedItem item = await 
 FlutterInappPurchase.buySubscription(productId); PurchasedItem item = await FlutterInappPurchase.buyProduct(productId) // ߪೖޙͷॲཧ 
 // ޙॲཧ await FlutterInappPurchase.endConnection;
 } } ߪೖ
  22. 15 1. flutter_inapp_purchase (How to use) class IAPDataSource {
 void

    sample() async {
 
 await FlutterInappPurchase.initConnection; List<String> skus = []..add(sku);
 /// ఆظߪೖͷ঎඼Λऔಘ
 List<IAPItem> list = await 
 FlutterInappPurchase.getSubscriptions(skus); /// ఆظߪೖҎ֎ͷ঎඼Λऔಘ
 List<IAPItem> list = await FlutterInappPurchase.getProducts(skus);
 // ߪೖ(ߪೖϑϩʔ΁) PurchasedItem item = await 
 FlutterInappPurchase.buySubscription(productId); PurchasedItem item = await FlutterInappPurchase.buyProduct(productId) // ߪೖޙͷॲཧ 
 // ޙॲཧ await FlutterInappPurchase.endConnection;
 } } ߪೖޙͷॲཧ
  23. 15 1. flutter_inapp_purchase (How to use) class IAPDataSource {
 void

    sample() async {
 
 await FlutterInappPurchase.initConnection; List<String> skus = []..add(sku);
 /// ఆظߪೖͷ঎඼Λऔಘ
 List<IAPItem> list = await 
 FlutterInappPurchase.getSubscriptions(skus); /// ఆظߪೖҎ֎ͷ঎඼Λऔಘ
 List<IAPItem> list = await FlutterInappPurchase.getProducts(skus);
 // ߪೖ(ߪೖϑϩʔ΁) PurchasedItem item = await 
 FlutterInappPurchase.buySubscription(productId); PurchasedItem item = await FlutterInappPurchase.buyProduct(productId) // ߪೖޙͷॲཧ 
 // ޙॲཧ await FlutterInappPurchase.endConnection;
 } } ޙॲཧ
  24. 16 1. flutter_inapp_purchase (Pros/Cons) • ϓϥάΠϯଆͰϓϥοτϑΥʔϜͷҧ͍Λٵऩͯ͘͠Εͯ ͍ΔͷͰɺ࢖͏ͱ͖͸ҧ͍Λ͋·Γҙࣝ͠ͳ͍͍ͯ͘ɻ • ͨͩ͠ɺiOS only΍Android

    onlyͳϓϩύςΟ͕͋Δͷ Ͱɺͦ͜͸ҙࣝ͠ͳ͍ͱ͍͚ͳ͍ɻ • Amazon Kindle FireͷΞϓϦ಺՝ۚʹ΋ରԠ • PR͕ͨ͠ɺଈ൓Ԡͯ͘͠ΕͨͷͰ޷ҹ৅ • ͢΂ͯstaticϝιουͳͷͰϞοΫͰ͖ͣςετ͠ʹ͍͘ɻ • Τϥʔ͕iOSɾAndroidͰ౷Ұ͞Ε͍ͯͳ͍ͷͰѻ͍ʹ͘ ͘ɺ෼͔Γʹ͍͘ɻ(ৄࡉ͸Qiitaʹ https://bit.ly/2Fvw0Ig) Pros Cons
  25. 17 2. flutter_billing (Basic) ఆظߪೖ AndroidͷΈՄೳɺiOS͸ෆՄ ఆظߪೖҎ֎ Մೳ Overall score

    88 GitHub star 78 last updated Oct 21, 2018 version 0.3.0 Dart code non-static methods AndroidɺiOS javaɺobj-c
  26. 18 2. flutter_billing (How to use) class IAPDataSource { final

    Billing billing = Billing(onError: (e) { print(e); });
 
 void sample() async { List<String> skus = []..add(sku);
 /// ఆظߪೖͷ঎඼Λऔಘ
 List<BillingProduct> list = await
 billing.getSubscriptions(skus); /// ఆظߪೖҎ֎ͷ঎඼Λऔಘ
 List<BillingProduct> list = await billing.getProducts(skus);
 // ߪೖ(ߪೖϑϩʔ΁) bool result = await billing.subscribe(productId); bool result = await billing.purchase(productId) // ߪೖޙͷॲཧ
 } }
  27. 18 2. flutter_billing (How to use) class IAPDataSource { final

    Billing billing = Billing(onError: (e) { print(e); });
 
 void sample() async { List<String> skus = []..add(sku);
 /// ఆظߪೖͷ঎඼Λऔಘ
 List<BillingProduct> list = await
 billing.getSubscriptions(skus); /// ఆظߪೖҎ֎ͷ঎඼Λऔಘ
 List<BillingProduct> list = await billing.getProducts(skus);
 // ߪೖ(ߪೖϑϩʔ΁) bool result = await billing.subscribe(productId); bool result = await billing.purchase(productId) // ߪೖޙͷॲཧ
 } } ॳظԽ
  28. 18 2. flutter_billing (How to use) class IAPDataSource { final

    Billing billing = Billing(onError: (e) { print(e); });
 
 void sample() async { List<String> skus = []..add(sku);
 /// ఆظߪೖͷ঎඼Λऔಘ
 List<BillingProduct> list = await
 billing.getSubscriptions(skus); /// ఆظߪೖҎ֎ͷ঎඼Λऔಘ
 List<BillingProduct> list = await billing.getProducts(skus);
 // ߪೖ(ߪೖϑϩʔ΁) bool result = await billing.subscribe(productId); bool result = await billing.purchase(productId) // ߪೖޙͷॲཧ
 } } ঎඼औಘ
  29. 18 2. flutter_billing (How to use) class IAPDataSource { final

    Billing billing = Billing(onError: (e) { print(e); });
 
 void sample() async { List<String> skus = []..add(sku);
 /// ఆظߪೖͷ঎඼Λऔಘ
 List<BillingProduct> list = await
 billing.getSubscriptions(skus); /// ఆظߪೖҎ֎ͷ঎඼Λऔಘ
 List<BillingProduct> list = await billing.getProducts(skus);
 // ߪೖ(ߪೖϑϩʔ΁) bool result = await billing.subscribe(productId); bool result = await billing.purchase(productId) // ߪೖޙͷॲཧ
 } } ߪೖ
  30. 18 2. flutter_billing (How to use) class IAPDataSource { final

    Billing billing = Billing(onError: (e) { print(e); });
 
 void sample() async { List<String> skus = []..add(sku);
 /// ఆظߪೖͷ঎඼Λऔಘ
 List<BillingProduct> list = await
 billing.getSubscriptions(skus); /// ఆظߪೖҎ֎ͷ঎඼Λऔಘ
 List<BillingProduct> list = await billing.getProducts(skus);
 // ߪೖ(ߪೖϑϩʔ΁) bool result = await billing.subscribe(productId); bool result = await billing.purchase(productId) // ߪೖޙͷॲཧ
 } } ߪೖޙͷॲཧ
  31. 19 2. flutter_billing (Pros/Cons) • ϓϥάΠϯଆͰϓϥοτϑΥʔϜͷҧ͍Λٵऩͯ͠ ͘Ε͍ͯΔͷͰɺ࢖͏ͱ͖͸ҧ͍Λ͋·Γҙࣝ͠ͳ ͍͍ͯ͘ɻ • ඇελςΟοΫϝιουͱ࣮ͯ͠૷͞Ε͍ͯΔͷ

    ͰɺϞοΫ͠΍͍͢ • iOSͷఆظߪೖ͕Ͱ͖ͳ͍ • ߪೖ௚ޙʹߪೖ৘ใ͕औಘͰ͖ͳ͍ Pros Cons
  32. 20 3. iap (Basic) ఆظߪೖ Մೳ ఆظߪೖҎ֎ Մೳ Overall score

    83 GitHub star 11 last updated Nov 28, 2018 version 0.1.0 Dart code non-static methods AndroidɺiOS javaɺobj-c
  33. 21 3. iap (How to use) (Android) class IAPDataSource implements

    PurchasesUpdatedListener {
 BillingClient _client;
 
 void sample() async {
 
 _client = BillingClient(this); await _client.startConnection(onDisconnect: handleDisconnect); List<String> skus = []..add(sku);
 List<SkuDetails> list = await _client.querySkuDetails(
 skuType: SkuType.kSubs, skus: skus); await _client.launchBillingFlow(
 ɹɹɹɹBillingFlowParams(skuDetails: list[0]));
 } 
 @override
 void onPurchasesUpdated(
 ɹɹɹint responseCode, List<Purchase> purchases) {
 ɹ// ߪೖޙͷॲཧ
 }
 }
  34. 21 3. iap (How to use) (Android) class IAPDataSource implements

    PurchasesUpdatedListener {
 BillingClient _client;
 
 void sample() async {
 
 _client = BillingClient(this); await _client.startConnection(onDisconnect: handleDisconnect); List<String> skus = []..add(sku);
 List<SkuDetails> list = await _client.querySkuDetails(
 skuType: SkuType.kSubs, skus: skus); await _client.launchBillingFlow(
 ɹɹɹɹBillingFlowParams(skuDetails: list[0]));
 } 
 @override
 void onPurchasesUpdated(
 ɹɹɹint responseCode, List<Purchase> purchases) {
 ɹ// ߪೖޙͷॲཧ
 }
 } ॳظԽͯ͠ίωΫγϣϯ։࢝
  35. 21 3. iap (How to use) (Android) class IAPDataSource implements

    PurchasesUpdatedListener {
 BillingClient _client;
 
 void sample() async {
 
 _client = BillingClient(this); await _client.startConnection(onDisconnect: handleDisconnect); List<String> skus = []..add(sku);
 List<SkuDetails> list = await _client.querySkuDetails(
 skuType: SkuType.kSubs, skus: skus); await _client.launchBillingFlow(
 ɹɹɹɹBillingFlowParams(skuDetails: list[0]));
 } 
 @override
 void onPurchasesUpdated(
 ɹɹɹint responseCode, List<Purchase> purchases) {
 ɹ// ߪೖޙͷॲཧ
 }
 } ঎඼औಘ
  36. 21 3. iap (How to use) (Android) class IAPDataSource implements

    PurchasesUpdatedListener {
 BillingClient _client;
 
 void sample() async {
 
 _client = BillingClient(this); await _client.startConnection(onDisconnect: handleDisconnect); List<String> skus = []..add(sku);
 List<SkuDetails> list = await _client.querySkuDetails(
 skuType: SkuType.kSubs, skus: skus); await _client.launchBillingFlow(
 ɹɹɹɹBillingFlowParams(skuDetails: list[0]));
 } 
 @override
 void onPurchasesUpdated(
 ɹɹɹint responseCode, List<Purchase> purchases) {
 ɹ// ߪೖޙͷॲཧ
 }
 } ߪೖϑϩʔ΁
  37. 21 3. iap (How to use) (Android) class IAPDataSource implements

    PurchasesUpdatedListener {
 BillingClient _client;
 
 void sample() async {
 
 _client = BillingClient(this); await _client.startConnection(onDisconnect: handleDisconnect); List<String> skus = []..add(sku);
 List<SkuDetails> list = await _client.querySkuDetails(
 skuType: SkuType.kSubs, skus: skus); await _client.launchBillingFlow(
 ɹɹɹɹBillingFlowParams(skuDetails: list[0]));
 } 
 @override
 void onPurchasesUpdated(
 ɹɹɹint responseCode, List<Purchase> purchases) {
 ɹ// ߪೖޙͷॲཧ
 }
 } ߪೖޙͷॲཧ
  38. 22 3. iap (How to use) (iOS) class IAPDataSource implements

    SKPaymentTransactionObserver {
 void sample() async { SKProductsResponse response = await StoreKit.instance.products(skus); await SKPaymentQueue.instance.addPayment( SKPayment.fromMap( {"productIdentifier": sku, "quantity": 1} ) ); StoreKit.instance.paymentQueue .setTransactionObserver(this); @override void didUpdateTransactions( SKPaymentQueue queue, 
 List<SKPaymentTransaction> transactions) async {
 // ߪೖޙͷॲཧ }
 }
 }
  39. 22 3. iap (How to use) (iOS) class IAPDataSource implements

    SKPaymentTransactionObserver {
 void sample() async { SKProductsResponse response = await StoreKit.instance.products(skus); await SKPaymentQueue.instance.addPayment( SKPayment.fromMap( {"productIdentifier": sku, "quantity": 1} ) ); StoreKit.instance.paymentQueue .setTransactionObserver(this); @override void didUpdateTransactions( SKPaymentQueue queue, 
 List<SKPaymentTransaction> transactions) async {
 // ߪೖޙͷॲཧ }
 }
 } ঎඼औಘ
  40. 22 3. iap (How to use) (iOS) class IAPDataSource implements

    SKPaymentTransactionObserver {
 void sample() async { SKProductsResponse response = await StoreKit.instance.products(skus); await SKPaymentQueue.instance.addPayment( SKPayment.fromMap( {"productIdentifier": sku, "quantity": 1} ) ); StoreKit.instance.paymentQueue .setTransactionObserver(this); @override void didUpdateTransactions( SKPaymentQueue queue, 
 List<SKPaymentTransaction> transactions) async {
 // ߪೖޙͷॲཧ }
 }
 } ߪೖ(ߪೖϑϩʔ΁)
  41. 22 3. iap (How to use) (iOS) class IAPDataSource implements

    SKPaymentTransactionObserver {
 void sample() async { SKProductsResponse response = await StoreKit.instance.products(skus); await SKPaymentQueue.instance.addPayment( SKPayment.fromMap( {"productIdentifier": sku, "quantity": 1} ) ); StoreKit.instance.paymentQueue .setTransactionObserver(this); @override void didUpdateTransactions( SKPaymentQueue queue, 
 List<SKPaymentTransaction> transactions) async {
 // ߪೖޙͷॲཧ }
 }
 } ߪೖޙͷॲཧ
  42. 23 3. iap (Pros/Cons) • ֤ϓϥοτϑΥʔϜͷΞϓϦ಺՝ۚϥΠϒϥϦͱ
 ΄΅ಉ͡ΠϯλʔϑΣʔεͳͷͰɺωΠςΟϒʹೃ છΈͷ͋Δํ͸ɺ෼͔Γ΍͍͔͢΋ • iOSͱAndroidͰݺͼग़͠ํΛม͑Δඞཁ͕͋Δͷ

    Ͱɺ࣮૷ͷ࢓ํʹΑͬͯ͸ͪ͝Όͪ͝Όͦ͠͏ Pros Cons
  43. 24 4. flutter_payments (Basic) ఆظߪೖ ՄೳΒ͍͠ ఆظߪೖҎ֎ ՄೳΒ͍͠ Overall score

    77 GitHub star 20 last updated Jul 14, 2018 version 0.1.5 Dart code non-static methods AndroidɺiOS kotlinɺswift
  44. 25 4. flutter_payments (How to use) !

  45. 25 4. flutter_payments (How to use) This repository has been

    archived by the owner. It is now read-only !
  46. 25 4. flutter_payments (How to use) This repository has been

    archived by the owner. It is now read-only ! ͦΕͰ΋ࢼͯ͠ΈΑ͏ͱࢥͬͯflutter packges getͨ͠Βɺ failͨ͠ͷͰɺࢼ͢ͷΛఘΊ·ͨ͠ɾɾɾ
  47. 26 4. flutter_payments (Pros/Cons) • ωΠςΟϒίʔυ͕ɺkotlinɾswiftͰॻ͔Ε͍ͯΔͷ Ͱϝϯς͠΍ͦ͢͏ • ϨϙδτϦ͕ΞʔΧΠϒ͞ΕͯΔͷͰɺୈࡾऀ͕ϝ ϯςͰ͖ͳ͍

    Pros Cons
  48. 27 5. in_app_purchase (Basic) • GoogleެࣜͷϓϥάΠϯ • ·ͩ४උத https://github.com/flutter/flutter/issues/9591#issuecomment-467678342 •

    ϚΠϧετʔϯ͕4݄ʹઃఆ͞Ε͍ͯΔ
  49. 28 5. in_app_purchase (How to use) class IAPDataSource {
 void

    sample() async { ProductDetailsResponse result = await InAppPurchaseConnection.instance .queryProductDetails(skus.toSet()); }
 }
  50. 28 5. in_app_purchase (How to use) class IAPDataSource {
 void

    sample() async { ProductDetailsResponse result = await InAppPurchaseConnection.instance .queryProductDetails(skus.toSet()); }
 } ঎඼औಘ
  51. 29 5. in_app_purchase (Pros/Cons) • GoogleެࣜͷϓϥάΠϯͳͷͰ҆৺ײ͕͋Δ • ࢖͏ଆ͕ϓϥοτϑΥʔϜΛ͋·Γҙࣝ͠ͳͯ͘ྑ ͦ͞͏ͳ࡞Γʹͳ͍ͬͯͦ͏Ͱ͢ɻ •

    ·ͩ४උத͕ͩɺࠓޙʹظ଴ Pros Cons
  52. ·ͱΊ

  53. 31 ·ͱΊ • AndroidɾiOSͱ΋ʹఆظߪೖɺఆظߪೖҎ֎͕Մೳ ͳͷ͸flutter_inapp_purchase(1)ͱiap(3) • flutter_billing(2)͸iOSͷఆظߪೖ͕Ͱ͖·ͤΜ͕ɺ ఆظߪೖҎ֎͸྆OSՄೳ • flutter_payments(4)͸ΞʔΧΠϒ͞ΕͯΔ

    • Googleެࣜͷin_app_purchase(5)͸·ͩ४උதͩ ͕ɺϚΠϧετʔϯ͕ઃఆ͞Ε͍ͯΔͷͰ͍ۙ಺ʹ ࢖͑ΔΑ͏ʹͳΓͦ͏
  54. Happy Fluttering!