0

这一直让我发疯,但我正在尝试进行应用内购买以删除 iAd。除了这一部分之外,我的应用程序是完整的,我一生都无法弄清楚如何做到这一点。我已经通过在情节提要中使用 iAd 横幅然后添加代码将 iAd 添加到应用程序

-(void)bannerViewDidLoadAd:(ADBannerView *)banner {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
[banner setAlpha:1];
[UIView commitAnimations];
}

- (void)bannerView:(ADBannerView *) banner didFailToReceiveAdWithError:error{

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
[banner setAlpha:0];
[UIView commitAnimations];
}

在我的 .m 中,iAd 在我的模拟器中工作,但我希望通过应用内购买来删除这些。我已经完成了 iTunes 连接中的过程以允许此操作,但我无法弄清楚实现此功能所需的 Xcode 中的编码

我试过实现这个

#define kRemoveAdsProductIdentifier @"put your product id (the one that we just made in iTunesConnect) in here"

- (void)tapsRemoveAds{
NSLog(@"User requests to remove ads");

if([SKPaymentQueue canMakePayments]){
    NSLog(@"User can make payments");

    SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:kRemoveAdsProductIdentifier]];
    productsRequest.delegate = self;
    [productsRequest start];

}
else{
    NSLog(@"User cannot make payments due to parental controls");
    //this is called the user cannot make payments, most likely due to parental controls
}
}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
SKProduct *validProduct = nil;
int count = [response.products count];
if(count > 0){
    validProduct = [response.products objectAtIndex:0];
    NSLog(@"Products Available!");
    [self purchase:validProduct];
}
else if(!validProduct){
    NSLog(@"No products available");
    //this is called if your product id is not valid, this shouldn't be called unless that happens.
}
}

- (IBAction)purchase:(SKProduct *)product{
SKPayment *payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}

- (IBAction) restore{
//this is called when the user restores purchases, you should hook this up to a button
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{

 NSLog(@"received restored transactions: %i", queue.transactions.count);
for (SKPaymentTransaction *transaction in queue.transactions)
{
    if(SKPaymentTransactionStateRestored){
        NSLog(@"Transaction state -> Restored");
        //called when the user successfully restores a purchase
        [self doRemoveAds];
        [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        break;
    }

}

}

  - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{
for(SKPaymentTransaction *transaction in transactions){
    switch (transaction.transactionState){
        case SKPaymentTransactionStatePurchasing: NSLog(@"Transaction state -> Purchasing");
            //called when the user is in the process of purchasing, do not add any of your own code here.
            break;
        case SKPaymentTransactionStatePurchased:
            //this is called when the user has successfully purchased the package (Cha-Ching!)
            [self doRemoveAds]; //you can add your code for what you want to happen when the user buys the purchase here, for this tutorial we use removing ads
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            NSLog(@"Transaction state -> Purchased");
            break;
        case SKPaymentTransactionStateRestored:
            NSLog(@"Transaction state -> Restored");
            //add the same code as you did from SKPaymentTransactionStatePurchased here
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;
        case SKPaymentTransactionStateFailed:
            //called when the transaction does not finnish
            if(transaction.error.code != SKErrorPaymentCancelled){
                NSLog(@"Transaction state -> Cancelled");
                //the user cancelled the payment ;(
            }
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
            break;
    }
}
}
4

1 回答 1

0

您需要检查用户是否购买了 IAP。如果他已经这样做了,请移除 iAd 视图(或 setAlpha = 0)

更新

用户完成支付的那一刻(你收到SKPaymentTransactionStatePurchased/的地方,在SKPaymentTransactionStateRestored中存一个标志NSUserDefaults,这样你就知道用户是否购买了 IAP,并相应地显示/隐藏 iAd。

如果 中没有任何内容NSUserDefaults,则意味着:(1) 用户尚未购买 IAP 或 (2) 用户已购买但不知何故信息已丢失NSUserDefaults(例如,用户删除并重新安装了应用程序)。无论哪种情况,正确的做法是要求用户购买 IAP。如果 (2) 发生,App Store 将自动恢复 IAP,您将收到一个SKPaymentTransactionStateRestored. SKPaymentTransactionStateRestored和的代码SKPaymentTransactionStatePurchased应该类似:设置NSUserDefaults标志。

为避免混淆,一些应用程序提供了一个恢复按钮,如果用户购买了某些 IAP ,该按钮会调用[SKPaymentQueue restoreCompletedTransactions]并生成。SKPaymentTransactionStateRestored如果用户没有购买任何 IAP,这将不起作用。

于 2013-10-31T22:14:02.400 回答