add PKContactValue

This commit is contained in:
Ben Guo 2016-09-20 12:54:19 -04:00
parent 73bb0295c2
commit 4f75f5e8ce
6 changed files with 114 additions and 54 deletions

View File

@ -246,22 +246,17 @@ class CheckoutViewController: UIViewController, STPPaymentContextDelegate {
fedEx.identifier = "fedex"
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
if address.country == nil {
completion(.valid, nil, nil, nil)
if address.country == nil || address.country == "US" {
completion(.valid, nil, [upsGround, fedEx], fedEx)
}
else if address.country == "AQ" {
let error = NSError(domain: "ShippingError", code: 123, userInfo: [NSLocalizedDescriptionKey: "Invalid Shipping Address",
NSLocalizedFailureReasonErrorKey: "We can't ship to this country."])
completion(.invalid, error, nil, nil)
}
else {
if address.country == "US" {
completion(.valid, nil, [upsGround, fedEx], fedEx)
}
else if address.country == "AE" {
let error = NSError(domain: "ShippingError", code: 123, userInfo: [NSLocalizedDescriptionKey: "Invalid Shipping Address",
NSLocalizedFailureReasonErrorKey: "We can't ship to this country."])
completion(.invalid, error, nil, nil)
}
else {
fedEx.amount = 20.99
completion(.valid, nil, [upsWorldwide, fedEx], fedEx)
}
fedEx.amount = 20.99
completion(.valid, nil, [upsWorldwide, fedEx], fedEx)
}
}
}

View File

