Skip to content

Commit bf7ed5e

Browse files
committed
added restore
1 parent 28f01be commit bf7ed5e

File tree

5 files changed

+60
-26
lines changed

5 files changed

+60
-26
lines changed

IAPCatalogue.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
- (void)cancel;
1212
- (IAPProduct*)productForIdentifier:(NSString*)identifier;
1313
- (void)purchaseProduct:(IAPProduct*)product;
14+
- (void)restoreProduct:(IAPProduct*)product;
1415
@end
1516

1617
@protocol IAPCatalogueDelegate <NSObject>

IAPCatalogue.m

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,11 @@ - (void)purchaseProduct:(IAPProduct*)product skProduct:(SKProduct*)skProduct {
148148
[self.paymentQueue addPayment:payment];
149149
}
150150

151+
- (void)restoreProduct:(IAPProduct*)product {
152+
[self.paymentQueue restoreCompletedTransactions];
153+
[product restoreStarted];
154+
}
155+
151156
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
152157
{
153158
for (SKPaymentTransaction *transaction in transactions)
@@ -164,4 +169,16 @@ - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)tran
164169
}
165170
}
166171

172+
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error {
173+
for (IAPProduct* product in self.products) {
174+
[product restoreFailedWithError:error];
175+
}
176+
}
177+
178+
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
179+
for (IAPProduct* product in self.products) {
180+
[product restoreEnded];
181+
}
182+
}
183+
167184
@end

IAPProduct+Friend.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ extern const NSString* kStateRestored;
2020
- (void)updateWithSKProduct:(SKProduct*)skProduct;
2121
- (void)updateWithSKPaymentTransaction:(SKPaymentTransaction*)skTransaction;
2222
- (void)updateWithSKPayment:(SKPayment*)skPayment;
23+
- (void)restoreStarted;
24+
- (void)restoreFailedWithError:(NSError*)error;
25+
- (void)restoreEnded;
2326

2427
@end
2528

IAPProduct.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,16 @@
1111
@property (nonatomic, readonly, assign) BOOL isError;
1212
@property (nonatomic, readonly, assign) BOOL isPurchasing;
1313
@property (nonatomic, readonly, assign) BOOL isRestored;
14+
@property (nonatomic, readonly, assign) BOOL isRestoring;
1415

1516
- (void)addObserver:(id<IAPProductObserver>)iapProductObserver;
1617
- (void)removeObserver:(id<IAPProductObserver>)iapProductObserver;
1718
- (void)purchase;
19+
- (void)restorePurchase;
1820

1921
@end
2022

2123
@protocol IAPProductObserver <NSObject>
2224
@optional
23-
- (void)iapProductJustErrored:(IAPProduct*)iapProduct;
24-
- (void)iapProductJustStartedLoading:(IAPProduct*)iapProduct;
25-
- (void)iapProductJustBecameReadyForSale:(IAPProduct*)iapProduct;
26-
- (void)iapProductWasJustPurchased:(IAPProduct*)iapProduct;
27-
- (void)iapProductWasJustRestored:(IAPProduct*)iapProduct;
28-
- (void)iapProductIsPurchasing:(IAPProduct*)iapProduct;
25+
- (void)iapProductWasUpdated:(IAPProduct*)iapProduct;
2926
@end

IAPProduct.m

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ @implementation IAPProduct
2828
const NSString* kStateReadyForSale = @"ReadyForSale";
2929
const NSString* kStatePurchased = @"Purchased";
3030
const NSString* kStatePurchasing = @"Purchasing";
31+
const NSString* kStateRestoring = @"Restoring";
3132
const NSString* kStateRestored = @"Restored";
3233
const NSString* kStateError = @"Error";
3334
const NSString* kEventSetPrice = @"SetPrice";
@@ -37,6 +38,8 @@ @implementation IAPProduct
3738
const NSString* kEventSetPurchasing = @"SetPurchasing";
3839
const NSString* kEventRecoverToReadyForSale = @"RecoverToReadyForSale";
3940
const NSString* kEventRecoverToLoading = @"RecoverToLoading";
41+
const NSString* kEventRestoreStarted = @"RestoreStarted";
42+
const NSString* kEventRestoreEnded = @"RestoreStarted";
4043

4144
- (id)initWithCatalogue:(IAPCatalogue*)catalogue identifier:(NSString*)identifier settings:(NSUserDefaults*)settings {
4245
self = [super init];
@@ -69,8 +72,14 @@ - (void)loadStateMachine:(const NSString*)initialState {
6972
[self.stateMachine addTransition:kEventSetPurchasing startState:kStateReadyForSale endState:kStatePurchasing];
7073
[self.stateMachine addTransition:kEventSetError startState:kStateLoading endState:kStateError];
7174
[self.stateMachine addTransition:kEventSetError startState:kStatePurchasing endState:kStateError];
75+
[self.stateMachine addTransition:kEventSetError startState:kStateRestoring endState:kStateError];
7276
[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];
7379
[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];
7483

7584
[self.stateMachine addObserver:self forKeyPath:@"state" options:NSKeyValueObservingOptionNew context:nil];
7685
self.state = self.stateMachine.state;
@@ -126,6 +135,23 @@ - (void)updateWithSKPayment:(SKPayment*)skPayment {
126135
[self save];
127136
}
128137

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+
129155
- (NSString*)settingsKey:(NSString*)setting {
130156
return [NSString stringWithFormat:@"IAP%@%@", self.identifier, setting];
131157
}
@@ -184,10 +210,18 @@ - (BOOL)isRestored {
184210
return [self.stateMachine isInState:kStateRestored];
185211
}
186212

213+
- (BOOL)isRestoring {
214+
return [self.stateMachine isInState:kStateRestoring];
215+
}
216+
187217
- (void)purchase {
188218
[self.catalogue purchaseProduct:self];
189219
}
190220

221+
- (void)restorePurchase {
222+
[self.catalogue restoreProduct:self];
223+
}
224+
191225
- (void)addObserver:(id<IAPProductObserver>)iapProductObserver {
192226
[self.observers addObject:[NSValue valueWithNonretainedObject:iapProductObserver]];
193227
[self cleanEmptyObservers];
@@ -201,26 +235,8 @@ - (void)removeObserver:(id<IAPProductObserver>)iapProductObserver {
201235
- (void)notifyObserversOfStateChange {
202236
for (NSValue* observer in self.observers) {
203237
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];
224240
}
225241
}
226242

0 commit comments

Comments
 (0)