3.3.9ïŒãã ãã3.0.0以åã§ããããçºçããŸãïŒ
0.59.9
iOSïŒAndroidã§ã¯ãã¹ããããŠããŸããïŒ
getAvailablePurchases
ãåŒã³åºããã³ã«åãé
å
æ¯ååãé
åé·
getAvailablePurchases
åŒã³åºããã³ã«ç°ãªãé
å
getAvailablePurchases
åŒã³åºããã³ã«ç°ãªãé
åã®é·ã
å®ããã€ã¹
ããã¯å€ãã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ã®ã¿è¡šç€ºããããšæããŸãããããã確èªããããšã¯ã§ããŸããã ç§ã®ãµã³ãããã¯ã¹ã¢ã«ãŠã³ãã«ã¯50以äžã®ãã©ã³ã¶ã¯ã·ã§ã³ããããŸãã
handleOnPressRestore = async () => {
return this.setState({ isLoadingRestorePurchases: true }, async () => {
try {
// Get the previous purchases of the current user
const purchases = await RNIap.getAvailablePurchases();
// Get the latest receipt from the purchases to validate
const { transactionReceipt, productId, transactionDate } = this.getLatestPurchase(purchases);
console.log(purchases.length, productId, transactionDate);
// Validate the receipt on our server
await this.props.validateSubscriptionReceipt(productId, transactionReceipt);
// The validation result is handled in componentDidUpdate
} catch (err) {
throw err;
} finally {
this.setState({ isLoadingRestorePurchases: false });
}
});
}
getLatestPurchase = (purchases: RNIap.ProductPurchase[]): RNIap.ProductPurchase => {
// First, sort the array, so the latest purchase is on top
// https://github.com/dooboolab/react-native-iap/issues/532#issuecomment-503174711
const sortedPurchases = purchases.sort((a, b) => b.transactionDate - a.transactionDate);
const purchase = sortedPurchases[0];
return purchase;
}
äžèšã®ã³ãŒãã§ã¯ããè³Œå ¥ã埩å ããæŒããšãæ¯åç°ãªããã°ã衚瀺ãããŸãã
ãè³Œå ¥ã埩å ãã6åæŒãããã®éã«çµæã衚瀺ããããŸã§åŸ ã¡ãŸãã
// purchases.length, productId, transactionDate
9 "com.app.sub" 1565182529000
21 "com.app.sub" 1565181329000
22 "com.app.sub" 1565183001000
42 "com.app.sub" 1565183001000
53 "com.app.sub" 1565182529000
55 "com.app.sub" 1565183001000
15 "com.app.sub" 1565182529000
é åã¯åžžã«åãã§ãããšæããŸãããïŒ ããã§äœãèµ·ãã£ãŠããã®ã§ããïŒ
getAvailablePurchases()
ã®çµæã¯ãå®è¡ãããã³ã«ç°ãªããŸã
ç§ããããèŠãŠããŸãã ããã«ã€ããŠæ¬åœã«å±éºãªããšã¯ãææ°ã®æå¹ãªã¬ã·ãŒããçµæã«å«ãŸããŠããªãå¯èœæ§ããããšããããšã§ãã
ãã®ã¢ãžã¥ãŒã«ã®ã³ãŒããèŠããšããã®ã¢ãžã¥ãŒã«ã¯restoreCompletedTransactions()
ãè¿ããã®ãäºå®äžééããŠããã ããªã®ã§ãæ£çŽãªãšããAppleåŽã®åé¡ã®ããã«èŠããŸãã
getPurchaseHistory()
ããµãã¹ã¯ãªãã·ã§ã³ã«äœ¿çšããã®ã«é©ãã代æ¿æ段ã§ãããã©ããçåã«æããŸãã ç§ã¯çŸåšãããã代æ¿æ段ãšããŠäœ¿çšããŠããŸããããã«ãããä¿¡é Œã§ããçµæãåŸãããŸãã ç§ã®ã¢ããªã«ã¯ä»ã«è³Œå
¥ã¯ãªãããµãã¹ã¯ãªãã·ã§ã³ã®ã¿ããããŸãã
ãã®ããã±ãŒãžã®iapããã¥ã¡ã³ãã«èšèŒãããŠããããã«ã getAvailablePurchases()
ã¯æ¶èåã«ã€ããŠè©±ããŸãã ãµãã¹ã¯ãªãã·ã§ã³ã¯ããæ¶èåããŸãã¯ãéæ¶èåãã®è£œåã§ã¯ãããŸããã ããã¯ãèªåæŽæ°å¯èœãªãµãã¹ã¯ãªãã·ã§ã³ããªã®ã§ã getPurchaseHistory()
ååã§ããïŒ
getPurchaseHistoryïŒïŒã§ãããŸããŸãªé
åã®é·ããåŸãããããšãããããŸããã ãªã¯ãšã¹ãã®é »åºŠã圱é¿ããããã§ãã çµå±ãããã¯ç§ãã¡ã«ãšã£ãŠå®éã«ã¯åé¡ã§ã¯ãªãããšãå€æããŸãããæ€èšŒã®ããã«ãã©ã³ã¶ã¯ã·ã§ã³ã®é åæžã®ãããããéä¿¡ããããšããã¹ãŠã®é åæžãAppleã«ãã£ãŠlatest_receipt_info
é
åã§è¿ãããŸãããããã¯ç§ãã¡ã«ãšã£ãŠéèŠãªããšã§ãã
åãåé¡ãçºçããŠããŸãïŒãµã³ãããã¯ã¹ã¢ãŒããšã©ãŒãã©ããã¯ããããŸããïŒã ãŸããå®éã®ããã€ã¹å ã§Apple IDãåãæ¿ãããšãå¥ã®ã¢ã«ãŠã³ãã§è¡ãããè³Œå ¥ãè¿ãããŸãã
äŸïŒ
1-ã¢ã«ãŠã³ã[email protected]ã§è³Œå
¥ããŸãã
2- AppleIDã
3-getAvailablePurchasesã¯ãtest @ test.comã¢ã«ãŠã³ãã§è¡ããã賌å
¥ã®transactionIdãè¿ããŸã
ç§ãèŠã€ãããã1ã€ã®åé¡ã¯ãããã€ã¹ã埩å
ãããšïŒåºè·æèšå®ã«ãªã»ããïŒã getPurchaseHistory()
ãšgetAvailablePurchases
äž¡æ¹ã®æ¹æ³ã§ã©ã³ãã ãªçµæãåŸãããããšã§ãã
è³Œå ¥ã埩å ããããã®Appleã®å¯Ÿå¿ã¯æ¬¡ã®ãšããã§ãã
"Users restore transactions to maintain access to content they've already purchased. For example, when they upgrade to a new phone, they don't lose all of the items they purchased on the old phone. Include some mechanism in your app to let the user restore their purchases, such as a Restore Purchases button."
@ ssg-lukeã以åã«èšã£ãããã«ã restoreCompletedTransactions
ã®ããŸããŸãªçµæã«é¢ããApple DeveloperForumsãããã¯ãèŠã€ããŸããã
https://forums.developer.apple.com/thread/115242
ãã¶ããããã¯é¢é£ããŠããŸãïŒ
ã¢ããªããŸã finishTransactionãåŒã³åºããŠããªããå€ãã®ãã©ã³ã¶ã¯ã·ã§ã³ãæã€1人ã®ãŠãŒã¶ãŒãåç §ããŠããããã§ãã
https://forums.developer.apple.com/thread/115242#thread -post-355444
åãããã€ã¹ã«ä»ã®ãµã³ãããã¯ã¹ã¢ã«ãŠã³ãããããŸãã ããã§ã¯ãåãããã€ã¹äžã§ã®ç°ãªãã¢ã«ãŠã³ãã®ãã©ã³ã¶ã¯ã·ã§ã³ãå°ç¡ãã«ããããå®äºãããŠããªãå¯èœæ§ããããŸããïŒ
ãã ãããã¹ãŠã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ã«ãŒããå®è¡ãããã¹ãŠã®ãã©ã³ã¶ã¯ã·ã§ã³ã§finishTransactionIOS
ãåŒã³åºããŸããã ããããããã¯ãããããªããããã getAvailablePurchases()
ä¿¡é Œã§ããåºåãããããããããŸãã
@fcandianiãçµéšããããšã説æããããšãã§ããŸãã
getPurchaseHistoryïŒïŒã§ãããŸããŸãªé åã®é·ããåŸãããããšãããããŸããã ãªã¯ãšã¹ãã®é »åºŠã圱é¿ããããã§ãã çµå±ãããã¯ç§ãã¡ã«ãšã£ãŠå®éã«ã¯åé¡ã§ã¯ãªãããšãå€æããŸãããæ€èšŒã®ããã«ãã©ã³ã¶ã¯ã·ã§ã³ã®é åæžã®ãããããéä¿¡ããããšããã¹ãŠã®é åæžã¯Appleã«ãã£ãŠlatest_receipt_infoé åã§è¿ãããŸããã
æ å ±@ ssg-lukeãããããšããç§ã¯åãããšãããã€ããã§ãã
ãŸãããã¹ãŠã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ã«ãŒããå®è¡ããŸããããfinishTransactionIOSã§ããããåé€ã§ããŸããã§ããã ç§ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯èªåæŽæ°ãµãã¹ã¯ãªãã·ã§ã³ã§ãã
ã»ãŒåãåãã ç§ã¯åé¡ãäœæããŠããŸããããä»ã®äººãåé¡ãšè§£æ±ºçãèŠã€ããã®ã«åœ¹ç«ã€ãã¹ãŠã®æ å ±ãããã«çœ®ãããšã«ããŸããã
3.5.9
0.60.5
iOS
ãŠãŒã¶ãŒãäžåºŠãµãã¹ã¯ã©ã€ããããšã getAvailablePurchases
ã¯1åã®è³Œå
¥ã®ã¿ãè¿ãå¿
èŠããããŸã
getAvailablePurchases
ã¯ãè€æ°ã®è³Œå
¥ãè¿ããŠããŸãã
æ°ãããµã³ãããã¯ã¹ã¢ã«ãŠã³ããæã€å®éã®ããã€ã¹ã
getAvailablePurchases
åŒã³åºãã purchaseUpdatedListener
ãåŒã³åºããã undefined
ã ããè¿ãRNIap.finishTransactionIOS(subscription.transactionId);
ãåŒã³åºããŸãïŒäºæ³ã©ããïŒgetAvailablePurchases
ã«é»è©±ãã 1åã®è³Œå
¥ãè¿ããŸãïŒäºæ³ã©ããïŒgetAvailablePurchases
åŒã³åºãããããããç°ãªãtransactionId
æã€2ã€ã®è³Œå
¥ãè¿ããŸãã{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571145019000
transactionId: "1000000579415509"
transactionReceipt: "MIIVnQYJKoZIhvcN..."
},
{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571144839000
transactionId: "1000000579416705"
transactionReceipt: "MIIVnQYJKoZIhvcN...."
}
getAvailablePurchases
åŒã³åºããšã 3ã€ã®è³Œå
¥ãè¿ããããããããç°ãªãtransactionId
ïŒåã®çµæãšåãã§ã¯ãããŸããïŒã{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571145739000
transactionId: "1000000579423546"
transactionReceipt: "MIIb1AYJKoZIhvcN..."
},{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571145019000
transactionId: "1000000579426352"
transactionReceipt: "MIIb1AYJKoZI..."
},{
originalTransactionDateIOS: 1571144840000
originalTransactionIdentifierIOS: "1000000579413333"
productId: "io.appmasters.lowcarb.development"
transactionDate: 1571144839000
transactionId: "1000000579426353"
transactionReceipt: "MIIb1AYJKoZIhvcN..."
}
getAvailablePurchases
åŒã³åºãããããããç°ãªãtransactionId
æã€4ã€ã®è³Œå
¥ãè¿ããŸãïŒåã®çµæãšåãã§ã¯ãããŸããïŒ...ç§ãããã¥ã¡ã³ãã§èªãã ããšãAndroidã§èµ·ãã£ãããšãããããã¯æ£ããåäœã§ã¯ãªãããã§ãã
ç§ã¯ã©ããªå©ãã«ãæè¬ããŸãã
getAvaialblePurchasesïŒïŒã¯ããµã³ãããã¯ã¹ãã¹ãã¢ã«ãŠã³ãã§150以äžã®çµæãè¿ããŸãã getAvailablePurchasesïŒïŒããŸã£ãã䜿çšãããæåŸã®è³Œå
¥ãããã€ã¹ãšãµãŒããŒã«ä¿åããããšã«ããŸããã ã¢ããªãåé€ããããããŠãŒã¶ãŒãæ°ããé»è©±ã«ç§»åããå Žåã§ãããµãŒããŒã§æåŸã«è³Œå
¥ããã®ã¯ãäŒç€Ÿã®ãŠãŒã¶ãŒIDãšãã©ãããã©ãŒã ïŒiOSãŸãã¯AndroidïŒã«é¢é£ä»ããããŠããŸãã getAvailablePurchasesïŒïŒãåŒã³åºãã®ã«1åè¿ãããããå Žåã«ãã£ãŠã¯ãããåŒã³åºããŠãè€æ°ã®è³Œå
¥ã埩å
ããããšãã賌å
¥æŽæ°ãªã¹ããŒãããªã¬ãŒããŸãã ãããŒã次ã®ããã«å€æŽããŸããã
1ïŒãŠãŒã¶ãŒãããã€ã¹ã«ãã°ã€ã³ãããšãïŒ
aïŒãŠãŒã¶ãŒãšãã©ãããã©ãŒã ã®ãµãŒããŒã§æå¹ãªæåŸã®è³Œå
¥ããããã©ããã確èªããŸãã
bïŒãµãŒããŒã«ã¬ã³ãŒãããªãå Žåã¯ãDBã«ããŒã«ã«ã«ä¿åããã賌å
¥ããããã©ããã確èªããŸã
cïŒäœããªãããæéåãã®å Žåã¯ããµãã¹ã¯ãªãã·ã§ã³ãã¥ãŒã衚瀺ããŸãã
æåã¯getAvailablePurchasesïŒïŒãåŒã³åºããŠãæåŸã®è³Œå
¥ããŸã æå¹ãã©ããã確èªããããšããŠããŸããã ãããä»ã®äººã«åœ¹ç«ã€ãã©ããã¯ããããŸããããããã§åé¡ãçºçããããšã¯ãããããŸããã ç§ãã¡ã¯åå¿59ã«ãããããã¯ç§ãã¡ã察åŠããªããã°ãªããªããã1ã€ã®çã¿ã§ãã
@ramakulaãšããŠãŒã¶ãŒããµãã¹ã¯ãªãã·ã§ã³ããã£ã³ã»ã«ããå Žåã¯ã©ããªããŸããïŒ
ããªããèšã£ãããã«ãããªãã¯çµäºæ¥ãŸã§ããªãã®ããŒã¿ããŒã¹ã«ãµãã¹ã¯ãªãã·ã§ã³ãä¿æããããè³Œå ¥ã§ããªããã®ããèŠããã§ãããã
ãããæè¿ãã®åé¡ã«é¢ãã掻åã¯ãªãã£ãããã§ãã åé¡ã¯ä¿®æ£ãããŸãããããããšãã³ãã¥ããã£ã®æ³šæãå¿ èŠã§ããïŒ ãã以äžã®ã¢ã¯ãã£ããã£ãçºçããªãå Žåããã®åé¡ã¯è§£æ±ºãããå¯èœæ§ããããŸãã ãã®åé¡ã«ããã£ã¹ã«ãã·ã§ã³çšããŸãã¯ãè¯ãæåã®åé¡ããšããã©ãã«ãä»ããããšãã§ããŸããéãããŸãŸã«ããŠãããŸãã è²¢ç®ããŠããã ãããããšãããããŸãã
é·æé䜿çšãããªãã£ãåŸããã®åé¡ã解決ããŸãã ãã®åé¡ãææ°ãªãªãŒã¹ã§ãåŒãç¶ãçºçããå Žåã¯ãææ°ã®æ å ±ã䜿çšããŠæ°ããåé¡ãäœæããŠãã ããã
getAvaialblePurchasesïŒïŒã¯ããµã³ãããã¯ã¹ãã¹ãã¢ã«ãŠã³ãã§150以äžã®çµæãè¿ããŸãã getAvailablePurchasesïŒïŒããŸã£ãã䜿çšãããæåŸã®è³Œå ¥ãããã€ã¹ãšãµãŒããŒã«ä¿åããããšã«ããŸããã ã¢ããªãåé€ããããããŠãŒã¶ãŒãæ°ããé»è©±ã«ç§»åããå Žåã§ãããµãŒããŒã§æåŸã«è³Œå ¥ããã®ã¯ãäŒç€Ÿã®ãŠãŒã¶ãŒIDãšãã©ãããã©ãŒã ïŒiOSãŸãã¯AndroidïŒã«é¢é£ä»ããããŠããŸãã getAvailablePurchasesïŒïŒãåŒã³åºãã®ã«1åè¿ãããããå Žåã«ãã£ãŠã¯ãããåŒã³åºããŠãè€æ°ã®è³Œå ¥ã埩å ããããšããè³Œå ¥æŽæ°ãªã¹ããŒãããªã¬ãŒããŸãã ãããŒã次ã®ããã«å€æŽããŸããã
- ãŠãŒã¶ãŒãããã€ã¹ã«ãã°ã€ã³ãããšãïŒ
aïŒãŠãŒã¶ãŒãšãã©ãããã©ãŒã ã®ãµãŒããŒã§æå¹ãªæåŸã®è³Œå ¥ããããã©ããã確èªããŸãã
bïŒãµãŒããŒã«ã¬ã³ãŒãããªãå Žåã¯ãDBã«ããŒã«ã«ã«ä¿åãããè³Œå ¥ããããã©ããã確èªããŸã
cïŒäœããªãããæéåãã®å Žåã¯ããµãã¹ã¯ãªãã·ã§ã³ãã¥ãŒã衚瀺ããŸãã
æåã¯getAvailablePurchasesïŒïŒãåŒã³åºããŠãæåŸã®è³Œå ¥ããŸã æå¹ãã©ããã確èªããããšããŠããŸããã ãããä»ã®äººã«åœ¹ç«ã€ãã©ããã¯ããããŸããããããã§åé¡ãçºçããããšã¯ãããããŸããã ç§ãã¡ã¯åå¿59ã«ãããããã¯ç§ãã¡ã察åŠããªããã°ãªããªããã1ã€ã®çã¿ã§ãã
é åæžããææ°ã®è³Œå ¥åãå ¥æã§ãããšæããŸãã exclude-old-transactionsïŒtrueã䜿çšããŠãŠãŒã¶ãŒã®åä¿¡ã確èªããããšã«ãããææ°ã®ãµãã¹ã¯ãªãã·ã§ã³æ å ±ãååŸã§ããŸãïŒèªåæŽæ°å¯èœãªã¿ã€ãã®å Žåã®ã¿ïŒã ãã®æ¹æ³ã䜿çšããŠãèªåæŽæ°å¯èœãªãµãã¹ã¯ãªãã·ã§ã³ã®è³Œå ¥ã埩å ã§ãããšæããŸãã ãããããããçæ³çãªæ¹æ³ãã©ããã¯ããããŸããã
æãåèã«ãªãã³ã¡ã³ã
ãŸãããã¹ãŠã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ã«ãŒããå®è¡ããŸããããfinishTransactionIOSã§ããããåé€ã§ããŸããã§ããã ç§ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯èªåæŽæ°ãµãã¹ã¯ãªãã·ã§ã³ã§ãã