gpt4 book ai didi

ios - 购买Apple商店产品导致启动时出现 "Purchased"状态

转载 作者:行者123 更新时间:2023-11-29 00:37:28 25 4
gpt4 key购买 nike

现在我正在努力解决下一个问题。我已经制作了简单的 IAPManager 用于在我的应用程序中从 AppStore 购买东西,但问题是 - 当我尝试购买产品时,应用程序调用 updatedTransactions 方法,交易状态为 Purchased 就在显示警报之前,如果我想买那个东西。

只有当我试图在应用程序启动前购买东西时才会发生。在我重新加载应用程序之前,它不会再发生。这是我的 IAPManager 代码:

- (id)init
{
self = [super init];
if (self) {

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
_receipt = receiptURL.absoluteString;
NSLog(@"Receipt = %@", _receipt);
}

return self;
}

- (void)purchaseSmallCreditPackWithCompletion:(IAPManagerBlock)completionBlock failure:(IAPManagerBlock)failureBlock
{
[self makePurchaseWithId:iap_SmallCreditPack completion:completionBlock failure:failureBlock];
}

- (void)purchaseMiddleCreditPackWithCompletion:(IAPManagerBlock)completionBlock failure:(IAPManagerBlock)failureBlock
{
[self makePurchaseWithId:iap_MiddleCreditPack completion:completionBlock failure:failureBlock];
}

- (void)purchaseLargeCreditPackWithCompletion:(IAPManagerBlock)completionBlock failure:(IAPManagerBlock)failureBlock
{
[self makePurchaseWithId:iap_LargeCreditPack completion:completionBlock failure:failureBlock];
}

- (void)makePurchaseWithId:(NSString *)idStr completion:(IAPManagerBlock)completionBlock failure:(IAPManagerBlock)failureBlock
{
if ([SKPaymentQueue canMakePayments]) {

_completionBlock = completionBlock;
_failureBlock = failureBlock;

SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:idStr]];
productsRequest.delegate = self;
[productsRequest start];
}
else
{
NSLog(@"This user can't make any payments");
}
}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
if (response.products.count == 0) {
NSLog(@"There're no any products whatsoever");
return;
}

SKProduct *product = [response.products firstObject];
[self purchase:product];
}

- (void)purchase:(SKProduct *)product
{
SKPayment *payment = [SKPayment paymentWithProduct:product];

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions
{
SKPaymentTransaction *transaction = [transactions firstObject];

switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:

NSLog(@"Purchasing %@...", transaction.payment.productIdentifier);

break;
case SKPaymentTransactionStateFailed:
{
NSLog(@"Failed to purchase %@", transaction.payment.productIdentifier);

if (_failureBlock) {
_failureBlock();
}

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
break;
case SKPaymentTransactionStateRestored:
{
//just in case, we don't need to restore anything so far
if (_completionBlock) {
_completionBlock();
}

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
break;
case SKPaymentTransactionStatePurchased:
{

NSLog(@"Purchased %@", transaction.description);
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
NSString *strReceipt = [receiptData base64EncodedStringWithOptions:0];
//NSLog(@"strReceipt = %@", strReceipt);

}
break;
default:
break;
}
}

- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray<SKPaymentTransaction *> *)transactions
{
NSLog(@"Removed Transactions");

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

最佳答案

我认为你的问题与观察者有关。正如我所见,您每次尝试购买产品时都会添加交易观察者,并在从交易队列中删除交易(任何)时将其删除。

如果您的交易未完成并且您的应用程序已关闭,您将在打开应用程序时收到有关交易完成的通知。所以你不会收到这个通知,你会错过它。

我建议你在 init 方法中添加观察者,不要因为我之前详细说明的原因而将其删除。另外,我建议您在打开应用程序 (didFinishLaunchingWithOptions:) 时创建 IAP 类的实例,以设置交易观察者并接收交易的这些延迟通知。

还有一件事......您应该管理您的交易数组,而不仅仅是第一个。

你应该创建一个 for 循环来像这样处理它们

for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchased: {
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
}
case SKPaymentTransactionStateFailed:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
break;
case SKPaymentTransactionStatePurchasing:
break;
case SKPaymentTransactionStateDeferred:
break;
default:
break;
}
};

关于ios - 购买Apple商店产品导致启动时出现 "Purchased"状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40287148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com