iphone - 消费品行为异常并发出重复请求。可能是什么原因?

标签 iphone objective-c xcode in-app-purchase

我正在我的两个 Controller 上进行应用内购买,比如 view1、view2。

当我在 view1 中购买消耗品时,一切正常。

但是当我在交易完成后在 view2 上购买另一个消费品时,它会触发我在 view1 上发出的旧请求,而不是新的 view2 请求。反之亦然

此外,如果我在重新购买后从同一 Controller 重新购买相同的产品,它会发出我之前提出的请求...

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

产品

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

}

非常感谢大家的帮助

最佳答案

我不建议您同时拥有多个活跃的采购代表。尝试在所有过程成功后停用view1中的第一个委托(delegate),然后在view2中进行购买,看看是否再次发生

关于iphone - 消费品行为异常并发出重复请求。可能是什么原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8592544/

相关文章:

iphone - 使用字符串的值来确定类的实例

iphone - 如何在 UIToolbar 内的 UIBarButtonItem Action 中发送发件人

iphone - 修复 iPad 状态栏方向为纵向

c - 如何从 Xcode 中使用 -r 选项调用我的程序?

iPhone App 登录数据或 session

objective-c - 操作系统 X : Get mouse button position of button greater then the three standard buttons

IOS-如何为 Storyboard上的通用设备设置 UIscrollview 的框架?

iphone - iPad 上间歇性卡住

ios - 在 UITableViewCell Xcode StoryBoard 中调整标题

objective-c - .ics 文件的 PathforResource 问题, Objective-C