diff --git a/Source/ARTDeviceDetails.h b/Source/ARTDeviceDetails.h index 623ba62ff..ea7128e31 100644 --- a/Source/ARTDeviceDetails.h +++ b/Source/ARTDeviceDetails.h @@ -12,7 +12,7 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic) NSString *platform; @property (strong, nonatomic) NSString *formFactor; @property (strong, nonatomic) NSDictionary *metadata; -@property (strong, nonatomic) ARTDevicePushDetails *push; +@property (strong, nonatomic) NSMutableDictionary *pushRecipient; - (instancetype)init; - (instancetype)initWithId:(ARTDeviceId *)deviceId; diff --git a/Source/ARTDeviceDetails.m b/Source/ARTDeviceDetails.m index 03e640bb3..d7bac2554 100644 --- a/Source/ARTDeviceDetails.m +++ b/Source/ARTDeviceDetails.m @@ -5,8 +5,8 @@ @implementation ARTDeviceDetails - (instancetype)init { if (self = [super init]) { - _push = [[ARTDevicePushDetails alloc] init]; _metadata = [[NSDictionary alloc] init]; + _pushRecipient = [[NSMutableDictionary alloc] init]; } return self; } @@ -26,7 +26,7 @@ - (id)copyWithZone:(NSZone *)zone { device.platform = [self.platform copy]; device.formFactor = [self.formFactor copy]; device.metadata = [self.metadata copy]; - device.push = [self.push copy]; + device.pushRecipient = [self.pushRecipient copy]; return device; } diff --git a/Source/ARTDevicePushDetails.h b/Source/ARTDevicePushDetails.h index 66556fc17..8d06acbdf 100644 --- a/Source/ARTDevicePushDetails.h +++ b/Source/ARTDevicePushDetails.h @@ -1,17 +1,24 @@ #import @class ARTErrorInfo; +@class ARTDeviceDetails; NS_ASSUME_NONNULL_BEGIN -@interface ARTDevicePushDetails : NSObject +@interface ARTDevicePushStatus : NSObject -@property (strong, nonatomic) NSMutableDictionary *recipient; -@property (strong, nullable, nonatomic) NSString *state; +@property (strong, nonatomic) NSString *state; @property (strong, nullable, nonatomic) ARTErrorInfo *errorReason; - (instancetype)init; @end +@interface ARTDeviceDetailsResponse : NSObject + +@property (nonatomic) ARTDeviceDetails *deviceDetails; +@property (nonatomic, nullable) ARTDevicePushStatus *pushStatus; + +@end + NS_ASSUME_NONNULL_END diff --git a/Source/ARTDevicePushDetails.m b/Source/ARTDevicePushDetails.m index 5cfa7e7e0..f8d6824d3 100644 --- a/Source/ARTDevicePushDetails.m +++ b/Source/ARTDevicePushDetails.m @@ -1,27 +1,35 @@ #import "ARTDevicePushDetails.h" #import "ARTPush.h" -@implementation ARTDevicePushDetails +@implementation ARTDevicePushStatus - (instancetype)init { if (self = [super init]) { - _recipient = [[NSMutableDictionary alloc] init]; + // } return self; } - (id)copyWithZone:(NSZone *)zone { - ARTDevicePushDetails *push = [[[self class] allocWithZone:zone] init]; - - push.recipient = [self.recipient copy]; + ARTDevicePushStatus *push = [[[self class] allocWithZone:zone] init]; push.state = self.state; push.errorReason = [self.errorReason copy]; - return push; } - (NSString *)description { - return [NSString stringWithFormat:@"%@ - \n\t recipient: %@; \n\t state: %@; \n\t errorReason: %@;", [super description], self.recipient, self.state, self.errorReason]; + return [NSString stringWithFormat:@"%@ - \n\t state: %@; \n\t errorReason: %@;", [super description], self.state, self.errorReason]; +} + +@end + +@implementation ARTDeviceDetailsResponse + +- (instancetype)init { + if (self = [super init]) { + // + } + return self; } @end diff --git a/Source/ARTEncoder.h b/Source/ARTEncoder.h index 82c27d939..14b59a116 100644 --- a/Source/ARTEncoder.h +++ b/Source/ARTEncoder.h @@ -8,7 +8,7 @@ @class ARTTokenRequest; @class ARTDeviceDetails; @class ARTDeviceIdentityTokenDetails; -@class ARTDevicePushDetails; +@class ARTDeviceDetailsResponse; @class ARTPushChannelSubscription; @protocol ARTPushRecipient; @@ -63,14 +63,10 @@ NS_ASSUME_NONNULL_BEGIN // DeviceDetails - (nullable NSData *)encodeDeviceDetails:(ARTDeviceDetails *)deviceDetails error:(NSError *_Nullable *_Nullable)error; -- (nullable ARTDeviceDetails *)decodeDeviceDetails:(NSData *)data error:(NSError *_Nullable *_Nullable)error; +- (nullable ARTDeviceDetailsResponse *)decodeDeviceDetailsResponse:(NSData *)data error:(NSError *_Nullable *_Nullable)error; - (nullable NSArray *)decodeDevicesDetails:(NSData *)data error:(NSError * __autoreleasing *)error; - (nullable ARTDeviceIdentityTokenDetails *)decodeDeviceIdentityTokenDetails:(NSData *)data error:(NSError * __autoreleasing *)error; -// DevicePushDetails -- (nullable NSData *)encodeDevicePushDetails:(ARTDevicePushDetails *)devicePushDetails error:(NSError *_Nullable *_Nullable)error; -- (nullable ARTDevicePushDetails *)decodeDevicePushDetails:(NSData *)data error:(NSError * __autoreleasing *)error; - // Push Channel Subscription - (nullable NSData *)encodePushChannelSubscription:(ARTPushChannelSubscription *)channelSubscription error:(NSError * __autoreleasing *)error; - (nullable ARTPushChannelSubscription *)decodePushChannelSubscription:(NSData *)data error:(NSError * __autoreleasing *)error; diff --git a/Source/ARTJsonLikeEncoder.m b/Source/ARTJsonLikeEncoder.m index eb4adc1f5..4ca69a18f 100644 --- a/Source/ARTJsonLikeEncoder.m +++ b/Source/ARTJsonLikeEncoder.m @@ -132,8 +132,8 @@ - (NSData *)encodeDeviceDetails:(ARTDeviceDetails *)deviceDetails error:(NSError return [self encode:[self deviceDetailsToDictionary:deviceDetails] error:error]; } -- (ARTDeviceDetails *)decodeDeviceDetails:(NSData *)data error:(NSError **)error { - return [self deviceDetailsFromDictionary:[self decodeDictionary:data error:nil] error:error]; +- (ARTDeviceDetailsResponse *)decodeDeviceDetailsResponse:(NSData *)data error:(NSError **)error { + return [self deviceDetailsResponseFromDictionary:[self decodeDictionary:data error:nil] error:error]; } - (NSArray *)decodeDevicesDetails:(NSData *)data error:(NSError * __autoreleasing *)error { @@ -156,14 +156,6 @@ - (ARTDeviceIdentityTokenDetails *)decodeDeviceIdentityTokenDetails:(NSData *)da return [self deviceIdentityTokenDetailsFromDictionary:[self decodeDictionary:data error:nil] error:error]; } -- (NSData *)encodeDevicePushDetails:(ARTDevicePushDetails *)devicePushDetails error:(NSError **)error { - return [self encode:[self devicePushDetailsToDictionary:devicePushDetails] error:error]; -} - -- (ARTDevicePushDetails *)decodeDevicePushDetails:(NSData *)data error:(NSError * __autoreleasing *)error { - return [self devicePushDetailsFromDictionary:[self decode:data error:nil] error:error]; -} - - (NSData *)encodePushChannelSubscription:(ARTPushChannelSubscription *)channelSubscription error:(NSError * __autoreleasing *)error { return [self encode:[self pushChannelSubscriptionToDictionary:channelSubscription] error:error]; } @@ -634,7 +626,7 @@ - (NSDictionary *)deviceDetailsToDictionary:(ARTDeviceDetails *)deviceDetails { dictionary[@"clientId"] = deviceDetails.clientId; } - dictionary[@"push"] = [self devicePushDetailsToDictionary:deviceDetails.push]; + dictionary[@"push"] = @{ @"recipient": deviceDetails.pushRecipient }; return dictionary; } @@ -651,7 +643,7 @@ - (ARTDeviceDetails *)deviceDetailsFromDictionary:(NSDictionary *)input error:(N deviceDetails.platform = [input artString:@"platform"]; deviceDetails.formFactor = [input artString:@"formFactor"]; deviceDetails.metadata = [input valueForKey:@"metadata"]; - deviceDetails.push = [self devicePushDetailsFromDictionary:input[@"push"] error:error]; + deviceDetails.pushRecipient = [input valueForKeyPath:@"push.recipient"]; return deviceDetails; } @@ -677,30 +669,34 @@ - (ARTDeviceIdentityTokenDetails *)deviceIdentityTokenDetailsFromDictionary:(NSD return deviceIdentityTokenDetails; } -- (NSDictionary *)devicePushDetailsToDictionary:(ARTDevicePushDetails *)devicePushDetails { - NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; - - dictionary[@"recipient"] = devicePushDetails.recipient; - - return dictionary; -} - -- (ARTDevicePushDetails *)devicePushDetailsFromDictionary:(NSDictionary *)input error:(NSError * __autoreleasing *)error { - [_logger verbose:@"RS:%p ARTJsonLikeEncoder<%@>: devicePushDetailsFromDictionary %@", _rest, [_delegate formatAsString], input]; +- (ARTDevicePushStatus *)devicePushStatusFromDictionary:(NSDictionary *)input error:(NSError * __autoreleasing *)error { + [_logger verbose:@"RS:%p ARTJsonLikeEncoder<%@>: devicePushStatusFromDictionary %@", _rest, [_delegate formatAsString], input]; if (![input isKindOfClass:[NSDictionary class]]) { return nil; } - ARTDevicePushDetails *devicePushDetails = [[ARTDevicePushDetails alloc] init]; - devicePushDetails.state = [input artString:@"state"]; + ARTDevicePushStatus *devicePushStatus = [[ARTDevicePushStatus alloc] init]; + devicePushStatus.state = [input artString:@"state"]; NSDictionary *errorReason = [input valueForKey:@"errorReason"]; if (errorReason) { - devicePushDetails.errorReason = [ARTErrorInfo createWithCode:[[errorReason artNumber:@"code"] intValue] status:[[errorReason artNumber:@"statusCode"] intValue] message:[errorReason artString:@"message"]]; + devicePushStatus.errorReason = [ARTErrorInfo createWithCode:[[errorReason artNumber:@"code"] intValue] status:[[errorReason artNumber:@"statusCode"] intValue] message:[errorReason artString:@"message"]]; } - devicePushDetails.recipient = [input valueForKey:@"recipient"]; + return devicePushStatus; +} - return devicePushDetails; +- (ARTDeviceDetailsResponse *)deviceDetailsResponseFromDictionary:(NSDictionary *)input error:(NSError * __autoreleasing *)error { + [_logger verbose:@"RS:%p ARTJsonLikeEncoder<%@>: deviceDetailsResponseFromDictionary %@", _rest, [_delegate formatAsString], input]; + + if (![input isKindOfClass:[NSDictionary class]]) { + return nil; + } + + ARTDeviceDetailsResponse *response = [[ARTDeviceDetailsResponse alloc] init]; + response.deviceDetails = [self deviceDetailsFromDictionary:input error:error]; + response.pushStatus = [self devicePushStatusFromDictionary:input[@"push"] error:error]; + + return response; } - (ARTProtocolMessage *)protocolMessageFromDictionary:(NSDictionary *)input { diff --git a/Source/ARTLocalDevice+Private.h b/Source/ARTLocalDevice+Private.h index e81ac1dac..8bd7ae43e 100644 --- a/Source/ARTLocalDevice+Private.h +++ b/Source/ARTLocalDevice+Private.h @@ -1,6 +1,7 @@ #import @protocol ARTDeviceStorage; +@class ARTPushActivationPersistentState; NS_ASSUME_NONNULL_BEGIN @@ -8,11 +9,17 @@ extern NSString *const ARTDeviceIdKey; extern NSString *const ARTDeviceSecretKey; extern NSString *const ARTDeviceIdentityTokenKey; extern NSString *const ARTAPNSDeviceTokenKey; +extern NSString *const ARTDeviceActivationErrorKey; @interface ARTLocalDevice () @property (strong, nonatomic) id storage; +#if TARGET_OS_IOS +@property (nullable, nonatomic, readonly) ARTErrorInfo *activationError; +@property (nullable, nonatomic, readonly) ARTPushActivationPersistentState *activationState; +#endif + + (ARTLocalDevice *)load:(NSString *)clientId storage:(id)storage; - (nullable NSString *)apnsDeviceToken; - (void)setAndPersistAPNSDeviceToken:(nullable NSString *)deviceToken; diff --git a/Source/ARTLocalDevice.m b/Source/ARTLocalDevice.m index e0df4c325..0141ad22f 100644 --- a/Source/ARTLocalDevice.m +++ b/Source/ARTLocalDevice.m @@ -5,6 +5,13 @@ #import "ARTDeviceStorage.h" #import "ARTDeviceIdentityTokenDetails.h" #import "ARTCrypto+Private.h" +#import "ARTPushActivationStateMachine+Private.h" +#import "ARTPushActivationState.h" + +NSString *const ARTDeviceIdKey = @"ARTDeviceId"; +NSString *const ARTDeviceSecretKey = @"ARTDeviceSecret"; +NSString *const ARTDeviceIdentityTokenKey = @"ARTDeviceIdentityToken"; +NSString *const ARTAPNSDeviceTokenKey = @"ARTAPNSDeviceToken"; NSString *const ARTDevicePlatform = @"ios"; @@ -50,7 +57,7 @@ + (ARTLocalDevice *)load:(NSString *)clientId storage:(id)stor #else device.formFactor = ARTDeviceFormFactor; #endif - device.push.recipient[@"transportType"] = ARTDevicePushTransportType; + device.pushRecipient[@"transportType"] = ARTDevicePushTransportType; NSString *deviceId = [storage objectForKey:ARTDeviceIdKey]; NSString *deviceSecret = deviceId == nil ? nil : [storage secretForDevice:deviceId]; @@ -86,11 +93,27 @@ + (NSString *)generateSecret { } - (NSString *)apnsDeviceToken { - return self.push.recipient[@"deviceToken"]; + return self.pushRecipient[@"deviceToken"]; +} + +#if TARGET_OS_IOS + +- (ARTErrorInfo *)activationError { + NSData *errorData = [_storage objectForKey:ARTPushActivationErrorInfoKey]; + ARTErrorInfo* errorInfo = [ARTErrorInfo art_unarchiveFromData:errorData]; + return errorInfo; } +- (ARTPushActivationState *)activationState { + NSData *stateData = [_storage objectForKey:ARTPushActivationCurrentStateKey]; + ARTPushActivationState* state = [ARTPushActivationState art_unarchiveFromData:stateData]; + return state; +} + +#endif + - (void)setAPNSDeviceToken:(NSString *_Nonnull)token { - self.push.recipient[@"deviceToken"] = token; + self.pushRecipient[@"deviceToken"] = token; } - (void)setAndPersistAPNSDeviceToken:(NSString *)token { diff --git a/Source/ARTPush.m b/Source/ARTPush.m index f8f8ef585..50be510ca 100644 --- a/Source/ARTPush.m +++ b/Source/ARTPush.m @@ -65,11 +65,6 @@ - (void)deactivate { @end -NSString *const ARTDeviceIdKey = @"ARTDeviceId"; -NSString *const ARTDeviceSecretKey = @"ARTDeviceSecret"; -NSString *const ARTDeviceIdentityTokenKey = @"ARTDeviceIdentityToken"; -NSString *const ARTAPNSDeviceTokenKey = @"ARTAPNSDeviceToken"; - @implementation ARTPushInternal { __weak ARTRestInternal *_rest; // weak because rest owns self ARTLog *_logger; diff --git a/Source/ARTPushActivationState.h b/Source/ARTPushActivationState.h index 5627d832b..ef4be0299 100644 --- a/Source/ARTPushActivationState.h +++ b/Source/ARTPushActivationState.h @@ -25,6 +25,9 @@ NS_ASSUME_NONNULL_BEGIN /// Persistent State @interface ARTPushActivationPersistentState : ARTPushActivationState + +- (BOOL)isFailed; + @end #pragma mark - States diff --git a/Source/ARTPushActivationState.m b/Source/ARTPushActivationState.m index 8a97c088e..83802bb5e 100644 --- a/Source/ARTPushActivationState.m +++ b/Source/ARTPushActivationState.m @@ -68,6 +68,11 @@ + (ARTPushActivationState *)unarchive:(NSData *)data { #pragma mark - Persistent State @implementation ARTPushActivationPersistentState + +- (BOOL)isFailed { + return [self isKindOfClass:[ARTPushActivationStateAfterRegistrationSyncFailed class]] || [self isKindOfClass:[ARTPushActivationEventDeregistrationFailed class]]; +} + @end #pragma mark - Activation States diff --git a/Source/ARTPushActivationStateMachine+Private.h b/Source/ARTPushActivationStateMachine+Private.h index 32a0d385e..391278635 100644 --- a/Source/ARTPushActivationStateMachine+Private.h +++ b/Source/ARTPushActivationStateMachine+Private.h @@ -7,6 +7,7 @@ NS_ASSUME_NONNULL_BEGIN extern NSString *const ARTPushActivationCurrentStateKey; extern NSString *const ARTPushActivationPendingEventsKey; +extern NSString *const ARTPushActivationErrorInfoKey; @interface ARTPushActivationStateMachine () @@ -24,6 +25,8 @@ extern NSString *const ARTPushActivationPendingEventsKey; @property (readonly, nonatomic) ARTPushActivationState *current_nosync; - (void)registerForAPNS; +- (void)saveErrorInfo:(ARTErrorInfo *)errorInfo; +- (void)clearErrorInfo; @end diff --git a/Source/ARTPushActivationStateMachine.m b/Source/ARTPushActivationStateMachine.m index a1ec4894c..95596179f 100644 --- a/Source/ARTPushActivationStateMachine.m +++ b/Source/ARTPushActivationStateMachine.m @@ -20,6 +20,7 @@ NSString *const ARTPushActivationCurrentStateKey = @"ARTPushActivationCurrentState"; NSString *const ARTPushActivationPendingEventsKey = @"ARTPushActivationPendingEvents"; +NSString *const ARTPushActivationErrorInfoKey = @"ARTPushActivationErrorInfo"; @implementation ARTPushActivationStateMachine { ARTPushActivationEvent *_lastHandledEvent; @@ -127,6 +128,11 @@ - (void)handleEvent:(nonnull ARTPushActivationEvent *)event { } [self persist]; + + if ([event isKindOfClass:[ARTPushActivationErrorEvent class]]) { + ARTPushActivationErrorEvent* errorEvent = (ARTPushActivationErrorEvent *)event; + [self saveErrorInfo:errorEvent.error]; + } } - (void)persist { @@ -137,6 +143,14 @@ - (void)persist { [self.rest.storage setObject:[_pendingEvents art_archive] forKey:ARTPushActivationPendingEventsKey]; } +- (void)saveErrorInfo:(ARTErrorInfo *)errorInfo { + [_rest.storage setObject:[errorInfo art_archive] forKey:ARTPushActivationErrorInfoKey]; +} + +- (void)clearErrorInfo { + [_rest.storage setObject:nil forKey:ARTPushActivationErrorInfoKey]; +} + - (void)deviceRegistration:(ARTErrorInfo *)error { #if TARGET_OS_IOS ARTLocalDevice *local = _rest.device_nosync; @@ -231,7 +245,7 @@ - (void)deviceUpdateRegistration:(ARTErrorInfo *)error { request.HTTPMethod = @"PATCH"; request.HTTPBody = [[_rest defaultEncoder] encode:@{ @"push": @{ - @"recipient": local.push.recipient + @"recipient": local.pushRecipient } } error:nil]; [request setValue:[[_rest defaultEncoder] mimeType] forHTTPHeaderField:@"Content-Type"]; diff --git a/Source/ARTPushChannel.m b/Source/ARTPushChannel.m index 0729c5298..3d2e6b1f5 100644 --- a/Source/ARTPushChannel.m +++ b/Source/ARTPushChannel.m @@ -9,6 +9,7 @@ #import "ARTChannel+Private.h" #import "ARTLocalDevice+Private.h" #import "ARTNSMutableRequest+ARTPush.h" +#import "ARTPushActivationState.h" @implementation ARTPushChannel { ARTQueuedDealloc *_dealloc; @@ -298,15 +299,18 @@ - (BOOL)listSubscriptions:(NSStringDictionary *)params } - (ARTLocalDevice *)getDevice:(ARTCallback)callback { - #if TARGET_OS_IOS +#if TARGET_OS_IOS ARTLocalDevice *device = [_rest device_nosync]; - #else - ARTLocalDevice *device = nil; - #endif if (![device isRegistered]) { - if (callback) callback([ARTErrorInfo createWithCode:0 message:@"cannot use device before device activation has finished"]); + if (callback) { + ARTErrorInfo* errorInfo = device.activationState.isFailed ? device.activationError : [ARTErrorInfo createWithCode:0 message:@"cannot use device before device activation has finished"]; + callback(errorInfo); + } } return device; +#else + return nil; +#endif } - (NSString *)getClientId:(ARTCallback)callback { diff --git a/Source/ARTPushDeviceRegistrations.h b/Source/ARTPushDeviceRegistrations.h index f348d75b5..6b5c11995 100644 --- a/Source/ARTPushDeviceRegistrations.h +++ b/Source/ARTPushDeviceRegistrations.h @@ -12,11 +12,12 @@ NS_ASSUME_NONNULL_BEGIN - (void)save:(ARTDeviceDetails *)deviceDetails callback:(ARTCallback)callback; -- (void)get:(ARTDeviceId *)deviceId callback:(void (^)(ARTDeviceDetails *_Nullable, ARTErrorInfo *_Nullable))callback; +- (void)get:(ARTDeviceId *)deviceId callback:(ARTDeviceDetailsCallback)callback; - (void)list:(NSStringDictionary *)params callback:(ARTPaginatedDeviceDetailsCallback)callback; - (void)remove:(NSString *)deviceId callback:(ARTCallback)callback; + - (void)removeWhere:(NSStringDictionary *)params callback:(ARTCallback)callback; @end diff --git a/Source/ARTPushDeviceRegistrations.m b/Source/ARTPushDeviceRegistrations.m index da7d2acd4..1b02c2580 100644 --- a/Source/ARTPushDeviceRegistrations.m +++ b/Source/ARTPushDeviceRegistrations.m @@ -28,7 +28,7 @@ - (void)save:(ARTDeviceDetails *)deviceDetails callback:(ARTCallback)callback { [_internal save:deviceDetails callback:callback]; } -- (void)get:(ARTDeviceId *)deviceId callback:(void (^)(ARTDeviceDetails *_Nullable, ARTErrorInfo *_Nullable))callback { +- (void)get:(ARTDeviceId *)deviceId callback:(ARTDeviceDetailsCallback)callback { [_internal get:deviceId callback:callback]; } @@ -94,13 +94,13 @@ - (void)save:(ARTDeviceDetails *)deviceDetails callback:(ARTCallback)callback { [self->_rest executeRequest:request withAuthOption:ARTAuthenticationOn completion:^(NSHTTPURLResponse *response, NSData *data, NSError *error) { if (response.statusCode == 200 /*OK*/) { NSError *decodeError = nil; - ARTDeviceDetails *deviceDetails = [[self->_rest defaultEncoder] decodeDeviceDetails:data error:&decodeError]; + ARTDeviceDetailsResponse *response = [[self->_rest defaultEncoder] decodeDeviceDetailsResponse:data error:&decodeError]; if (decodeError) { [self->_logger debug:__FILE__ line:__LINE__ message:@"%@: decode device failed (%@)", NSStringFromClass(self.class), error.localizedDescription]; callback([ARTErrorInfo createFromNSError:decodeError]); } else { - [self->_logger debug:__FILE__ line:__LINE__ message:@"%@: successfully saved device %@", NSStringFromClass(self.class), deviceDetails.id]; + [self->_logger debug:__FILE__ line:__LINE__ message:@"%@: successfully saved device %@", NSStringFromClass(self.class), response.deviceDetails.id]; callback(nil); } } @@ -117,12 +117,12 @@ - (void)save:(ARTDeviceDetails *)deviceDetails callback:(ARTCallback)callback { }); } -- (void)get:(ARTDeviceId *)deviceId callback:(void (^)(ARTDeviceDetails *, ARTErrorInfo *))callback { +- (void)get:(ARTDeviceId *)deviceId callback:(ARTDeviceDetailsCallback)callback { if (callback) { - void (^userCallback)(ARTDeviceDetails *, ARTErrorInfo *error) = callback; - callback = ^(ARTDeviceDetails *device, ARTErrorInfo *error) { + ARTDeviceDetailsCallback userCallback = callback; + callback = ^(ARTDeviceDetailsResponse *response, ARTErrorInfo *error) { dispatch_async(self->_userQueue, ^{ - userCallback(device, error); + userCallback(response, error); }); }; } @@ -142,14 +142,14 @@ - (void)get:(ARTDeviceId *)deviceId callback:(void (^)(ARTDeviceDetails *, ARTEr [self->_rest executeRequest:request withAuthOption:ARTAuthenticationOn completion:^(NSHTTPURLResponse *response, NSData *data, NSError *error) { if (response.statusCode == 200 /*OK*/) { NSError *decodeError = nil; - ARTDeviceDetails *device = [self->_rest.encoders[response.MIMEType] decodeDeviceDetails:data error:&decodeError]; + ARTDeviceDetailsResponse *detailsResponse = [self->_rest.encoders[response.MIMEType] decodeDeviceDetailsResponse:data error:&decodeError]; if (decodeError) { [self->_logger debug:__FILE__ line:__LINE__ message:@"%@: decode device failed (%@)", NSStringFromClass(self.class), error.localizedDescription]; callback(nil, [ARTErrorInfo createFromNSError:decodeError]); } - else if (device) { + else if (detailsResponse) { [self->_logger debug:__FILE__ line:__LINE__ message:@"%@: get device successfully", NSStringFromClass(self.class)]; - callback(device, nil); + callback(detailsResponse, nil); } else { [self->_logger debug:__FILE__ line:__LINE__ message:@"%@: get device failed with unknown error", NSStringFromClass(self.class)]; diff --git a/Source/ARTTypes.h b/Source/ARTTypes.h index 4166b25c1..4d69328ee 100644 --- a/Source/ARTTypes.h +++ b/Source/ARTTypes.h @@ -16,6 +16,7 @@ @class ARTStats; @class ARTPushChannelSubscription; @class ARTDeviceDetails; +@class ARTDeviceDetailsResponse; @protocol ARTTokenDetailsCompatible; // More context @@ -267,6 +268,7 @@ typedef void (^ARTPresenceMessagesCallback)(NSArray *_Null typedef void (^ARTStatusCallback)(ARTStatus *status); typedef void (^ARTURLRequestCallback)(NSHTTPURLResponse *_Nullable result, NSData *_Nullable data, NSError *_Nullable error); +typedef void (^ARTDeviceDetailsCallback)(ARTDeviceDetailsResponse *_Nullable result, ARTErrorInfo *_Nullable error); typedef void (^ARTTokenDetailsCallback)(ARTTokenDetails *_Nullable result, NSError *_Nullable error); typedef void (^ARTTokenDetailsCompatibleCallback)(id _Nullable result, NSError *_Nullable error); typedef void (^ARTAuthCallback)(ARTTokenParams *params, ARTTokenDetailsCompatibleCallback callback); diff --git a/Spec/Tests/PushAdminTests.swift b/Spec/Tests/PushAdminTests.swift index 22a6e7c4f..458b05a17 100644 --- a/Spec/Tests/PushAdminTests.swift +++ b/Spec/Tests/PushAdminTests.swift @@ -27,7 +27,7 @@ class PushAdminTests: XCTestCase { deviceDetails.platform = "ios" deviceDetails.formFactor = "phone" deviceDetails.metadata = [String : String]() - deviceDetails.push.recipient = [ + deviceDetails.pushRecipient = [ "transportType": "apns", "deviceToken": "foo", ] @@ -40,7 +40,7 @@ class PushAdminTests: XCTestCase { deviceDetails.formFactor = "tablet" deviceDetails.clientId = "clientA" deviceDetails.metadata = [String : String]() - deviceDetails.push.recipient = [ + deviceDetails.pushRecipient = [ "transportType": "gcm", "registrationToken": "qux", ] @@ -53,7 +53,7 @@ class PushAdminTests: XCTestCase { deviceDetails.formFactor = "tablet" deviceDetails.clientId = "clientA" deviceDetails.metadata = [String : String]() - deviceDetails.push.recipient = [ + deviceDetails.pushRecipient = [ "transportType": "gcm", "registrationToken": "qux", ] @@ -66,7 +66,7 @@ class PushAdminTests: XCTestCase { deviceDetails.formFactor = "tablet" deviceDetails.clientId = "clientB" deviceDetails.metadata = [String : String]() - deviceDetails.push.recipient = [ + deviceDetails.pushRecipient = [ "transportType": "gcm", "registrationToken": "qux", ] @@ -332,11 +332,11 @@ class PushAdminTests: XCTestCase { let realtime = ARTRealtime(options: AblyTests.commonAppSetup()) defer { realtime.dispose(); realtime.close() } waitUntil(timeout: testTimeout) { done in - realtime.push.admin.deviceRegistrations.get("testDeviceDetails") { device, error in - guard let device = device else { + realtime.push.admin.deviceRegistrations.get("testDeviceDetails") { response, error in + guard let deviceDetails = response?.deviceDetails else { fail("Device is missing"); done(); return } - expect(device).to(equal(Self.deviceDetails)) + expect(deviceDetails).to(equal(Self.deviceDetails)) expect(error).to(beNil()) done() }