Reputation: 1212
Hopefully this is enough information to help me solve my problem.
I am setting up In App Purchases via a templated source code that was given to me. In my MKStoreManager.m file, where I set up the featureID's for my in app purchases (Ex: static NSString *featureAId = @"com.logannat.myfirstgameTier1";
)
When clicking on the actual button in the game, a method
- (void) buyFeature:(SKProduct*) product
{
if ([SKPaymentQueue canMakePayments])
{
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
}
ends up getting called. I set a break point, and found the error to be in the last line of that code.
The variables that show up in the break point state are:
I can not seem to figure out what the problem is here. Any help would be much appreciated, thank you.
Upvotes: 3
Views: 531
Reputation: 2186
i do not have swift Right now so i am giving you Xcode code please convert the syntax accordingly its not so difficult. so here is the complete life cycle for the in app purchased. in your header file call these delegates and setup the bool for checking the status of you purchased
like that
#import <UIKit/UIKit.h>
BOOL arefavorite_access;
BOOL areAdsRemoved;
@interface ViewController : UIViewController<SKProductsRequestDelegate, SKPaymentTransactionObserver>{
}
- (IBAction)purchase;
- (IBAction)restore;
- (IBAction)tapsRemoveAds:(id)sender;
@end
one you need to hockup this tapsRemoveAds method on touchupinside of you button selector ant it will start working.
- (IBAction)tapsRemoveAds:(id)sender{
UIButton*btn=(UIButton*)sender;
NSString *featureAId = @"com.logannat.myfirstgameTier1";
NSLog(@"User requests to remove ads");
if([SKPaymentQueue canMakePayments]){
NSLog(@"User can make payments");
SKProductsRequest *productsRequest;
if (btn.tag==1) {
productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject: featureAId]];
_protype= featureAId;
}
productsRequest.delegate = self;
[productsRequest start];
}
else{
NSLog(@"User cannot make payments due to parental controls");
//this is called the user cannot make payments, most likely due to parental controls
}
}
product request method
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
SKProduct *validProduct = nil;
int count = [response.products count];
if(count > 0){
validProduct = [response.products objectAtIndex:0];
NSLog(@"Products Available!");
[self purchase:validProduct];
}
else if(!validProduct){
NSLog(@"No products available");
//this is called if your product id is not valid, this shouldn't be called unless that happens.
}
}
- (IBAction)purchase:(SKProduct *)product{
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (IBAction) restore{
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
NSLog(@"%@",queue );
NSLog(@"Restored Transactions are once again in Queue for purchasing %@",[queue transactions]);
NSMutableArray *purchasedItemIDs = [[NSMutableArray alloc] init];
NSLog(@"received restored transactions: %i", queue.transactions.count);
for (SKPaymentTransaction *transaction in queue.transactions) {
NSString *productID = transaction.payment.productIdentifier;
[purchasedItemIDs addObject:productID];
NSLog (@"product id is %@" , productID);
_protype=productID;
[self doRemoveAds];
// here put an if/then statement to write files based on previously purchased items
// example if ([productID isEqualToString: @"youruniqueproductidentifier]){write files} else { nslog sorry}
}
if(queue.transactions.count==0){
[Utilities showOKAlertWithTitle:@"Restore purchase" message:@"you have no product available for restoration"];
}
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
for(SKPaymentTransaction *transaction in transactions){
switch(transaction.transactionState){
case SKPaymentTransactionStatePurchasing: NSLog(@"Transaction state -> Purchasing");
//called when the user is in the process of purchasing, do not add any of your own code here.
break;
case SKPaymentTransactionStatePurchased:
//this is called when the user has successfully purchased the package (Cha-Ching!)
[self doRemoveAds]; //you can add your code for what you want to happen when the user buys the purchase here, for this tutorial we use removing ads
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
NSLog(@"Transaction state -> Purchased");
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
break;
case SKPaymentTransactionStateRestored:
NSLog(@"Transaction state -> Restored");
_protype=transaction.payment.productIdentifier;
[self doRemoveAds];
//add the same code as you did from SKPaymentTransactionStatePurchased here
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
break;
case SKPaymentTransactionStateFailed:
//called when the transaction does not finish
if(transaction.error.code == SKErrorPaymentCancelled){
NSLog(@"Transaction state -> Cancelled");
//the user cancelled the payment ;(
}
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
break;
}
}
}
- (void)doRemoveAds{
// // [self.bannerView setAlpha:0];
NSString *featureAId = @"com.logannat.myfirstgameTier1";
NSString *featureAIdnumber2 = @"com.logannat.myfirstgameTier2";
if([_protype isEqualToString:featureAId]){
arefavorite_access = YES;
[[NSUserDefaults standardUserDefaults] setBool:arefavorite_access forKey:frareFavoriteRemoved];
[[NSUserDefaults standardUserDefaults] synchronize];
}
else if([_protype isEqualToString: featureAIdnumber2]){
areAdsRemoved = YES;
[[NSUserDefaults standardUserDefaults] setBool:areAdsRemoved forKey:frareAdsRemoved];
[[NSUserDefaults standardUserDefaults] synchronize];
}
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
// [self showpopUp:self];
}
if this answer helps you please vote up and accept the answer
Upvotes: 0