Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Consumable product is acting strange and making duplicate requests.. What could be the cause?

I am doing in app purchase on two of my controllers say view1,view2.

when I buy a consumable product in view1 everything works fine.

but when I buy another consumable product on view2 after the transaction is complete it fires the old request I made on view1 and not the new view2 request. And vice versa

Also if I rebuy the same product from same controller after rebuying it makes the request which I made before it...

Example:

Controller1:

product1  > buy > someaction(say hit to the server with some params like "name= ABC")
user enters name and is dynamic


Again,

if I rebuy it
product1  > buy > someaction(say hit to the server with some params like "name= XYZ")

Now when product is bought it hits the server with old params "name=ABC" and not "name=XYZ"    what user enters again..

product

    **heres the code m using in my IAPhelper** 

        - (id)initWithProductIdentifiers:(NSSet *)productIdentifiers {
        if ((self = [super init])) {

            // Store product identifiers
            _productIdentifiers = [productIdentifiers retain];

            // Check for previously purchased products
            NSMutableSet * purchasedProducts = [NSMutableSet set];
            for (NSString * productIdentifier in _productIdentifiers) {
                BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier];
                if (productPurchased) {
                    [purchasedProducts addObject:productIdentifier];
                    NSLog(@"Previously purchased: %@", productIdentifier);
                }
                NSLog(@"Not purchased: %@", productIdentifier);
            }
            self.purchasedProducts = purchasedProducts;

        }
        return self;
    }

    - (void)requestProducts {

        self.request = [[[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers] autorelease];
        _request.delegate = self;
        [_request start];

    }

    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

        NSLog(@"Received products results...");   
        self.products = response.products;
        self.request = nil;    

        [[NSNotificationCenter defaultCenter] postNotificationName:kProductsLoadedNotification object:_products];    
    }

    - (void)recordTransaction:(SKPaymentTransaction *)transaction {    
        // TODO: Record the transaction on the server side...    
    }

    - (void)provideContent:(NSString *)productIdentifier {

        NSLog(@"Toggling flag for: %@", productIdentifier);
        [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:productIdentifier];
        [[NSUserDefaults standardUserDefaults] synchronize];
       // [_purchasedProducts addObject:productIdentifier];

        [[NSNotificationCenter defaultCenter] postNotificationName:kProductPurchasedNotification object:productIdentifier];

    }

    - (void)completeTransaction:(SKPaymentTransaction *)transaction {

        NSLog(@"completeTransaction...");

        [self recordTransaction: transaction];
        [self provideContent: transaction.payment.productIdentifier];
        [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

    }

    - (void)restoreTransaction:(SKPaymentTransaction *)transaction {

        NSLog(@"restoreTransaction...");

        [self recordTransaction: transaction];
        [self provideContent: transaction.originalTransaction.payment.productIdentifier];
        [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

    }

    - (void)failedTransaction:(SKPaymentTransaction *)transaction {

        if (transaction.error.code != SKErrorPaymentCancelled)
        {
            NSLog(@"Transaction error: %@", transaction.error.localizedDescription);
        }

        [[NSNotificationCenter defaultCenter] postNotificationName:kProductPurchaseFailedNotification object:transaction];

        [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

    }

    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
    {
        for (SKPaymentTransaction *transaction in transactions)
        {
            switch (transaction.transactionState)
            {
                case SKPaymentTransactionStatePurchased:
                    [self completeTransaction:transaction];
                    break;
                case SKPaymentTransactionStateFailed:
                    [self failedTransaction:transaction];
                    break;
                case SKPaymentTransactionStateRestored:
                    [self restoreTransaction:transaction];
                default:
                    break;
            }
        }
    }

    - (void)buyProductIdentifier:(NSString *)productIdentifier {

        NSLog(@"Buying in IAPHelper %@...", productIdentifier);

        SKPayment *payment = [SKPayment paymentWithProductIdentifier:productIdentifier];
        [[SKPaymentQueue defaultQueue] addPayment:payment];

    }

    - (void)dealloc
    {
        [_productIdentifiers release];
        _productIdentifiers = nil;
        [_products release];
        _products = nil;
        [_purchasedProducts release];
        _purchasedProducts = nil;
        [_request release];
        _request = nil;
        [super dealloc];
    }

    @end


    **heres the code m using in my view1controller**


        -(void)viewDidAppear:(BOOL)animated
    {

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(productPurchased:) name:kProductPurchasedNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(productPurchaseFailed:) name:kProductPurchaseFailedNotification object: nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(productsLoaded:) name:kProductsLoadedNotification object:nil];

        Reachability *reach = [Reachability reachabilityForInternetConnection]; 
        NetworkStatus netStatus = [reach currentReachabilityStatus];    
        if (netStatus == NotReachable) {        
            NSLog(@"No internet connection!");        
        } else {        
            if ([InAppRageIAPHelper sharedHelper].products == nil) {

                [[InAppRageIAPHelper sharedHelper] requestProducts];
                //            self.hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
                _hud.labelText = @"Loading comics...";
                //            [self performSelector:@selector(timeout:) withObject:nil afterDelay:30.0];

            }        
        }
    }
    - (void)productPurchased:(NSNotification *)notification {


        [self removeLoader];
        [NSObject cancelPreviousPerformRequestsWithTarget:self];

        NSString *productIdentifier = (NSString *) notification.object;
        NSLog(@"Purchased: %@", productIdentifier);

        NSString *inaapstatus =[[NSUserDefaults standardUserDefaults] objectForKey:@"inaapstatus"];

        if ([inaapstatus isEqualToString:@"addabeep"]) {


            NSUserDefaults *inaapstatus = [NSUserDefaults standardUserDefaults];
            [inaapstatus setValue:@"reset" forKey:@"inaapstatus"];
            [[NSUserDefaults standardUserDefaults]synchronize];
            if ([productIdentifier isEqualToString:@"com.beepbXXXXXXXX"]) {
                duration = @"30";


                NSUserDefaults *purchased = [NSUserDefaults standardUserDefaults];
                [purchased setValue:@"YES" forKey:@"purchased"];
                [[NSUserDefaults standardUserDefaults] synchronize];
                [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(purchased:) userInfo:nil repeats:NO];

            }
            else  {
                duration = @"7";
                NSUserDefaults *purchased = [NSUserDefaults standardUserDefaults];
                [purchased setValue:@"YES" forKey:@"purchased"];
                [[NSUserDefaults standardUserDefaults] synchronize];
                [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(purchased:) userInfo:nil repeats:NO];

            }
        }
        else
        {

        }    
    //     [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(makeMyBeeps1Request:) userInfo:nil repeats:NO];

    }
    -(void)purchased:(NSTimer *)timer
    {

        NSString *purchased =[[NSUserDefaults standardUserDefaults] objectForKey:@"purchased" ];
        if ([purchased isEqualToString:@"YES"]) {
            [self doLogin];
            NSUserDefaults *purchased1 = [NSUserDefaults standardUserDefaults];
            [purchased1 setValue:@"NO" forKey:@"purchased"];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }

    }
    - (void)productPurchaseFailed:(NSNotification *)notification {
        [self removeLoader];
        [NSObject cancelPreviousPerformRequestsWithTarget:self];
        //    [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];

        SKPaymentTransaction * transaction = (SKPaymentTransaction *) notification.object;    
        if (transaction.error.code != SKErrorPaymentCancelled) {    
            UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Oops error occcured!" 
                                                             message:transaction.error.localizedDescription 
                                                            delegate:nil 
                                                   cancelButtonTitle:nil 
                                                   otherButtonTitles:@"OK", nil] autorelease];

            [alert show];
            //[alert release];
        }

    }
    - (void)dismissHUD:(id)arg {

        NSLog(@"dismissHUD");
        [self removeLoader];
    }

    - (void)productsLoaded:(NSNotification *)notification {

        [NSObject cancelPreviousPerformRequestsWithTarget:self];
        //    [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];

        [self removeLoader];

    }

    - (void)timeout:(id)arg {


        UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Timeout!" 
                                                         message:@"Please try again later."

                                                        delegate:nil 
                                               cancelButtonTitle:nil 
                                               otherButtonTitles:@"OK", nil] autorelease];

        [alert show];
        // [alert release];


        //[self performSelector:@selector(dismissHUD:) withObject:nil afterDelay:3.0];

    }
    // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    - (void)viewDidLoad {

        //self.hud = nil;
        //        self.table.hidden = TRUE;
        inappObserver = [[InAppPurchaseObserver alloc] init];

        if ([SKPaymentQueue canMakePayments]) {
            // Yes, In-App Purchase is enabled on this device!
            // Proceed to fetch available In-App Purchase items.

            // Replace "Your IAP Product ID" with your actual In-App Purchase Product ID,
            // fetched from either a remote server or stored locally within your app. 
            SKProductsRequest *prodRequest= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObjects:@"com.beepccccceek1",@"com.beepbcccccnth1", nil ]];
            prodRequest.delegate = self;
            [prodRequest start];


        } else {
            // Notify user that In-App Purchase is disabled via button text.
            [inappButton setTitle:@"In-App Purchase is Disabled" forState:UIControlStateNormal];
            inappButton.enabled = NO;
        }   



        [super viewDidLoad];
        [self initializeView];

    }