@ -137,21 +137,15 @@ class SettingsViewController: UITableViewController {
private enum RequiredShippingAddressFields: String {
case None = "None"
case Phone = "Phone"
case Email = "Email"
case NameEmail = "(Name|Email)"
case PostalAddress = "PostalAddress"
case PostalAddressPhone = "(PostalAddress|Phone)"
case All = "All"
init(row: Int) {
switch row {
case 0: self = .None
case 1: self = .Phone
case 2: self = .Email
case 3: self = .NameEmail
case 4: self = .PostalAddress
case 5: self = .PostalAddressPhone
case 1: self = .Email
case 2: self = .PostalAddressPhone
default: self = .All
}
}
@ -159,15 +153,7 @@ class SettingsViewController: UITableViewController {
var pkAddressFields: PKAddressField {
switch self {
case .None: return []
case .Phone: return .phone
case .Email: return .email
case .NameEmail:
if #available(iOS 8.3, *) {
return [.name, .email]
} else {
return [.email]
}
case .PostalAddress: return .postalAddress
case .PostalAddressPhone: return [.postalAddress, .phone]
case .All: return .all
}
@ -216,7 +202,7 @@ class SettingsViewController: UITableViewController {
case .Theme: return 3
case .ApplePay: return 2
case .RequiredBillingAddressFields: return 3
case .RequiredShippingAddressFields: return 7
case .RequiredShippingAddressFields: return 4
case .ShippingType: return 2
case .SMSAutofill: return 2
case .Session: return 1

View File

@ -95,6 +95,7 @@ typedef NS_ENUM(NSUInteger, STPBillingAddressFields) {
- (instancetype)initWithABRecord:(ABRecordRef)record;
- (ABRecordRef)ABRecordValue;
#pragma clang diagnostic pop
- (PKContact *)PKContactValue NS_AVAILABLE_IOS(9.0);
- (BOOL)containsRequiredFields:(STPBillingAddressFields)requiredFields;
- (BOOL)containsRequiredShippingAddressFields:(PKAddressField)requiredFields;

View File

@ -79,19 +79,12 @@
- (ABRecordRef)ABRecordValue {
ABRecordRef record = ABPersonCreate();
NSArray<NSString *>*nameComponents = [self.name componentsSeparatedByString:@" "];
NSString *firstName = [nameComponents firstObject];
NSString *lastName = [self.name stringByReplacingOccurrencesOfString:firstName withString:@""];
lastName = [lastName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if ([lastName length] == 0) {
lastName = nil;
}
if (firstName != nil) {
CFStringRef firstNameRef = (__bridge CFStringRef)firstName;
if ([self firstName] != nil) {
CFStringRef firstNameRef = (__bridge CFStringRef)[self firstName];
ABRecordSetValue(record, kABPersonFirstNameProperty, firstNameRef, nil);
}
if (lastName != nil) {
CFStringRef lastNameRef = (__bridge CFStringRef)lastName;
if ([self lastName] != nil) {
CFStringRef lastNameRef = (__bridge CFStringRef)[self lastName];
ABRecordSetValue(record, kABPersonLastNameProperty, lastNameRef, nil);
}
if (self.phone != nil) {
@ -108,14 +101,7 @@
}
ABMutableMultiValueRef addressRef = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);
NSMutableDictionary *addressDict = [NSMutableDictionary dictionary];
NSString *street = nil;
if (self.line1 != nil) {
street = [@"" stringByAppendingString:self.line1];
}
if (self.line2 != nil) {
street = [@[street ?: @"", self.line2] componentsJoinedByString:@" "];
}
addressDict[(NSString *)kABPersonAddressStreetKey] = street;
addressDict[(NSString *)kABPersonAddressStreetKey] = [self street];
addressDict[(NSString *)kABPersonAddressCityKey] = self.city;
addressDict[(NSString *)kABPersonAddressStateKey] = self.state;
addressDict[(NSString *)kABPersonAddressZIPKey] = self.postalCode;
@ -127,6 +113,51 @@
#pragma clang diagnostic pop
- (PKContact *)PKContactValue {
PKContact *contact = [PKContact new];
NSPersonNameComponents *name = [NSPersonNameComponents new];
name.givenName = [self firstName];
name.familyName = [self lastName];
contact.name = name;
contact.emailAddress = self.email;
CNMutablePostalAddress *address = [CNMutablePostalAddress new];
address.street = [self street];
address.city = self.city;
address.state = self.state;
address.postalCode = self.postalCode;
address.country = self.country;
contact.postalAddress = address;
contact.phoneNumber = [CNPhoneNumber phoneNumberWithStringValue:self.phone];
return contact;
}
- (NSString *)firstName {
NSArray<NSString *>*components = [self.name componentsSeparatedByString:@" "];
return [components firstObject];
}
- (NSString *)lastName {
NSArray<NSString *>*components = [self.name componentsSeparatedByString:@" "];
NSString *firstName = [components firstObject];
NSString *lastName = [self.name stringByReplacingOccurrencesOfString:firstName withString:@""];
lastName = [lastName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if ([lastName length] == 0) {
lastName = nil;
}
return lastName;
}
- (NSString *)street {
NSString *street = nil;
if (self.line1 != nil) {
street = [@"" stringByAppendingString:self.line1];
}
if (self.line2 != nil) {
street = [@[street ?: @"", self.line2] componentsJoinedByString:@" "];
}
return street;
}
- (BOOL)containsRequiredFields:(STPBillingAddressFields)requiredFields {
BOOL containsFields = YES;
switch (requiredFields) {

View File

@ -325,7 +325,13 @@
}
- (void)shippingAddressViewControllerDidCancel:(STPShippingAddressViewController *)addressViewController {
[self appropriatelyDismissViewController:addressViewController completion:nil];
[self appropriatelyDismissViewController:addressViewController completion:^{
if (addressViewController.isMidPaymentRequest) {
[self.delegate paymentContext:self
didFinishWithStatus:STPPaymentStatusUserCancellation
error:nil];
}
}];
}
- (void)shippingAddressViewController:(__unused STPShippingAddressViewController *)addressViewController
@ -502,8 +508,16 @@
paymentRequest.requiredBillingAddressFields = [STPAddress applePayAddressFieldsFromBillingAddressFields:self.configuration.requiredBillingAddressFields];
paymentRequest.requiredShippingAddressFields = self.configuration.requiredShippingAddressFields;
paymentRequest.currencyCode = self.paymentCurrency.uppercaseString;
paymentRequest.shippingMethods = self.shippingMethods;
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80300
if (self.selectedShippingMethod != nil) {
NSMutableArray<PKShippingMethod *>* orderedShippingMethods = [self.shippingMethods mutableCopy];
[orderedShippingMethods removeObject:self.selectedShippingMethod];
[orderedShippingMethods insertObject:self.selectedShippingMethod atIndex:0];
paymentRequest.shippingMethods = orderedShippingMethods;
}
else {
paymentRequest.shippingMethods = self.shippingMethods;
}
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_3
if ([paymentRequest respondsToSelector:@selector(shippingType)]) {
paymentRequest.shippingType = [[self class] pkShippingType:self.configuration.shippingType];;
}
@ -511,13 +525,22 @@
if (self.shippingAddress != nil) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
if ([paymentRequest respondsToSelector:@selector(shippingContact)]) {
paymentRequest.shippingContact = [self.shippingAddress PKContactValue];
}
else {
paymentRequest.shippingAddress = [self.shippingAddress ABRecordValue];
}
#else
paymentRequest.shippingAddress = [self.shippingAddress ABRecordValue];
#endif
#pragma clang diagnostic pop
}
return paymentRequest;
}
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80300
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_3
+ (PKShippingType)pkShippingType:(STPShippingType)shippingType {
switch (shippingType) {
case STPShippingTypeShipping:

View File

@ -161,6 +161,30 @@
XCTAssertNil(postalCode);
}
- (void)testPKContactValue {
STPAddress *address = [STPAddress new];
address.name = @"John Smith Doe";
address.phone = @"8885551212";
address.email = @"foo@example.com";
address.line1 = @"55 John St";
address.city = @"New York";
address.state = @"NY";
address.postalCode = @"10002";
address.country = @"US";
PKContact *contact = [address PKContactValue];
XCTAssertEqualObjects(contact.name.givenName, @"John");
XCTAssertEqualObjects(contact.name.familyName, @"Smith Doe");
XCTAssertEqualObjects(contact.phoneNumber.stringValue, @"8885551212");
XCTAssertEqualObjects(contact.emailAddress, @"foo@example.com");
CNPostalAddress *postalAddress = contact.postalAddress;
XCTAssertEqualObjects(postalAddress.street, @"55 John St");
XCTAssertEqualObjects(postalAddress.city, @"New York");
XCTAssertEqualObjects(postalAddress.state, @"NY");
XCTAssertEqualObjects(postalAddress.postalCode, @"10002");
XCTAssertEqualObjects(postalAddress.country, @"US");
}
- (void)testContainsRequiredFieldsNone {
STPAddress *address = [STPAddress new];
XCTAssertTrue([address containsRequiredFields:STPBillingAddressFieldsNone]);