Skip to content

Commit

Permalink
Apple Pay callback fix (#95)
Browse files Browse the repository at this point in the history
* Added potential fix for Apple Pay callback issue

* Increased SDK version to 2.2.1

* Fixed unit tests
  • Loading branch information
mpetrenco authored Nov 17, 2020
1 parent f7d2762 commit ec73511
Show file tree
Hide file tree
Showing 9 changed files with 50 additions and 51 deletions.
2 changes: 1 addition & 1 deletion JudoKit-iOS.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'JudoKit-iOS'
s.version = '2.2.0'
s.version = '2.2.1'
s.summary = 'Judo Pay Full iOS Client Kit'
s.homepage = 'https://www.judopay.com/'
s.license = 'MIT'
Expand Down
16 changes: 8 additions & 8 deletions JudoKit_iOS.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -3516,9 +3516,9 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2.2.0;
CURRENT_PROJECT_VERSION = 2.2.1;
DEBUG_INFORMATION_FORMAT = dwarf;
DYLIB_CURRENT_VERSION = 2.2.0;
DYLIB_CURRENT_VERSION = 2.2.1;
ENABLE_BITCODE = YES;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
Expand Down Expand Up @@ -3578,9 +3578,9 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 2.2.0;
CURRENT_PROJECT_VERSION = 2.2.1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DYLIB_CURRENT_VERSION = 2.2.0;
DYLIB_CURRENT_VERSION = 2.2.1;
ENABLE_BITCODE = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
Expand Down Expand Up @@ -3616,7 +3616,7 @@
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 2.2.0;
DYLIB_CURRENT_VERSION = 2.2.1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_BITCODE = YES;
FRAMEWORK_SEARCH_PATHS = (
Expand All @@ -3634,7 +3634,7 @@
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 2.2.0;
MARKETING_VERSION = 2.2.1;
MODULEMAP_FILE = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.judopay.JudoKit-iOS";
PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)";
Expand Down Expand Up @@ -3663,7 +3663,7 @@
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 2.2.0;
DYLIB_CURRENT_VERSION = 2.2.1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_BITCODE = YES;
FRAMEWORK_SEARCH_PATHS = (
Expand All @@ -3681,7 +3681,7 @@
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 2.2.0;
MARKETING_VERSION = 2.2.1;
MODULEMAP_FILE = "";
PRODUCT_BUNDLE_IDENTIFIER = "com.judopay.JudoKit-iOS";
PRODUCT_MODULE_NAME = "$(PRODUCT_NAME:c99extidentifier)";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ import Foundation
func presentApplePay(authorizationBlock: @escaping JPApplePayAuthorizationBlock) {
didPresentApplePay = true

let authBlock: (PKPaymentAuthorizationStatus) -> () = { _ in }
let authBlock: (PKPaymentAuthorizationResult) -> () = { _ in }
authorizationBlock(PKPayment(), authBlock)
}

Expand Down
2 changes: 1 addition & 1 deletion Source/JudoKit.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
@protocol JPAuthorization;

static NSString *__nonnull const JudoKitName = @"JudoKit_iOS";
static NSString *__nonnull const JudoKitVersion = @"2.2.0";
static NSString *__nonnull const JudoKitVersion = @"2.2.1";

@interface JudoKit : NSObject

Expand Down
10 changes: 8 additions & 2 deletions Source/JudoKit.m
Original file line number Diff line number Diff line change
Expand Up @@ -163,11 +163,17 @@ - (UIViewController *)applePayViewControllerWithMode:(JPTransactionMode)mode
[self.applePayService processApplePayment:payment
forTransactionMode:mode
withCompletion:^(JPResponse *response, JPError *error) {
PKPaymentAuthorizationResult *result;

if (error) {
statusCompletion(PKPaymentAuthorizationStatusFailure);
result = [[PKPaymentAuthorizationResult alloc] initWithStatus:PKPaymentAuthorizationStatusFailure
errors:@[ error ]];
statusCompletion(result);
}

statusCompletion(PKPaymentAuthorizationStatusSuccess);
result = [[PKPaymentAuthorizationResult alloc] initWithStatus:PKPaymentAuthorizationStatusSuccess
errors:nil];
statusCompletion(result);
completion(response, error);
}];
}];
Expand Down
47 changes: 15 additions & 32 deletions Source/Models/ApplePayWrappers/JPApplePayWrappers.m
Original file line number Diff line number Diff line change
Expand Up @@ -58,21 +58,11 @@ + (PKPaymentRequest *)pkPaymentRequestForConfiguration:(JPConfiguration *)config
JPContactField requiredShippingContactFields = applePayConfiguration.requiredShippingContactFields;
JPContactField requiredBillingContactFields = applePayConfiguration.requiredBillingContactFields;