**view2 controller**

#pragma mark - View lifecycle
-(void)viewDidAppear:(BOOL)animated
{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(productPurchased:) name:kProductPurchasedNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(productPurchaseFailed:) name:kProductPurchaseFailedNotification object: nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(productsLoaded:) name:kProductsLoadedNotification object:nil];
    Reachability *reach = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus netStatus = [reach currentReachabilityStatus];    
    if (netStatus == NotReachable) {        
        NSLog(@"No internet connection!");        
    } else {        
        if ([InAppRageIAPHelper sharedHelper].products == nil) {

            [[InAppRageIAPHelper sharedHelper] requestProducts];
            //            self.hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
                        [self performSelector:@selector(timeout:) withObject:nil afterDelay:30.0];

        }        
    }

}
- (void)viewDidLoad
{
    inappObserver = [[InAppPurchaseObserver alloc] init];

    if ([SKPaymentQueue canMakePayments]) {
        // Yes, In-App Purchase is enabled on this device!
        // Proceed to fetch available In-App Purchase items.

        // Replace "Your IAP Product ID" with your actual In-App Purchase Product ID,
        // fetched from either a remote server or stored locally within your app. 
        SKProductsRequest *prodRequest= [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObjects:@"com.beepbccccecc1",@"com.beepcccp.month1",@"com.beeccccep.free", nil ]];
        prodRequest.delegate = self;
        [prodRequest start];

    } else {
        // Notify user that In-App Purchase is disabled via button text.
        [inappButton setTitle:@"In-App Purchase is Disabled" forState:UIControlStateNormal];
        inappButton.enabled = NO;
    }   

    [super viewDidLoad];
    [self initializeView];
    [[UIApplication sharedApplication] setStatusBarHidden:NO];

}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    self.mTableView = nil;
    self.numberofbeeps = nil;
    self.segmentedControl = nil;

}
- (void)productPurchased:(NSNotification *)notification {


    [self removeLoader];
    [NSObject cancelPreviousPerformRequestsWithTarget:self];

    NSString *productIdentifier = (NSString *) notification.object;
    NSLog(@"Purchased: %@", productIdentifier);

    NSString *inaapstatus =[[NSUserDefaults standardUserDefaults] objectForKey:@"inaapstatus"];

    if ([inaapstatus isEqualToString:@"expired"]) {


        NSUserDefaults *inaapstatus = [NSUserDefaults standardUserDefaults];
        [inaapstatus setValue:@"reset" forKey:@"inaapstatus"];
        [[NSUserDefaults standardUserDefaults]synchronize];
    if ([productIdentifier isEqualToString:@"com.beepbccccnth1"]) {
        duration = @"30";


        NSUserDefaults *purchased = [NSUserDefaults standardUserDefaults];
        [purchased setValue:@"YES" forKey:@"purchased"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(purchased:) userInfo:nil repeats:NO];

    }
    else  {
        duration = @"7";
        NSUserDefaults *purchased = [NSUserDefaults standardUserDefaults];
        [purchased setValue:@"YES" forKey:@"purchased"];
         [[NSUserDefaults standardUserDefaults] synchronize];
        [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(purchased:) userInfo:nil repeats:NO];

    }
    }
    else
    {

    }
    [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(makeMyBeeps1Request:) userInfo:nil repeats:NO];


}

