应用内购买未能加载产品列表

Oli*_*ack 5 itunesconnect in-app-purchase ios

我正在尝试实施一些inapp购买.我已经按照在线教程,我的代码发布在下面.我已将应用内购买添加到我的itunes连接帐户,但是当我运行代码时,它会调用'didfailwitherror'方法,该方法无法加载产品列表.有没有其他人有这个问题,并可能知道一个解决方案?

#import "IAPHelper.h"
#import <StoreKit/StoreKit.h>
NSString *const IAPHelperProductPurchasedNotification = @"IAPHelperProductPurchasedNotification";

@interface IAPHelper ()  <SKProductsRequestDelegate, SKPaymentTransactionObserver>

@end

@implementation IAPHelper{
  SKProductsRequest *_productsRequest;
  RequestProductsCompletionHandler _completionHandler;
  NSSet * _productIdentifiers;
  NSMutableSet * _purchasedProductIdentifiers;
}

-(id)initWithProductIdentifiers:(NSSet *)productIdentifiers{

    NSLog(@"get product ids");

if((self=[self init])){
    _productIdentifiers = productIdentifiers;
    _purchasedProductIdentifiers = [NSMutableSet set];
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    for (NSString* productIdentifier in _productIdentifiers) {
        NSLog(@"product id is %@", productIdentifier);

        BOOL productPurchased = [[NSUserDefaults standardUserDefaults]    boolForKey:productIdentifier];
        if (productPurchased) {
            [_purchasedProductIdentifiers addObject:productIdentifier];
        }
    }
}
return self;
}

-(void)requestProductsWithCompletionHandler:(RequestProductsCompletionHandler)completionHandler{

NSLog(@"Attempt to complete request for products");

  _completionHandler = [completionHandler copy];
  _productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:_productIdentifiers];
  _productsRequest.delegate=self;
  [_productsRequest start];
}

#pragma mark - SKProductsRequestDelegate

    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {

NSLog(@"Loaded list of products...");
_productsRequest = nil;

NSArray * skProducts = response.products;
for (SKProduct * skProduct in skProducts) {
    NSLog(@"Found product: %@ %@ %0.2f",
          skProduct.productIdentifier,
          skProduct.localizedTitle,
          skProduct.price.floatValue);
}

_completionHandler(YES, skProducts);
_completionHandler = nil;

}

- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {

NSLog(@"Failed to load list of products.");
_productsRequest = nil;

_completionHandler(NO, nil);
_completionHandler = nil;

}

- (BOOL)productPurchased:(NSString *)productIdentifier {
return [_purchasedProductIdentifiers containsObject:productIdentifier];
}

- (void)buyProduct:(SKProduct *)product {

  NSLog(@"Buying %@...", product.productIdentifier);

   SKPayment * payment = [SKPayment paymentWithProduct:product];
  [[SKPaymentQueue defaultQueue] addPayment:payment];

}

- (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)completeTransaction:(SKPaymentTransaction *)transaction {
  NSLog(@"completeTransaction...");

  [self provideContentForProductIdentifier:transaction.payment.productIdentifier];
  [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
  NSLog(@"restoreTransaction...");

[self provideContentForProductIdentifier:transaction.originalTransaction.payment.productIdentifier];
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

- (void)failedTransaction:(SKPaymentTransaction *)transaction {

  NSLog(@"failedTransaction...");
  if (transaction.error.code != SKErrorPaymentCancelled)
  {
      NSLog(@"Transaction error: %@", transaction.error.localizedDescription);
  }

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

- (void)provideContentForProductIdentifier:(NSString *)productIdentifier {
  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  int currentHints = [userDefaults integerForKey:@"hintAmount"];
  [_purchasedProductIdentifiers addObject:productIdentifier];
  if ([productIdentifier  isEqual: @"1"]) {
    [userDefaults setInteger:(currentHints+50) forKey:@"hintAmount"];
  }else if ([productIdentifier  isEqual: @"2"]){
    [userDefaults setInteger:(currentHints+100) forKey:@"hintAmount"];
  }else if ([productIdentifier  isEqual: @"3"]){
    [userDefaults setInteger:(currentHints+200) forKey:@"hintAmount"];
  }else if ([productIdentifier  isEqual: @"4"]){
    [userDefaults setInteger:(currentHints+500) forKey:@"hintAmount"];
  }
  [[NSUserDefaults standardUserDefaults] synchronize];
  [[NSNotificationCenter defaultCenter] postNotificationName:IAPHelperProductPurchasedNotification object:productIdentifier userInfo:nil];

}


@end
Run Code Online (Sandbox Code Playgroud)

mor*_*oko 0

满足所有条件这些是

\n\n

1.您是否为您的App ID启用了应用内购买?

\n\n

2.您是否检查过您的产品已清仓销售?

\n\n

3.您是否已提交(并可选择拒绝)您的应用程序二进制文件?

\n\n

4.您的项目\xe2\x80\x99s .plist Bundle ID与您的App ID匹配吗?

\n\n

5.您是否为新的App ID生成并安装了新的配置文件?

\n\n

6.您是否已将项目配置为使用此新的配置文件进行代码签名?

\n\n

7.您正在为 iPhone OS 3.0 或更高版本进行构建吗?

\n\n

8.您在发出 SKProductRequest 时是否使用完整的产品 ID?

\n\n

9.将产品添加到 iTunes Connect 后,您是否等待了几个小时?

\n\n

10.您的银行详细信息在 iTunes Connect 上有效吗?(通过马克)

\n\n

11.您是否尝试过从设备中删除该应用程序并重新安装?

\n\n

如果您对这些问题中的任何一个回答\xe2\x80\x9cNo\xe2\x80\x9d,那么\xe2\x80\x99就是你的问题。

\n