Slide 1

Slide 1 text

ΞϓϦ಺՝ۚ
 ϓϥάΠϯͷݱঢ় 2019/03/26 Flutter Meetup Tokyo #8 Տຊ ହ޹ Present situation of in-app purchase in Flutter

Slide 2

Slide 2 text

2 ΞδΣϯμ • ࣗݾ঺հ • ΞϓϦ಺՝ۚͱ͸ • ΞϓϦ಺՝ۚͷ5ͭͷϓϥάΠϯ • ·ͱΊ

Slide 3

Slide 3 text

• Տຊ ହ޹(Yasutaka Kawamoto) • ॴଐɿגࣜձࣾ tech vein (େࡕ) • ϞόΠϧΞϓϦΤϯδχΞ • GitHub: kwmt 
 twitter: kwmt27 • Google I/O2018 ॳࢀՃ • Flutterྺɿ9ϲ݄ 3 ࣗݾ঺հ

Slide 4

Slide 4 text

4 ιϑτ΢ΣΞσβΠϯ2019೥4݄ʹدߘ͠·ͨ͠ ʮॳग़ɿٕज़ධ࿦ࣾץʰιϑτ΢ΣΞσβΠϯ2019೥4݄߸ʱʯ

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

6 ΞϓϦ಺՝ۚը໘

Slide 8

Slide 8 text

ΞϓϦ಺՝ۚͱ͸

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

9 ΞϓϦ಺՝ۚͷछྨ(App Store) छྨ આ໌(ίϯςϯπͷྫ) ఆظߪಡ ݄୯Ґ΍೥୯ҐͰ՝ۚ͞Εɺղ໿͢Δ·Ͱܧଓ͢ Δ΋ͷɻ(ఆظߪಡͷ৽ฉͳͲ) ফඅܕ ඞཁͳͱ͖ʹຖճߪೖ͢ΔλΠϓͰແྉͰ࠶μ΢ ϯϩʔυͰ͖ͳ͍΋ͷɻ(ήʔϜͷ௨՟ͳͲ) ඇফඅܕ 1ճͷΈߪೖ͕ՄೳͰͦΕҎ߱͸AppleIDʹؔ࿈෇ ͚ΕΒΕ͍ͯΔσόΠεʹసૹͰ͖Δ΋ͷɻ
 (޿ࠂͷ࡟আͳͲ) https://support.apple.com/ja-jp/HT202023

Slide 11

Slide 11 text

10 ΞϓϦ಺՝ۚͷछྨ(Google Play) छྨ આ໌(ίϯςϯπͷྫ) ఆظߪೖ (Subscriptions) Ϣʔβʔ޲͚ίϯςϯπɺαʔϏεɺػ ೳΛΞϓϦ಺Ͱ݄୯Ґ·ͨ͸೥୯ҐͰ ՝ۚͰ͖Δ΋ͷɻ(ΦϯϥΠϯࡶࢽͳͲ) ؅ཧର৅ͷ
 ΞϓϦ಺ΞΠςϜ (One-time products) ຖճࢧ෷͍͕ඞཁͳ΋ͷɻ (ήʔϜ಺௨՟ɺ৯ྐɺढจͳͲ) https://developer.android.com/google/play/billing/api.html?hl=ja#producttypes

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

ΞϓϦ಺՝ۚͷ5ͭͷϓϥάΠϯ

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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࣌఺ͷσʔλ

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

19 2. flutter_billing (Pros/Cons) • ϓϥάΠϯଆͰϓϥοτϑΥʔϜͷҧ͍Λٵऩͯ͠ ͘Ε͍ͯΔͷͰɺ࢖͏ͱ͖͸ҧ͍Λ͋·Γҙࣝ͠ͳ ͍͍ͯ͘ɻ • ඇελςΟοΫϝιουͱ࣮ͯ͠૷͞Ε͍ͯΔͷ ͰɺϞοΫ͠΍͍͢ • iOSͷఆظߪೖ͕Ͱ͖ͳ͍ • ߪೖ௚ޙʹߪೖ৘ใ͕औಘͰ͖ͳ͍ Pros Cons

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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 skus = []..add(sku);
 List list = await _client.querySkuDetails(
 skuType: SkuType.kSubs, skus: skus); await _client.launchBillingFlow(
 ɹɹɹɹBillingFlowParams(skuDetails: list[0]));
 } 
 @override
 void onPurchasesUpdated(
 ɹɹɹint responseCode, List purchases) {
 ɹ// ߪೖޙͷॲཧ
 }
 }

Slide 34

Slide 34 text

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 skus = []..add(sku);
 List list = await _client.querySkuDetails(
 skuType: SkuType.kSubs, skus: skus); await _client.launchBillingFlow(
 ɹɹɹɹBillingFlowParams(skuDetails: list[0]));
 } 
 @override
 void onPurchasesUpdated(
 ɹɹɹint responseCode, List purchases) {
 ɹ// ߪೖޙͷॲཧ
 }
 } ॳظԽͯ͠ίωΫγϣϯ։࢝

Slide 35