-(void)purchased:(NSTimer *)timer
{
NSString *purchased =[[NSUserDefaults standardUserDefaults] objectForKey:@"purchased" ];
    if ([purchased isEqualToString:@"YES"]) {

        [self durationRequest];
        NSUserDefaults *purchased = [NSUserDefaults standardUserDefaults];
        [purchased setValue:@"NO" forKey:@"purchased"];
         [[NSUserDefaults standardUserDefaults] synchronize];
    }

}
- (void)productPurchaseFailed:(NSNotification *)notification {
    [self removeLoader];
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    //    [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];

    SKPaymentTransaction * transaction = (SKPaymentTransaction *) notification.object;    
    if (transaction.error.code != SKErrorPaymentCancelled) {    
        UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Oops error occcured!" 
                                                         message:transaction.error.localizedDescription 
                                                        delegate:nil 
                                               cancelButtonTitle:nil 
                                               otherButtonTitles:@"OK", nil] autorelease];

        [alert show];
        //[alert release];
    }

}
- (void)dismissHUD:(id)arg {

    NSLog(@"dismissHUD");
    [self removeLoader];
}

- (void)productsLoaded:(NSNotification *)notification {

    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    //    [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];

    [self removeLoader];

}

- (void)timeout:(id)arg {


    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Timeout!" 
                                                     message:@"Please try again later."

                                                    delegate:nil 
                                           cancelButtonTitle:nil 
                                           otherButtonTitles:@"OK", nil] autorelease];

    [alert show];
    // [alert release];


    //[self performSelector:@selector(dismissHUD:) withObject:nil afterDelay:3.0];

}

Any help is appreciated thnx a lot guys

like image 937
iPhoneDev Avatar asked Dec 21 '11 15:12

iPhoneDev


1 Answers

I don't recommend you having more than one active purchase delegate at a time. Try to deactivate the first delegate in view1 after all process succeeds, and then make the purchase in view2, see if that happens again

like image 181
Alex R. R. Avatar answered Oct 12 '22 01:10

Alex R. R.