Skip to content

Upgraded from upstream #1

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 37 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
eb50007
add info of how to do monthly subscription with this package (#56)
sibelius Dec 23, 2016
e81612f
Add MIT license to package.json (#59)
andrewn Jan 15, 2017
33bdadd
Update iOS headers for RN 0.40 (#61)
smkhalsa Jan 18, 2017
dd47930
5.0.0
chirag04 Jan 18, 2017
c8fe1b7
add note about breaking change in rn 40.
chirag04 Jan 18, 2017
940ff3d
Expose transaction receipt (#58)
pennersr Jan 30, 2017
5254e39
5.1.0
chirag04 Jan 30, 2017
0424a49
Update Readme.md (#68)
martnu Feb 16, 2017
59a1d5e
Expose original transaction date (#69)
appden Feb 18, 2017
84b3719
5.2.0
chirag04 Mar 7, 2017
c4b080e
Built out restorePurchase example a little more. (#42)
joshuapinter Mar 15, 2017
00e5fa2
Add podspec (#76)
chrisbianca Mar 28, 2017
65a9290
fix code formatting (#77)
christiangenco Mar 29, 2017
23b8c92
check original transaction (#78)
chirag04 Mar 29, 2017
2b290af
5.2.1
chirag04 Mar 29, 2017
6a1ff08
mutable dict
chirag04 Mar 29, 2017
f951a0a
5.2.2
chirag04 Mar 29, 2017
00130c7
NSMutableDictionary
chirag04 Mar 29, 2017
c1ba12c
5.2.3
chirag04 Mar 29, 2017
022de31
add information about in-app-purchase free trial period (#83)
kawashimaken Apr 21, 2017
10dbc0f
Added canMakePurhases (#90)
Johan-dutoit May 23, 2017
31c4623
5.3.0
chirag04 May 23, 2017
d534b11
docs: correct canMakePurchases -> canMakePayments (#94)
Gaafar Jun 14, 2017
60e0479
Update Readme.md (#95)
skylerfenn Jun 14, 2017
c6cdf6e
Clarify API responses (#97)
grifotv Jun 22, 2017
306fce2
detecting loadProducts network errors (#99)
BodySplash Jun 26, 2017
3d6e4db
5.4.0
chirag04 Jun 26, 2017
25692d9
Update Readme.md (#100)
Jul 4, 2017
d52ae12
Add user cancelled error for restore purchase (#45)
cbrevik Jul 14, 2017
74289e7
5.5.0
chirag04 Jul 14, 2017
54ff695
Typo (#105)
codler Jul 16, 2017
f922bb7
Merge branch 'master' of https://github.com/chirag04/react-native-in-…
brunolemos Jul 21, 2017
97a8ddd
Implement purchaseProductForUser and restorePurchasesForUser methods …
RalfNieuwenhuizen Aug 24, 2017
08e18ea
5.6.0
chirag04 Aug 24, 2017
6bf387b
Allow products to be fetched even if purchases are restricted (#123)
akshetpandey Sep 27, 2017
8cf764d
6.0.0
chirag04 Sep 27, 2017
37e4f28
Merge branch 'master' of https://github.com/chirag04/react-native-in-…
brunolemos Nov 10, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions InAppUtils.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -306,8 +306,6 @@
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(SRCROOT)/node_modules/react-native/React/**",
"$(SRCROOT)/../react-native/React/**",
);
OTHER_LDFLAGS = "-ObjC";
PRODUCT_NAME = "$(TARGET_NAME)";
Expand All @@ -321,8 +319,6 @@
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(SRCROOT)/node_modules/react-native/React/**",
"$(SRCROOT)/../react-native/React/**",
);
OTHER_LDFLAGS = "-ObjC";
PRODUCT_NAME = "$(TARGET_NAME)";
Expand Down
4 changes: 2 additions & 2 deletions InAppUtils/InAppUtils.h
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>

#import "RCTBridgeModule.h"
#import <React/RCTBridgeModule.h>

@interface InAppUtils : NSObject <RCTBridgeModule, SKProductsRequestDelegate, SKPaymentTransactionObserver>

@end
@end
102 changes: 82 additions & 20 deletions InAppUtils/InAppUtils.m
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#import "InAppUtils.h"
#import <StoreKit/StoreKit.h>
#import "RCTLog.h"
#import "RCTUtils.h"
#import <React/RCTLog.h>
#import <React/RCTUtils.h>
#import "SKProduct+StringPrice.h"

@implementation InAppUtils
Expand Down Expand Up @@ -59,8 +59,10 @@ - (void)paymentQueue:(SKPaymentQueue *)queue
NSString *key = RCTKeyForInstance(transaction.payment.productIdentifier);
RCTResponseSenderBlock callback = _callbacks[key];
NSDictionary *purchase = @{
@"transactionIdentifier": transaction.transactionIdentifier,
@"productIdentifier": transaction.payment.productIdentifier
@"transactionDate": @(transaction.transactionDate.timeIntervalSince1970 * 1000),
@"transactionIdentifier": transaction.transactionIdentifier,
@"productIdentifier": transaction.payment.productIdentifier,
@"transactionReceipt": [[transaction transactionReceipt] base64EncodedStringWithOptions:0]
};
if (callback) {
callback(@[[NSNull null], purchase]);
Expand Down Expand Up @@ -92,8 +94,22 @@ - (void)paymentQueue:(SKPaymentQueue *)queue
}
}

RCT_EXPORT_METHOD(purchaseProductForUser:(NSString *)productIdentifier
username:(NSString *)username
callback:(RCTResponseSenderBlock)callback)
{
[self doPurchaseProduct:productIdentifier username:username callback:callback];
}

RCT_EXPORT_METHOD(purchaseProduct:(NSString *)productIdentifier
callback:(RCTResponseSenderBlock)callback)
{
[self doPurchaseProduct:productIdentifier username:nil callback:callback];
}

- (void) doPurchaseProduct:(NSString *)productIdentifier
username:(NSString *)username
callback:(RCTResponseSenderBlock)callback
{
SKProduct *product;
for(SKProduct *p in products)
Expand All @@ -104,7 +120,10 @@ - (void)paymentQueue:(SKPaymentQueue *)queue
}
}
if(product) {
SKPayment *payment = [SKPayment paymentWithProduct:product];
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
if(username) {
payment.applicationUsername = username;
}
[[SKPaymentQueue defaultQueue] addPayment:payment];
_callbacks[RCTKeyForInstance(payment.productIdentifier)] = callback;
} else {
Expand All @@ -118,7 +137,16 @@ - (void)paymentQueue:(SKPaymentQueue *)queue
NSString *key = RCTKeyForInstance(@"restoreRequest");
RCTResponseSenderBlock callback = _callbacks[key];
if (callback) {
callback(@[@"restore_failed"]);
switch (error.code)
{
case SKErrorPaymentCancelled:
callback(@[@"user_cancelled"]);
break;
default:
callback(@[@"restore_failed"]);
break;
}

[_callbacks removeObjectForKey:key];
} else {
RCTLogWarn(@"No callback registered for restore product request.");
Expand All @@ -133,10 +161,19 @@ - (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
NSMutableArray *productsArrayForJS = [NSMutableArray array];
for(SKPaymentTransaction *transaction in queue.transactions){
if(transaction.transactionState == SKPaymentTransactionStateRestored) {
NSDictionary *purchase = @{
@"transactionIdentifier": transaction.transactionIdentifier,
@"productIdentifier": transaction.payment.productIdentifier
};
NSMutableDictionary *purchase = [NSMutableDictionary dictionaryWithDictionary: @{
@"transactionDate": @(transaction.transactionDate.timeIntervalSince1970 * 1000),
@"transactionIdentifier": transaction.transactionIdentifier,
@"productIdentifier": transaction.payment.productIdentifier,
@"transactionReceipt": [[transaction transactionReceipt] base64EncodedStringWithOptions:0]
}];

SKPaymentTransaction *originalTransaction = transaction.originalTransaction;
if (originalTransaction) {
purchase[@"originalTransactionDate"] = @(originalTransaction.transactionDate.timeIntervalSince1970 * 1000);
purchase[@"originalTransactionIdentifier"] = originalTransaction.transactionIdentifier;
}

[productsArrayForJS addObject:purchase];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
Expand All @@ -155,18 +192,32 @@ - (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

RCT_EXPORT_METHOD(restorePurchasesForUser:(NSString *)username
callback:(RCTResponseSenderBlock)callback)
{
NSString *restoreRequest = @"restoreRequest";
_callbacks[RCTKeyForInstance(restoreRequest)] = callback;
if(!username) {
callback(@[@"username_required"]);
return;
}
[[SKPaymentQueue defaultQueue] restoreCompletedTransactionsWithApplicationUsername:username];
}

RCT_EXPORT_METHOD(loadProducts:(NSArray *)productIdentifiers
callback:(RCTResponseSenderBlock)callback)
{
if([SKPaymentQueue canMakePayments]){
SKProductsRequest *productsRequest = [[SKProductsRequest alloc]
initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]];
productsRequest.delegate = self;
_callbacks[RCTKeyForInstance(productsRequest)] = callback;
[productsRequest start];
} else {
callback(@[@"not_available"]);
}
SKProductsRequest *productsRequest = [[SKProductsRequest alloc]
initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]];
productsRequest.delegate = self;
_callbacks[RCTKeyForInstance(productsRequest)] = callback;
[productsRequest start];
}

RCT_EXPORT_METHOD(canMakePayments: (RCTResponseSenderBlock)callback)
{
BOOL canMakePayments = [SKPaymentQueue canMakePayments];
callback(@[@(canMakePayments)]);
}

RCT_EXPORT_METHOD(receiptData:(RCTResponseSenderBlock)callback)
Expand Down Expand Up @@ -204,7 +255,8 @@ - (void)productsRequest:(SKProductsRequest *)request
@"currencySymbol": [item.priceLocale objectForKey:NSLocaleCurrencySymbol],
@"currencyCode": [item.priceLocale objectForKey:NSLocaleCurrencyCode],
@"priceString": item.priceString,
@"downloadable": item.downloadable ? @"true" : @"false" ,
@"countryCode": [item.priceLocale objectForKey: NSLocaleCountryCode],
@"downloadable": item.downloadable ? @"true" : @"false" ,
@"description": item.localizedDescription ? item.localizedDescription : @"",
@"title": item.localizedTitle ? item.localizedTitle : @"",
};
Expand All @@ -218,6 +270,16 @@ - (void)productsRequest:(SKProductsRequest *)request
}
}

// SKProductsRequestDelegate network error
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
NSString *key = RCTKeyForInstance(request);
RCTResponseSenderBlock callback = _callbacks[key];
if(callback) {
callback(@[RCTJSErrorFromNSError(error)]);
[_callbacks removeObjectForKey:key];
}
}

- (void)dealloc
{
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
Expand Down
Loading