Slide 35 text

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 skus = []..add(sku);
 List list = await _client.querySkuDetails(
 skuType: SkuType.kSubs, skus: skus); await _client.launchBillingFlow(
 ɹɹɹɹBillingFlowParams(skuDetails: list[0]));
 } 
 @override
 void onPurchasesUpdated(
 ɹɹɹint responseCode, List purchases) {
 ɹ// ߪೖޙͷॲཧ
 }
 } ঎඼औಘ

Slide 36

Slide 36 text

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 skus = []..add(sku);
 List list = await _client.querySkuDetails(
 skuType: SkuType.kSubs, skus: skus); await _client.launchBillingFlow(
 ɹɹɹɹBillingFlowParams(skuDetails: list[0]));
 } 
 @override
 void onPurchasesUpdated(
 ɹɹɹint responseCode, List purchases) {
 ɹ// ߪೖޙͷॲཧ
 }
 } ߪೖϑϩʔ΁

Slide 37

Slide 37 text

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 skus = []..add(sku);
 List list = await _client.querySkuDetails(
 skuType: SkuType.kSubs, skus: skus); await _client.launchBillingFlow(
 ɹɹɹɹBillingFlowParams(skuDetails: list[0]));
 } 
 @override
 void onPurchasesUpdated(
 ɹɹɹint responseCode, List purchases) {
 ɹ// ߪೖޙͷॲཧ
 }
 } ߪೖޙͷॲཧ

Slide 38

Slide 38 text

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 transactions) async {
 // ߪೖޙͷॲཧ }
 }
 }

Slide 39

Slide 39 text

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 transactions) async {
 // ߪೖޙͷॲཧ }
 }
 } ঎඼औಘ

Slide 40

Slide 40 text

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 transactions) async {
 // ߪೖޙͷॲཧ }
 }
 } ߪೖ(ߪೖϑϩʔ΁)

Slide 41

Slide 41 text

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 transactions) async {
 // ߪೖޙͷॲཧ }
 }
 } ߪೖޙͷॲཧ

Slide 42

Slide 42 text

23 3. iap (Pros/Cons) • ֤ϓϥοτϑΥʔϜͷΞϓϦ಺՝ۚϥΠϒϥϦͱ
 ΄΅ಉ͡ΠϯλʔϑΣʔεͳͷͰɺωΠςΟϒʹೃ છΈͷ͋Δํ͸ɺ෼͔Γ΍͍͔͢΋ • iOSͱAndroidͰݺͼग़͠ํΛม͑Δඞཁ͕͋Δͷ Ͱɺ࣮૷ͷ࢓ํʹΑͬͯ͸ͪ͝Όͪ͝Όͦ͠͏ Pros Cons

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

25 4. flutter_payments (How to use) !

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

25 4. flutter_payments (How to use) This repository has been archived by the owner. It is now read-only ! ͦΕͰ΋ࢼͯ͠ΈΑ͏ͱࢥͬͯflutter packges getͨ͠Βɺ failͨ͠ͷͰɺࢼ͢ͷΛఘΊ·ͨ͠ɾɾɾ

Slide 47

Slide 47 text

26 4. flutter_payments (Pros/Cons) • ωΠςΟϒίʔυ͕ɺkotlinɾswiftͰॻ͔Ε͍ͯΔͷ Ͱϝϯς͠΍ͦ͢͏ • ϨϙδτϦ͕ΞʔΧΠϒ͞ΕͯΔͷͰɺୈࡾऀ͕ϝ ϯςͰ͖ͳ͍ Pros Cons

Slide 48

Slide 48 text

27 5. in_app_purchase (Basic) • GoogleެࣜͷϓϥάΠϯ • ·ͩ४උத https://github.com/flutter/flutter/issues/9591#issuecomment-467678342 • ϚΠϧετʔϯ͕4݄ʹઃఆ͞Ε͍ͯΔ

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

29 5. in_app_purchase (Pros/Cons) • GoogleެࣜͷϓϥάΠϯͳͷͰ҆৺ײ͕͋Δ • ࢖͏ଆ͕ϓϥοτϑΥʔϜΛ͋·Γҙࣝ͠ͳͯ͘ྑ ͦ͞͏ͳ࡞Γʹͳ͍ͬͯͦ͏Ͱ͢ɻ • ·ͩ४උத͕ͩɺࠓޙʹظ଴ Pros Cons

Slide 52

Slide 52 text

·ͱΊ

Slide 53

Slide 53 text

31 ·ͱΊ • AndroidɾiOSͱ΋ʹఆظߪೖɺఆظߪೖҎ֎͕Մೳ ͳͷ͸flutter_inapp_purchase(1)ͱiap(3) • flutter_billing(2)͸iOSͷఆظߪೖ͕Ͱ͖·ͤΜ͕ɺ ఆظߪೖҎ֎͸྆OSՄೳ • flutter_payments(4)͸ΞʔΧΠϒ͞ΕͯΔ • Googleެࣜͷin_app_purchase(5)͸·ͩ४උதͩ ͕ɺϚΠϧετʔϯ͕ઃఆ͞Ε͍ͯΔͷͰ͍ۙ಺ʹ ࢖͑ΔΑ͏ʹͳΓͦ͏

Slide 54

Slide 54 text

Happy Fluttering!