if (@available(iOS 11.0, *)) {
NSSet<PKContactField> *pkShippingFields = [self pkContactFieldsFromFields:requiredShippingContactFields];
NSSet<PKContactField> *pkBillingFields = [self pkContactFieldsFromFields:requiredBillingContactFields];

NSSet<PKContactField> *pkShippingFields = [self pkContactFieldsFromFields:requiredShippingContactFields];
NSSet<PKContactField> *pkBillingFields = [self pkContactFieldsFromFields:requiredBillingContactFields];

paymentRequest.requiredShippingContactFields = pkShippingFields;
paymentRequest.requiredBillingContactFields = pkBillingFields;

} else {
PKAddressField pkShippingFields = [self pkAddressFieldsFromFields:requiredShippingContactFields];
PKAddressField pkBillingFields = [self pkAddressFieldsFromFields:requiredBillingContactFields];

paymentRequest.requiredShippingAddressFields = pkShippingFields;
paymentRequest.requiredBillingAddressFields = pkBillingFields;
}
paymentRequest.requiredShippingContactFields = pkShippingFields;
paymentRequest.requiredBillingContactFields = pkBillingFields;

paymentRequest.paymentSummaryItems = [self pkPaymentSummaryItemsForConfiguration:configuration];

Expand Down Expand Up @@ -193,23 +183,20 @@ + (PKShippingType)pkShippingTypeForConfiguration:(JPConfiguration *)configuratio

NSMutableSet *pkContactFields = [NSMutableSet new];

if (@available(iOS 11.0, *)) {

if (contactFields & JPContactFieldPostalAddress) {
[pkContactFields addObject:PKContactFieldPostalAddress];
}
if (contactFields & JPContactFieldPostalAddress) {
[pkContactFields addObject:PKContactFieldPostalAddress];
}

if (contactFields & JPContactFieldPhone) {
[pkContactFields addObject:PKContactFieldPhoneNumber];
}
if (contactFields & JPContactFieldPhone) {
[pkContactFields addObject:PKContactFieldPhoneNumber];
}

if (contactFields & JPContactFieldEmail) {
[pkContactFields addObject:PKContactFieldEmailAddress];
}
if (contactFields & JPContactFieldEmail) {
[pkContactFields addObject:PKContactFieldEmailAddress];
}

if (contactFields & JPContactFieldName) {
[pkContactFields addObject:PKContactFieldName];
}
if (contactFields & JPContactFieldName) {
[pkContactFields addObject:PKContactFieldName];
}

return pkContactFields;
Expand All @@ -223,8 +210,4 @@ + (PKPaymentSummaryItemType)pkSummaryItemTypeFromType:(JPPaymentSummaryItemType)
return PKPaymentSummaryItemTypePending;
}

+ (PKAddressField)pkAddressFieldsFromFields:(JPContactField)contactFields {
return (PKAddressField)contactFields;
}

@end
Original file line number Diff line number Diff line change
Expand Up @@ -182,11 +182,17 @@ - (void)handleApplePayButtonTap {
[self.view presentApplePayWithAuthorizationBlock:^(PKPayment *payment, JPApplePayAuthStatusBlock completion) {
[self.interactor processApplePayment:payment
withCompletion:^(JPResponse *response, JPError *error) {
PKPaymentAuthorizationResult *result;

if (error) {
completion(PKPaymentAuthorizationStatusFailure);
result = [[PKPaymentAuthorizationResult alloc] initWithStatus:PKPaymentAuthorizationStatusFailure
errors:@[ error ]];
completion(result);
}

completion(PKPaymentAuthorizationStatusSuccess);
result = [[PKPaymentAuthorizationResult alloc] initWithStatus:PKPaymentAuthorizationStatusSuccess
errors:nil];
completion(result);
[weakSelf handleCallbackWithResponse:response andError:error];
}];
}];
Expand Down
8 changes: 6 additions & 2 deletions Source/Services/ApplePay/JPApplePayController.m
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ @interface JPApplePayController ()

@property (nonatomic, strong) JPConfiguration *configuration;
@property (nonatomic, strong) JPApplePayAuthorizationBlock authorizationBlock;
@property (nonatomic, assign) BOOL isPaymentAuthorized;

@end

Expand Down Expand Up @@ -61,13 +62,16 @@ - (UIViewController *)applePayViewControllerWithAuthorizationBlock:(JPApplePayAu

- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
didAuthorizePayment:(PKPayment *)payment
completion:(void (^)(PKPaymentAuthorizationStatus))completion {
handler:(void (^)(PKPaymentAuthorizationResult *_Nonnull))completion {
self.isPaymentAuthorized = YES;
self.authorizationBlock(payment, completion);
}

- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {
[controller dismissViewControllerAnimated:YES completion:nil];
[self.delegate applePayControllerDidCancelTransaction:self];
if (!self.isPaymentAuthorized) {
[self.delegate applePayControllerDidCancelTransaction:self];
}
}

@end
4 changes: 2 additions & 2 deletions Source/Services/ApplePay/JPApplePayTypedefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@

/**
* A completion block called after the JPApplePayService finishes processing the Apple Pay transaction.
* Depending on the response, this block is called with either a PKPaymentAuthorizationStatusSuccess or PKPaymentAuthorizationStatusFailure
* Depending on the response, this block contains a result with either a PKPaymentAuthorizationStatusSuccess or PKPaymentAuthorizationStatusFailure
* used to tell the Apple Pay sheet how to proceed further.
*/
typedef void (^JPApplePayAuthStatusBlock)(PKPaymentAuthorizationStatus status);
typedef void (^JPApplePayAuthStatusBlock)(PKPaymentAuthorizationResult *_Nonnull result);

/**
* This block is used to capture the `didAuthorizePayment` delegate call inside a block.
Expand Down

0 comments on commit ec73511

Please sign in to comment.