Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 7 additions & 0 deletions InAppUtils.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
46E694381B289730000B634E /* InAppUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 46E694371B289730000B634E /* InAppUtils.m */; };
46E6943E1B289730000B634E /* libInAppUtils.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 46E694321B289730000B634E /* libInAppUtils.a */; };
46E694841B28E42F000B634E /* SKProduct+StringPrice.m in Sources */ = {isa = PBXBuildFile; fileRef = 46E694831B28E42F000B634E /* SKProduct+StringPrice.m */; };
ACABFCCA227B396500DE33B7 /* SKProductDiscount+StringPrice.m in Sources */ = {isa = PBXBuildFile; fileRef = ACABFCC8227B396500DE33B7 /* SKProductDiscount+StringPrice.m */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -44,6 +45,8 @@
46E694431B289730000B634E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
46E694821B28E404000B634E /* SKProduct+StringPrice.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SKProduct+StringPrice.h"; sourceTree = "<group>"; };
46E694831B28E42F000B634E /* SKProduct+StringPrice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SKProduct+StringPrice.m"; sourceTree = "<group>"; };
ACABFCC8227B396500DE33B7 /* SKProductDiscount+StringPrice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SKProductDiscount+StringPrice.m"; sourceTree = "<group>"; };
ACABFCC9227B396500DE33B7 /* SKProductDiscount+StringPrice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SKProductDiscount+StringPrice.h"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -86,6 +89,8 @@
46E694341B289730000B634E /* InAppUtils */ = {
isa = PBXGroup;
children = (
ACABFCC9227B396500DE33B7 /* SKProductDiscount+StringPrice.h */,
ACABFCC8227B396500DE33B7 /* SKProductDiscount+StringPrice.m */,
46E694351B289730000B634E /* InAppUtils.h */,
46E694371B289730000B634E /* InAppUtils.m */,
46E694821B28E404000B634E /* SKProduct+StringPrice.h */,
Expand Down Expand Up @@ -170,6 +175,7 @@
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
English,
en,
);
mainGroup = 46E694291B289730000B634E;
Expand Down Expand Up @@ -198,6 +204,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
ACABFCCA227B396500DE33B7 /* SKProductDiscount+StringPrice.m in Sources */,
46E694841B28E42F000B634E /* SKProduct+StringPrice.m in Sources */,
46E694381B289730000B634E /* InAppUtils.m in Sources */,
);
Expand Down
67 changes: 67 additions & 0 deletions InAppUtils/InAppUtils.m
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#import <React/RCTLog.h>
#import <React/RCTUtils.h>
#import "SKProduct+StringPrice.h"
#import "SKProductDiscount+StringPrice.h"

@implementation InAppUtils
{
Expand Down Expand Up @@ -213,6 +214,7 @@ - (void)productsRequest:(SKProductsRequest *)request
products = [NSMutableArray arrayWithArray:response.products];
NSMutableArray *productsArrayForJS = [NSMutableArray array];
for(SKProduct *item in response.products) {
NSDictionary *introductoryPrice = [InAppUtils parseIntroductoryPrice: item];
NSDictionary *product = @{
@"identifier": item.productIdentifier,
@"price": item.price,
Expand All @@ -223,6 +225,7 @@ - (void)productsRequest:(SKProductsRequest *)request
@"downloadable": item.downloadable ? @"true" : @"false" ,
@"description": item.localizedDescription ? item.localizedDescription : @"",
@"title": item.localizedTitle ? item.localizedTitle : @"",
@"introductoryPrice": (introductoryPrice == nil) ? [NSNull null] : introductoryPrice,
};
[productsArrayForJS addObject:product];
}
Expand Down Expand Up @@ -265,6 +268,70 @@ - (void)dealloc
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

#pragma mark Static

+ (NSDictionary *)parseIntroductoryPrice: (SKProduct *)product {
if(@available(iOS 11.2, *)) {
if (product != nil && product.introductoryPrice != nil) {
// paymentMode: Returning as string for ease of use and code resilience
NSString *paymentMode;
switch (product.introductoryPrice.paymentMode) {
case SKProductDiscountPaymentModeFreeTrial:
paymentMode = @"freeTrial";
break;
case SKProductDiscountPaymentModePayAsYouGo:
paymentMode = @"payAsYouGo";
break;
case SKProductDiscountPaymentModePayUpFront:
paymentMode = @"payUpFront";
break;
default:
paymentMode = @"unavailable";
break;
}

// subscriptionPeriod: Returning as Dictionary { unit: NSString, numberOfUnits: NSNumber }
NSString *subscriptionPeriodUnit;
switch (product.introductoryPrice.subscriptionPeriod.unit) {
case SKProductPeriodUnitDay:
subscriptionPeriodUnit = @"day";
break;
case SKProductPeriodUnitWeek:
subscriptionPeriodUnit = @"week";
break;
case SKProductPeriodUnitMonth:
subscriptionPeriodUnit = @"month";
break;
case SKProductPeriodUnitYear:
subscriptionPeriodUnit = @"year";
break;
default:
subscriptionPeriodUnit = @"unavailable";
break;
}

NSDictionary *subscriptionPeriod = @{
@"unit": subscriptionPeriodUnit,
@"numberOfUnits": [[NSNumber alloc] initWithLong:product.introductoryPrice.subscriptionPeriod.numberOfUnits],
};

NSDictionary *introductoryPrice = @{
@"price": product.introductoryPrice.price,
@"currencySymbol": [product.introductoryPrice.priceLocale objectForKey:NSLocaleCurrencySymbol],
@"currencyCode": [product.introductoryPrice.priceLocale objectForKey:NSLocaleCurrencyCode],
@"countryCode": [product.introductoryPrice.priceLocale objectForKey: NSLocaleCountryCode],
@"priceString": product.introductoryPrice.priceString,
@"numberOfPeriods": [[NSNumber alloc] initWithLong:product.introductoryPrice.numberOfPeriods],
@"paymentMode": paymentMode,
@"subscriptionPeriod": subscriptionPeriod,
};
return introductoryPrice;
}
}

return nil;
}

#pragma mark Private

static NSString *RCTKeyForInstance(id instance)
Expand Down
1 change: 0 additions & 1 deletion InAppUtils/SKProduct+StringPrice.m
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#import "SKProduct+StringPrice.h"


@implementation SKProduct (StringPrice)

- (NSString *)priceString {
Expand Down
8 changes: 8 additions & 0 deletions InAppUtils/SKProductDiscount+StringPrice.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>

@interface SKProductDiscount (StringPrice)

@property (nonatomic, readonly) NSString *priceString;

@end
14 changes: 14 additions & 0 deletions InAppUtils/SKProductDiscount+StringPrice.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#import "SKProductDiscount+StringPrice.h"

@implementation SKProductDiscount (StringPrice)

- (NSString *)priceString {
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.formatterBehavior = NSNumberFormatterBehavior10_4;
formatter.numberStyle = NSNumberFormatterCurrencyStyle;
formatter.locale = self.priceLocale;

return [formatter stringFromNumber:self.price];
}

@end
Loading