Skip to content

Commit

Permalink
Add iOS purchase without finishTransaction
Browse files Browse the repository at this point in the history
  • Loading branch information
JJMoon committed Apr 28, 2018
1 parent 5275f65 commit edfbd12
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 4 deletions.
27 changes: 26 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,29 @@ export const buyProduct = (sku) => Platform.select({
android: () => RNIapModule.buyItemByType(ANDROID_ITEM_TYPE_IAP, sku)
})();


/**
* Buy a product without transaction finish (iOS only)
* Call finishTransaction after receipt validation process.
* @param {string} sku The product's sku/ID
* @returns {Promise<ProductPurchase>}
*/
export const buyProductWithoutFinishTransaction = (sku) => Platform.select({
ios: () => RNIapIos.buyProductWithoutAutoConfirm(sku),
android: () => RNIapModule.buyItemByType(ANDROID_ITEM_TYPE_IAP, sku)
})();

/**
* Finish Transaction (iOS only)
* Explicitly call transaction finish
* @param {string} sku The product's sku/ID
* @returns {Promise<ProductPurchase>}
*/
export const finishTransaction = (sku) => Platform.select({
ios: () => RNIapIos.finishTransaction(),
android: () => console.log('android doesn\'t need finish Transaction. Void function')
})();

/**
* Consume a product (on Android.) No-op on iOS.
* @param {string} token The product's token (on Android)
Expand Down Expand Up @@ -201,7 +224,9 @@ export default {
getAvailablePurchases,
buySubscription,
buyProduct,
buyProductWithoutFinishTransaction,
finishTransaction,
consumePurchase,
validateReceiptIos,
validateReceiptAndroid,
validateReceiptAndroid
};
40 changes: 37 additions & 3 deletions ios/RNIapIos.m
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
//////////////////////////////////////////////////// _//////////_ // Private Members
@interface RNIapIos() {
NSMutableDictionary *promisesByKey;
BOOL autoReceiptConform;
SKPaymentTransaction *currentTransaction;
}
@end

Expand Down Expand Up @@ -90,14 +92,35 @@ -(void)rejectPromisesForKey:(NSString*)key code:(NSString*)code message:(NSStrin
RCT_EXPORT_METHOD(buyProduct:(NSString*)sku
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
autoReceiptConform = true;
SKProduct *product;
for (SKProduct *p in validProducts) {
if([sku isEqualToString:p.productIdentifier]) {
product = p;
break;
}
}
if (product) {
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
[self addPromiseForKey:RCTKeyForInstance(payment.productIdentifier) resolve:resolve reject:reject];
} else {
reject(@"E_DEVELOPER_ERROR", @"Invalid product ID.", nil);
}
}

RCT_EXPORT_METHOD(buyProductWithoutAutoConfirm:(NSString*)sku
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
NSLog(@"\n\n\n buyProductWithoutAutoConfirm \n\n.");
autoReceiptConform = false;
SKProduct *product;
for (SKProduct *p in validProducts) {
if([sku isEqualToString:p.productIdentifier]) {
product = p;
break;
}
}
if (product) {
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
Expand All @@ -107,6 +130,14 @@ -(void)rejectPromisesForKey:(NSString*)key code:(NSString*)code message:(NSStrin
}
}

RCT_EXPORT_METHOD(finishTransaction) {
NSLog(@"\n\n\n finish Transaction \n\n.");
if (currentTransaction) {
[[SKPaymentQueue defaultQueue] finishTransaction:currentTransaction];
}
currentTransaction = nil;
}

#pragma mark ===== StoreKit Delegate

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
Expand Down Expand Up @@ -168,11 +199,14 @@ -(void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWi
}

-(void)purchaseProcess:(SKPaymentTransaction *)transaction {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
if (autoReceiptConform) {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
currentTransaction = nil;
} else {
currentTransaction = transaction;
}
NSURL *receiptUrl = [[NSBundle mainBundle] appStoreReceiptURL];

NSDictionary* purchase = [self getPurchaseData:transaction];

[self resolvePromisesForKey:RCTKeyForInstance(transaction.payment.productIdentifier) value:purchase];
}

Expand Down

0 comments on commit edfbd12

Please sign in to comment.