【问题标题】:paymentQueue:updatedTransactions gets called when it shouldn't?paymentQueue:updatedTransactions 在不应该被调用的时候被调用?
【发布时间】:2012-03-10 01:16:46
【问题描述】:

我在应用内购买时遇到了一个奇怪的问题...

在我请求产品信息后,有时 paymentQueue:updatedTransactions 会由于某种原因被自动调用。

在我商店的 viewDidLoad 方法中,我初始化并启动请求:

- (void)viewDidLoad
{
    [super viewDidLoad];

    productsArray = [[NSArray alloc] init];

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

    NSSet *productIdentifiers = [NSSet setWithObjects:PRODUCT_ID, nil];
    productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
    productsRequest.delegate = self;
    [productsRequest start];
}

然后我得到回应:

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    productsArray = [[NSArray alloc] initWithArray:response.products];

    NSLog(@"Products Count: %d",[productsArray count]);
    NSLog(@"Invalid Products Count: %d",[response.invalidProductIdentifiers count]);

    if ([productsArray count] > 0)
    {
        NSLog(@"Product title: %@" ,[productsArray objectAtIndex:0]);
        [self hideLoadingView];


    } else {
        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"No products found"
                                                            message:@"There might have been a problem. Please try again soon." delegate:self 
                                                  cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
        [alertView release];

        [self hideLoadingView];
        [purchaseBtn setEnabled:NO];

    }

    [productsRequest release];

    [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerProductsFetchedNotification object:self userInfo:nil];

}

这是我希望流程结束的地方,并等待用户点击购买按钮...但有时(例如,70% 的时间),我会弹出一个用户名/密码警报框订购商品...但用户没有点击任何东西...(如果用户已经“登录”,那么它会在不询问的情况下购买该商品。这不是应该的。

这是有时会自动调用的方法:

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

这是购买按钮的 IBAction:

-(IBAction)buyItem:(id)sender {

    [self showLoadingView];

    SKPayment *payment = [SKPayment paymentWithProductIdentifier:[(SKProduct *)[productsArray objectAtIndex:0] productIdentifier]];
    [[SKPaymentQueue defaultQueue] addPayment:payment];

    }        
}

我认为在调用 defaultQueue 的“addPayment”方法之前不应显示 StoreKit 的用户/密码警告框,该方法仅出现在 IBAction 中。

有什么想法吗? 谢谢!

【问题讨论】:

    标签: iphone xcode4.2 in-app-purchase storekit


    【解决方案1】:

    添加事务观察器后,如果有任何未完成的事务(这意味着您没有完成),iOS 将检查默认队列,因此每次有事务时它都会显示警报框,直到您完成它为止如果您没有执行任何添加新付款的操作。

    【讨论】:

    • 谢谢马雷克!确实是这个原因。有没有首选的方法来处理这个?如果交易中断并在队列中等待,客户是否已经收费?有没有办法取消被中断但仍在队列中等待的事务?非常感谢!
    • 嗯,这是 iOS 中的一个优势点 .. 因为您可以确保用户是否为您的产品付费,而您下次添加交易观察者下载它时您没有交付它(下载它)并完成交易..您需要小心地在下载产品项目时完成交易...现在您的案例可以解决此警报的问题您可以输入密码并在 updateTransactions 函数中调用 finishTransaction 方法.. 队列为空后,按原样返回 updateTransaction。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多