4.3.3
0.59.10
ã¢ã³ããã€ã
DEFERREDã¢ãŒãã§ãµãã¹ã¯ãªãã·ã§ã³ãã¢ããã°ã¬ãŒã/ããŠã³ã°ã¬ãŒãããå Žåãè³Œå ¥æŽæ°ãªã¹ããŒãæ°ãããã©ã³ã¶ã¯ã·ã§ã³ã¬ã·ãŒãã§åŒã³åºãå¿ èŠããããŸãã
è³Œå ¥ãšã©ãŒãªã¹ããŒã次ã®ãšã©ãŒã§åŒã³åºãããŸãïŒ
{ã¡ãã»ãŒãžïŒ '賌å
¥ã¯nullã§ãã'ã
ã³ãŒãïŒ 'OK'ã
debugMessageïŒ ''ã
responseCodeïŒ0}
å®ããã€ã¹-ãµã³ãããã¯ã¹
1. RNIap.requestSubscriptionïŒskuïŒã§ãµãã¹ã¯ãªãã·ã§ã³ãè³Œå ¥ããŸããããã¯æ£ããæ©èœããŸãã
2. RNIap.requestSubscriptionïŒnewSkuãfalseãskuã4ïŒã䜿çšããŠãµãã¹ã¯ãªãã·ã§ã³ãã¢ããã°ã¬ãŒããŸãã¯ããŠã³ã°ã¬ãŒãããŸãã ïŒ4ã¯é 延æåã¢ãŒãã§ãïŒGoogle Playã®è«æ±ãã€ã¢ãã°ã«ã¯ããµãã¹ã¯ãªãã·ã§ã³ãã©ã³ãæ£åžžã«å€æŽãããããšã衚瀺ãããGooglePlayãããã®ããšã«é¢ããéç¥ã¡ãŒã«ãå±ããŸãã ãã ãããšã©ãŒãªã¹ããŒã¯äžèšã®ãšã©ãŒã§åŒã³åºãããŸãã
3. RNIap.requestSubscriptionïŒnewSkuãfalseãskuã4ïŒãå床åŒã³åºããšãGoogle Playã®è«æ±ãã€ã¢ãã°ã«ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ãå€æŽã§ããªããšè¡šç€ºããã次ã®ãšã©ãŒã§ãšã©ãŒãªã¹ããŒãåŒã³åºãããŸãã
{ã¡ãã»ãŒãžïŒ 'Googleã¯ãæ¯æãã«é¢é£ããåé¡ãããããšã瀺ããŠããŸãã'ã
ã³ãŒãïŒ 'E_DEVELOPER_ERROR'ã
debugMessageïŒ ''ã
responseCodeïŒ5}
ãã ããGoogle Playã®è«æ±ãã€ã¢ãã°ã«ã泚æãåŠçäžã§ãããååããŸããªãé éããããšè¡šç€ºãããããšããããŸãããšã©ãŒãªã¹ããŒãåŒã³åºããã次ã®ãšã©ãŒãçºçããŸãã
{ã¡ãã»ãŒãžïŒ 'ããªãã¯ãã§ã«ãã®ã¢ã€ãã ãææããŠããŸãã'ã
ã³ãŒãïŒ 'E_ALREADY_OWNED'ã
debugMessageïŒ ''ã
responseCodeïŒ7}
ããã¯ãã¹ããã2ã®ãã©ã³ã¶ã¯ã·ã§ã³ã確èªãããã®ãåŸ ã£ãŠããããã ãšæããŸãã ãã ããæé 2ã§ã¯é åæžãè¿éãããªãããã確èªã§ããŸããã
ãµãã¹ã¯ãªãã·ã§ã³ãã¢ããã°ã¬ãŒã/ããŠã³ã°ã¬ãŒãããåŸã getAvailablePurchases
ã«é»è©±ããŠã¿ãŠãã ããã
ããã¥ã¡ã³ãThe list of Purchase objects in onPurchasesUpdated() does not contain paused subscriptions.
åç
§ããŠãã ããã
ãããã圹ã«ç«ãŠã°å¹žãã§ãã ä»ã®è£å€ãè°è«ã¯ãæ°è»œã«ã©ããã
ãµãã¹ã¯ãªãã·ã§ã³ãã¢ããã°ã¬ãŒã/ããŠã³ã°ã¬ãŒãããåŸã«getAvailablePurchasesïŒïŒãè©ŠããŸããããæ®å¿µãªãããå ã®è³Œå ¥ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¬ã·ãŒãã®ã¿ãè¿ãããé åã«å«ãŸããŠããŸãã
RNIap v2.3.19ããã³v2.5.5ã¯æ£ããæ©èœãããµãã¹ã¯ãªãã·ã§ã³ãã¢ããã°ã¬ãŒã/ããŠã³ã°ã¬ãŒããããšãbuySubscriptionïŒïŒã¯æ°ããã¬ã·ãŒããè¿ããŸãã ããããå¯èœã§ããã°ãããåªããã€ãã³ãããŒã¹ã®ã¢ãã«ãæã€v3ãŸãã¯v4ã«ã¢ããã°ã¬ãŒãããããšæããŸãã
ããã¯ãAndroidãµãã¹ã¯ãªãã·ã§ã³ã®ã¢ããã°ã¬ãŒã/ããŠã³ã°ã¬ãŒãã®ä»çµã¿ãšãã¢ããã°ã¬ãŒã/ããŠã³ã°ã¬ãŒãåŸã«æ°ããã¬ã·ãŒããå¿ èŠãªçç±ã説æãããªãã¡ã¬ã³ã¹ããã¥ã¡ã³ãã§ãã
@ howg0924ããã確èªããŠããã ãããããšãããããŸãã v2ãšçŸåšã®ããŒãžã§ã³ãšã®éããæ¯èŒãããã®åé¡ãä¿®æ£ããæ¹æ³ã確èªããããšæããŸãã
é±æ«ã«ïŒ893ã§ã³ãŒãã調ã¹ãŸãã
æ°ããã¢ããããŒãã¯4.4.0
ãŸãã
[email protected]
ããŒãžã§ã³ããã¹ãããŠããã ããŸãããã
@hyochan 4.4.0-rc.1ãè©ŠããŸããããç¶æ³ã¯åãã§ãã
RNIap.requestSubscriptionïŒoldSkuãfalseãnewSku 4ïŒãåŒã³åºããŠã¢ããã°ã¬ãŒã/ããŠã³ã°ã¬ãŒããçµäºãããšã次ã®ãšã©ãŒã§ãšã©ãŒãªã¹ããŒãåŒã³åºãããŸãã
{ã¡ãã»ãŒãžïŒ '賌å
¥ã¯nullã§ãã'ã
ã³ãŒãïŒ 'OK'ã
debugMessageïŒ ''ã
responseCodeïŒ0}
ãŸããgetAvailablePurchasesïŒïŒã«ã¯å€ãã¬ã·ãŒãã®ã¿ãå«ãŸããŠããŸãã
@ howg0924 android
ããããã°ããæ¹æ³ãç¥ã£ãŠããå Žåã¯ã Log.d
ãããã€ãå
¥ããŠãã¹ããã buyItemByType
if
æ¡ä»¶ã«åæ Œãããã©ããã確èªããŠãã ããã ããã¯ããªãã«ãšã£ãŠå¯èœã§ããããïŒ ããããã©ã®ããã«å®è¡ãããŠããããèŠããã§ãã
@ howg0924ããåŸ ã£ãŠãïŒ åé¡ãèŠã€ãã£ãã®ã§ãããã«è¿ä¿¡ãããŠãã ããã
@ howg0924 4.4.0-rc.2
ãè©ŠããŠããã ããŸãããïŒ ä»åã¯ããŸããããšæããŸãã
@hyochan 4.4.0-rc.2ãã«ãã倱æããŸããïŒ
RNIapModule.java:436: error: incompatible types: SkuDetails cannot be converted to String:
builder.setOldSku(selectedOldSku);
^
@hyochan 4.4.0-rc.1ã®buyItemByTypeïŒïŒãç£èŠããŸããã ã¢ããã°ã¬ãŒã/ããŠã³ã°ã¬ãŒããããšã次ã®ããã«å®è¡ãããŸããã
builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.DEFERRED);
ãããŠãŸãå®è¡ãããïŒ
BillingResult billingResult = billingClient.launchBillingFlow(activity, flowParams);
ãããŒ/ããŒã¿ãç£èŠ/ãã³ãããŸããïŒ
ïŒèª€è§£ã«ããåé€ïŒ
@ howg0924 env
ãããã°ãããŸããããªãã£ããããééããŠããŸãç³ãèš³ãããŸããã ããã4.4.0-rc.3
å
ã«æ»ããŸããã ããªãã®ã³ãŒãã¯æãéèŠãªbuilder.setOldSku(oldSku)
ãå®è¡ããŠããªãããã§ãã
2.5.5ãšæ¯èŒããåŸã2.5.5ãåŒã³åºããªãããšãããããŸãã
builder.setReplaceSkusProrationModeïŒBillingFlowParams.ProrationMode.DEFERREDïŒ;
DEFERREDã¢ãŒãã䜿çšããå Žåã
ãããã£ãŠã4.4.0-rc.1ã§ãã®è¡ãåé€ããããšãããšãæ©èœããŸãã ããããç§ã¯ç¥ããŸããïŒ
1.çŸåšåãçµãã§ããæåã¢ãŒãã
2.setReplaceSkusProrationModeïŒïŒã§DEFERREDã¢ãŒãã«èšå®ããŠãæ©èœããªãçç±
if (prorationMode != null && prorationMode != -1) {
if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE) {
builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE);
if (type.equals(BillingClient.SkuType.SUBS) == false) {
String debugMessage = "IMMEDIATE_AND_CHARGE_PRORATED_PRICE for proration mode only works in subscription purchase.";
WritableMap error = Arguments.createMap();
error.putString("debugMessage", debugMessage);
error.putString("code", PROMISE_BUY_ITEM);
error.putString("message", debugMessage);
sendEvent(reactContext, "purchase-error", error);
promise.reject(PROMISE_BUY_ITEM, debugMessage);
return;
}
} else if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_WITHOUT_PRORATION) {
builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITHOUT_PRORATION);
} else if (prorationMode == BillingFlowParams.ProrationMode.DEFERRED) {
builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.DEFERRED);
} else if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION) {
builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION);
} else {
builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY);
}
}
çŸåšãäžèšã®ããã«ProrationMode
ãåŒãç¶ãã§ããŸãã ã€ãŸãã DEFERRED
åé€ãããšã auto renew subscription
ãã§ãããšããããšã§ããïŒ
ã€ãŸããã³ãŒãã次ã®ããã«å€æŽããå Žåã§ãã
if (prorationMode != null && prorationMode != -1) {
if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE) {
builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE);
if (type.equals(BillingClient.SkuType.SUBS) == false) {
String debugMessage = "IMMEDIATE_AND_CHARGE_PRORATED_PRICE for proration mode only works in subscription purchase.";
WritableMap error = Arguments.createMap();
error.putString("debugMessage", debugMessage);
error.putString("code", PROMISE_BUY_ITEM);
error.putString("message", debugMessage);
sendEvent(reactContext, "purchase-error", error);
promise.reject(PROMISE_BUY_ITEM, debugMessage);
return;
}
} else if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_WITHOUT_PRORATION) {
builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITHOUT_PRORATION);
} else if (prorationMode == BillingFlowParams.ProrationMode.DEFERRED) {
// comment following line
// builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.DEFERRED);
} else if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION) {
builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITH_TIME_PRORATION);
} else {
builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.UNKNOWN_SUBSCRIPTION_UPGRADE_DOWNGRADE_POLICY);
}
}
次ã«ãRNIap.requestSubscriptionïŒnewSkuãfalseãskuã4 / *é 延ã¢ãŒã* /ïŒã䜿çšããŠããµãã¹ã¯ãªãã·ã§ã³ãã¢ããã°ã¬ãŒã/ããŠã³ã°ã¬ãŒãã§ããŸãã v2.5.5ã®ããã«builder.setReplaceSkusProrationModeïŒïŒãå®è¡ãããªããããå®éã«ã©ã®æåã¢ãŒãã§åäœãããã¯ããããŸãããã
次ã®ã³ãŒãã¯v2.5.5ããã®ãã®ã§ãã
if (type.equals(BillingClient.SkuType.SUBS) && oldSku != null && !oldSku.isEmpty()) {
// Subscription upgrade/downgrade
if (prorationMode != null && prorationMode != 0) {
builder.setOldSku(oldSku);
if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE) {
builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_AND_CHARGE_PRORATED_PRICE);
} else if (prorationMode == BillingFlowParams.ProrationMode.IMMEDIATE_WITHOUT_PRORATION) {
builder.setReplaceSkusProrationMode(BillingFlowParams.ProrationMode.IMMEDIATE_WITHOUT_PRORATION);
} else {
builder.addOldSku(oldSku);
}
} else {
builder.addOldSku(oldSku);
}
}
@ howg0924çŸåšã®ãã¹ã¿ãŒãã©ã³ãã§ãã4.3.4
DEFFERED
ãèšå®ããŠããªãã£ããããããã¯éåžžã«å¥åŠã§ãã ãã®ã³ãŒãã4.4.0+
è¿œå ããŸããã
çç±ã¯éãã®ã§ã¯ãªãããšæããŸãã ä»ã«äœããã¥ãŒã¹ããããŸãããããŸãæ¥ãŠããã ããã°å¹žãã§ãã
é¢é£ïŒ391ïŒ555
OKããã£ãšè©ŠããŠå ±åããŸãã
é¢é£ïŒ707
@hyochan 4.4.0-rc.1ã§ããã«ãã¹ãããåŸïŒ
IMMEDIATE_WITH_TIME_PRORATION =>åäœããŸã
IMMEDIATE_AND_CHARGE_PRORATED_PRICE =>åäœããŸã
IMMEDIATE_WITHOUT_PRORATION =>åäœããŸã
延æ=>æ©èœããŸããïŒçç±ã¯ããããŸããïŒ
çŸåšã®ãã¹ã¿ãŒãã©ã³ãã§ãã4.3.4ã«DEFFEREDãèšå®ããŠããªãã£ããããããã¯éåžžã«å¥åŠã§ãã ãã®ã³ãŒãã¯4.4.0以éã§è¿œå ããŸããã
ããã¯ã4.3.0ã®
if (prorationMode != 0 && prorationMode != -1) {
builder.setReplaceSkusProrationMode(prorationMode);
}
ãã ããäžèšã®ã³ãŒãã¯2.3.19ããã³2.5.5ã«ã¯ååšããŸããã ãããã£ãŠã2.3.19ãš2.5.5ã§RNIap.requestSubscriptionïŒnewSkuãfalseãskuã4 / * DEFERRED * /ïŒãåŒã³åºãããšãã以åã¯æ©èœãããšæã£ãŠããŸããããå®éã«ã¯ããã©ã«ãã®IMMEDIATE_WITH_TIME_PRORATIONã¢ãŒãã§æ©èœããããšã«æ°ä»ããŸããã
ããŠã
åãåé¡ãçºçããŸãããåäœãç°ãªããŸãã
requestSubscription(newSku, false, oldSku, 4)
ãåŒã³åºããšããšã©ãŒã³ãŒãOK
ãšç©ºã®ãšã©ãŒã¡ãã»ãŒãžã§ãšã©ãŒãã¹ããŒãããŸãã Google PlayåŽã§ã®æ¯æãã¯äºæ³ã©ããã§ãïŒå»¶æãããŸãïŒã 次ã®ãµãã¹ã¯ãªãã·ã§ã³æéãçºçãããšãã¢ããªã®èµ·åæã«purchaseUpdatedListener
ã€ãã³ããçºçããŸããã賌å
¥ã確èªã§ããŸããïŒ finishTransaction()
ãåŒã³åºãããšã«ããïŒã finishTransaction()
ã¯DEVELOPER_ERROR
ãšã©ãŒãåºããŸãã
ããŒãžã§ã³4.4.0
ãš4.3.4
äž¡æ¹ã§çºçããŸãã
ããã«ã¡ã¯@ hyochan ã httpsïŒ//github.com/dooboolab/react-native-iap/pull/893ã§ããã解決æžã¿ãšããŠããŒã¯ããã®ãèŠãŸããããreact-native-iapãææ°ããŒãžã§ã³ã«æŽæ°ããŸãããããŸã ããã§ã¯ãããŸããä¿®ç¹ã ããã§ããªã¹ããŒerror {"code": "OK", "debugMessage": "", "message": "purchases are null.", "responseCode": 0}
ãšã©ãŒãçºçããéåžžã©ããYou updated your subscription purchase
é»åã¡ãŒã«ãåä¿¡ããŸããã ã ããç§ã®è³ªåã¯ãDEFERREDã¢ãŒãã®æ£ãã解決çã¯äœã§ããïŒ
ååããã®åé¡ãèŠã€ããŸããã å¥åŠãªããšã«ã deferred
ã¢ãŒãã§ã®ã¿æ©èœããŸããã ããã調æ»ããå¿
èŠããããŸãã
ããã«ã¡ã¯@ howg0924 ãããªãã¯ãã®åé¡ã®è§£æ±ºçã
@ nenjamin2405ãããããŸã ããã©ã«ãã®IMMEDIATE_WITH_TIME_PRORATIONã¢ãŒãã䜿çšããŠããŸããããããä¿®æ£ãããããšãæ¬åœã«æãã§ããŸãã
ããã«ã¡ã¯@hyochan ãããã«é¢ããæŽæ°ã¯ãããŸããïŒ ç§ã®ã¢ããªã®æ°æ©èœã¯ãã®åé¡ã§ç«ã¡åŸçããŠããŸãã ããã調æ»ããããã®ããªãã®åªåã«æ¬åœã«æè¬ããŸããããããšã
æªã ã«ã ç§ã¯ãã®åé¡ãæ€èšããæéããããŸããã§ããã
誰ãããã®åé¡ãåŠçããã®ã«åœ¹ç«ã€æ
å ±ãæäŸããŠãããããšãé¡ã£ãŠããŸãã
Google
ãŸãã¯StackOverflow
質åããŠããã®ã¹ã¬ããã§å
±æãããšéåžžã«åœ¹ç«ã€å ŽåããããŸãã
ãããæè¿ãã®åé¡ã«é¢ãã掻åã¯ãªãã£ãããã§ãã åé¡ã¯ä¿®æ£ãããŸãããããããšãã³ãã¥ããã£ã®æ³šæãå¿ èŠã§ããïŒ ãã以äžã®ã¢ã¯ãã£ããã£ãçºçããªãå Žåããã®åé¡ã¯è§£æ±ºãããå¯èœæ§ããããŸãã ãã®åé¡ã«ããã£ã¹ã«ãã·ã§ã³çšããŸãã¯ãè¯ãæåã®åé¡ããšããã©ãã«ãä»ããããšãã§ããŸããéãããŸãŸã«ããŠãããŸãã è²¢ç®ããŠããã ãããããšãããããŸãã
ç§ãã¡ã¯ãã®åé¡ãæ€èšããŠããŠãã³ãã¥ããã£ãšå ±æããããšæã£ãŠããŸãããããã¯ããã«ããäœäººãã®äººã ãå©ãããããããŸããã
ãã®åé¡ã¯ãAndroidã®åäœæ¹æ³ã§ãããé 延ãµãã¹ã¯ãªãã·ã§ã³çœ®æã§ã®è³Œå ¥ã®ç©ºã®ãªã¹ãã§åŒã³åºãããè³Œå ¥æŽæ°ãªã¹ããŒãåå ã§ãïŒããã§ãé 延眮æã¢ãŒãã«ã€ããŠ...ããåç §ããŠãã ããïŒ
ãµãã¹ã¯ãªãã·ã§ã³çœ®æã§purchases are null
ãšã©ãŒãçºçãããšãã«ãšã©ãŒãªã¹ããŒãåŒã³åºããããšãã«ç¢ºèªããä¿®æ£ãè¡ãããšã§ã react-native-iaphubã§ã®Androidé
延ãµãã¹ã¯ãªãã·ã§ã³çœ®æã®ãµããŒããè¿œå ããŸããã ïŒã³ããããåç
§ïŒ
ãã¡ãããã¬ã·ãŒããæ€èšŒããããã«ãµãŒããŒåŽã§ããã€ãã®å€æŽãè¡ãå¿
èŠããããŸããé
延ãµãã¹ã¯ãªãã·ã§ã³ãåŠçããå Žåã¯ãã¬ã·ãŒããæŽæ°ããã ãã§ã¯äžååã§ãã
ãµãã¹ã¯ãªãã·ã§ã³ã®çœ®ãæããçºçããããšãæ€åºããæ°ããããŒã¯ã³ãåŠçããã«ã¯ãAndroidã®ãªã¢ã«ã¿ã€ã éç¥ãå®è£
ããå¿
èŠããããŸãã
ãŸãã¯ããã¹ãŠãå®è¡ããŠããIAPHUBã䜿çšããããšãã§ããŸãð
ãã®åé¡ã解決ããèšç»ã¯ãããŸããïŒ
@iaphubãèšåããŠããããã«ãåé¡ã¯ãDEFERREDã¢ãŒãã䜿çšãããŠããå Žåã onPurchasesUpdated
ãpurchases
åŒæ°ãnull
ãšããŠåŒã³åºãããããšã§ãã
ã°ãŒã°ã«ããã¥ã¡ã³ãããïŒ
æ®ã眮ã亀æã¢ãŒãã®å Žåãã¢ããªã¯ãè³Œå ¥ã®ç©ºã®ãªã¹ããšãã¢ããã°ã¬ãŒããŸãã¯ããŠã³ã°ã¬ãŒããæåãããã©ããã®ã¹ããŒã¿ã¹ãå«ãPurchasesUpdatedListenerãžã®åŒã³åºããåãåããŸãã
ãããã£ãŠããã®ãªã¹ããŒå ã§ãã®ã±ãŒã¹ãåŠçããã ãã§ãã
ããããç§ã¯ãã®ç¶æ³ãåŠçããé©åãªæ¹æ³ãäœã§ãããã«ã€ããŠç¢ºä¿¡ããããŸããïŒ
undefined
çŽæã解決ããPURCHASE_DEFERRED
ã³ãŒãã§çŽæãæåŠããã©ãæããŸããïŒ
æãåèã«ãªãã³ã¡ã³ã
ãã®åé¡ã解決ããèšç»ã¯ãããŸããïŒ