바로 지금 다음 문제로 고민하고 있습니다. 내 응용 프로그램에서 AppStore에서 물건을 구입하기 위해 간단한 IAPManager를 만들었지 만 문제는 - 제품을 구입하려고 할 때 응용 프로그램에서 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];
}
처럼 처리하는 루프를 작성해야합니다! 고맙습니다! –