2011-12-21 8 views
6

Robię w zakupie aplikacji na dwóch moich kontrolerów powiedzieć view1, view2.Produkt eksploatacyjny działa dziwnie i wysyła duplikaty żądań. Co może być przyczyną?

kiedy kupuję produkt konsumpcyjny w widoku1 wszystko działa poprawnie.

ale gdy kupuję inny produkt konsumpcyjny na widoku2 po zakończeniu transakcji, odpala stary wniosek, który zrobiłem na widok1, a nie nowe żądanie view2. I vice versa

Także jeśli ja dokupić ten sam produkt z samego kontrolera po rebuying to sprawia, że ​​wniosek, który zrobiłem przed nim ...

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.. 

produkt

**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]; 

} 

Każda pomoc jest mile widziana thnx dużo facetów

+0

Identyfikatory produktów są stosowane prawidłowo, ale nie stwierdzono tutaj. – iPhoneDev

Odpowiedz

1

Nie polecam posiadania więcej niż jednego aktywnego delegata na raz. Spróbuj dezaktywować pierwszego delegata w widoku1 po pomyślnym zakończeniu całego procesu, a następnie dokonaj zakupu w widoku2, zobacz, czy to się powtórzy

+0

używam ich na różnych imprezach ... thnx – iPhoneDev

0

Niestety nie mogłem znaleźć czasu na aktualizację mojej odpowiedzi.

Rozwiązałem go removingObserver o zgłoszenie wysłane zaraz po zakończeniu prośba o ...

Mam nadzieję, że ktoś pomoże ..

Powiązane problemy