@@ -28,6 +28,7 @@ @implementation IAPProduct
28
28
const NSString * kStateReadyForSale = @" ReadyForSale" ;
29
29
const NSString * kStatePurchased = @" Purchased" ;
30
30
const NSString * kStatePurchasing = @" Purchasing" ;
31
+ const NSString * kStateRestoring = @" Restoring" ;
31
32
const NSString * kStateRestored = @" Restored" ;
32
33
const NSString * kStateError = @" Error" ;
33
34
const NSString * kEventSetPrice = @" SetPrice" ;
@@ -37,6 +38,8 @@ @implementation IAPProduct
37
38
const NSString * kEventSetPurchasing = @" SetPurchasing" ;
38
39
const NSString * kEventRecoverToReadyForSale = @" RecoverToReadyForSale" ;
39
40
const NSString * kEventRecoverToLoading = @" RecoverToLoading" ;
41
+ const NSString * kEventRestoreStarted = @" RestoreStarted" ;
42
+ const NSString * kEventRestoreEnded = @" RestoreStarted" ;
40
43
41
44
- (id )initWithCatalogue : (IAPCatalogue*)catalogue identifier : (NSString *)identifier settings : (NSUserDefaults *)settings {
42
45
self = [super init ];
@@ -69,8 +72,14 @@ - (void)loadStateMachine:(const NSString*)initialState {
69
72
[self .stateMachine addTransition: kEventSetPurchasing startState: kStateReadyForSale endState: kStatePurchasing ];
70
73
[self .stateMachine addTransition: kEventSetError startState: kStateLoading endState: kStateError ];
71
74
[self .stateMachine addTransition: kEventSetError startState: kStatePurchasing endState: kStateError ];
75
+ [self .stateMachine addTransition: kEventSetError startState: kStateRestoring endState: kStateError ];
72
76
[self .stateMachine addTransition: kEventSetPurchased startState: kStatePurchasing endState: kStatePurchased ];
77
+ [self .stateMachine addTransition: kEventSetRestored startState: kStateLoading endState: kStateRestored ];
78
+ [self .stateMachine addTransition: kEventSetRestored startState: kStateReadyForSale endState: kStateRestored ];
73
79
[self .stateMachine addTransition: kEventSetRestored startState: kStatePurchasing endState: kStateRestored ];
80
+ [self .stateMachine addTransition: kEventSetRestored startState: kStateRestoring endState: kStateRestored ];
81
+ [self .stateMachine addTransition: kEventRestoreStarted startState: kStateReadyForSale endState: kStateRestoring ];
82
+ [self .stateMachine addTransition: kEventRestoreEnded startState: kStateRestoring endState: kStateReadyForSale ];
74
83
75
84
[self .stateMachine addObserver: self forKeyPath: @" state" options: NSKeyValueObservingOptionNew context: nil ];
76
85
self.state = self.stateMachine .state ;
@@ -126,6 +135,23 @@ - (void)updateWithSKPayment:(SKPayment*)skPayment {
126
135
[self save ];
127
136
}
128
137
138
+ - (void )restoreStarted {
139
+ [self .stateMachine applyEvent: kEventRestoreStarted ];
140
+ }
141
+
142
+ - (void )restoreFailedWithError : (NSError *)error {
143
+ if (self.state == kStateRestoring ) {
144
+ [self .stateMachine applyEvent: kEventSetError ];
145
+ [self .stateMachine applyEvent: kEventRecoverToReadyForSale ];
146
+ }
147
+ }
148
+
149
+ - (void )restoreEnded {
150
+ if (self.state == kStateRestoring ) {
151
+ [self .stateMachine applyEvent: kEventRestoreEnded ];
152
+ }
153
+ }
154
+
129
155
- (NSString *)settingsKey : (NSString *)setting {
130
156
return [NSString stringWithFormat: @" IAP%@%@ " , self .identifier, setting];
131
157
}
@@ -184,10 +210,18 @@ - (BOOL)isRestored {
184
210
return [self .stateMachine isInState: kStateRestored ];
185
211
}
186
212
213
+ - (BOOL )isRestoring {
214
+ return [self .stateMachine isInState: kStateRestoring ];
215
+ }
216
+
187
217
- (void )purchase {
188
218
[self .catalogue purchaseProduct: self ];
189
219
}
190
220
221
+ - (void )restorePurchase {
222
+ [self .catalogue restoreProduct: self ];
223
+ }
224
+
191
225
- (void )addObserver : (id <IAPProductObserver>)iapProductObserver {
192
226
[self .observers addObject: [NSValue valueWithNonretainedObject: iapProductObserver]];
193
227
[self cleanEmptyObservers ];
@@ -201,26 +235,8 @@ - (void)removeObserver:(id<IAPProductObserver>)iapProductObserver {
201
235
- (void )notifyObserversOfStateChange {
202
236
for (NSValue * observer in self.observers ) {
203
237
id <IAPProductObserver> iapProductObserver = [observer nonretainedObjectValue ];
204
- if (!iapProductObserver)
205
- continue ;
206
-
207
- if (self.isLoading && [iapProductObserver respondsToSelector: @selector (iapProductJustStartedLoading:: )]) {
208
- [iapProductObserver iapProductJustStartedLoading: self ];
209
- }
210
- else if (self.isError && [iapProductObserver respondsToSelector: @selector (iapProductJustErrored: )]) {
211
- [iapProductObserver iapProductJustErrored: self ];
212
- }
213
- else if (self.isReadyForSale && [iapProductObserver respondsToSelector: @selector (iapProductJustBecameReadyForSale: )]) {
214
- [iapProductObserver iapProductJustBecameReadyForSale: self ];
215
- }
216
- else if (self.isPurchased && [iapProductObserver respondsToSelector: @selector (iapProductWasJustPurchased: )]) {
217
- [iapProductObserver iapProductWasJustPurchased: self ];
218
- }
219
- else if (self.isPurchasing && [iapProductObserver respondsToSelector: @selector (iapProductIsPurchasing: )]) {
220
- [iapProductObserver iapProductIsPurchasing: self ];
221
- }
222
- else if (self.isRestored && [iapProductObserver respondsToSelector: @selector (iapProductWasJustRestored: )]) {
223
- [iapProductObserver iapProductWasJustRestored: self ];
238
+ if (iapProductObserver && [iapProductObserver respondsToSelector: @selector (iapProductWasUpdated: )]) {
239
+ [iapProductObserver iapProductWasUpdated: self ];
224
240
}
225
241
}
226
242
0 commit comments