Skip to content

Introductory Price parsing (#186) #206

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 7 commits into
base: master
Choose a base branch
from
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