2013-05-03 54 views
0

这次好的问题是,我做了一个应用程序购买的方法,购买2个产品,是我第一次,所以我从教程raywenderlich [1]:http://www.raywenderlich.com/21081/introduction-to-in-app-purchases-in-ios-6-tutorial,[2]:http://xcodenoobies.blogspot.com/2012/04/implementing-inapp-purchase-in-xcode.html和[ 3]:http://www.techotopia.com/index.php/An_iPhone_iOS_6_In-App_Purchase_Tutorial,问题是在开发我的应用程序时,我在模拟器测试器中创建了帐户,并且完美运行,没有发生任何错误,我在真实设备&中测试完美,但是当我的应用程序进入appstore并获得批准后,我没有下载应用程序,我确实将它安装到我的iPhone上,两种方法都不起作用,不让我购买或恢复,甚至不会显示“使用Apple ID”,“创建新的Apple ID”,“取消”等等,下面的教程代码使它成为:为什么在应用程序购买方法在模拟器上完美运行,而不是在真实设备iOS 6上运行?

 //--- in viewcontroller---// 

    - (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSArray * productIdentifiers = [[NSArray alloc] initWithObjects:INAPP1_ID,INAPP2_ID, nil]; 

    NSMutableArray * inAppPurchases = [InAppPurchase  initWithProductIdentifiers:productIdentifiers delegate:self]; 

    NSString * msg = nil; 

    if (inAppPurchases != nil) 
    { 
     NSLog(@"created %d in-app-purchase objects...", inAppPurchases.count); 
     inAppPurchase_ProductPRIMERO = [inAppPurchases objectAtIndex:0]; 
     [inAppPurchase_ProductPRIMERO setVerbose:FALSE]; 
     inAppPurchase_ProductPRIMERO.progressUploadPurchase = [[MBProgressHUD alloc]initWithView:self.view]; 
     [self.view addSubview: inAppPurchase_ProductPRIMERO.progressUploadPurchase]; 
     inAppPurchase_ProductPRIMERO.progressUploadPurchase.mode = MBProgressHUDModeIndeterminate; 
     inAppPurchase_ProductPRIMERO.progressUploadPurchase.labelText = @"Buying..."; 
     msg = [NSString stringWithFormat:@"Product One productId: %@", inAppPurchase_ProductPRIMERO.productId]; 
     NSLog(@"%@", msg); 
     inAppPurchase_ProductSEGUNDO = [inAppPurchases objectAtIndex:1]; 
     [inAppPurchase_ProductSEGUNDO setVerbose:FALSE]; 
     inAppPurchase_ProductSEGUNDO.progressUploadPurchase = [[MBProgressHUD alloc]initWithView:self.view]; 
     [self.view addSubview: inAppPurchase_ProductSEGUNDO.progressUploadPurchase]; 
     inAppPurchase_ProductSEGUNDO.progressUploadPurchase.mode = MBProgressHUDModeIndeterminate; 
     inAppPurchase_ProductSEGUNDO.progressUploadPurchase.labelText = @"Buying..."; 
     msg = [NSString stringWithFormat:@"Product Two productId %@", inAppPurchase_ProductSEGUNDO.productId]; 
     NSLog(@"%@", msg); 
    } else { 
     msg = @"Error creating in-app purchases objects!"; 
    } 
    NSLog(@"in ViewDidLoad doYouDidBuyPRIMERO %s", doYouDidBuyPRIMERO ? "true" : "false"); 

    NSLog(@"in ViewDidLoad doYouDidBuySEGUNDO %s", doYouDidBuySEGUNDO ? "true" : "false"); 

} 

-(IBAction)BuyPRIMERO:(id)sender 
{ 
     alreadyPurchased = [inAppPurchase_ProductPRIMERO alreadyPurchased]; 
      NSLog(@"%c",alreadyPurchased); 
     if (!alreadyPurchased) 
     [inAppPurchase_ProductPRIMERO purchaseProduct]; 
} 

-(IBAction)RestoreBuyPRIMERO:(id)sender 
{ 
    [inAppPurchase_ProductPRIMERO restorePurchase]; 
} 

-(IBAction)BuySEGUNDO:(id)sender 
{ 
    alreadyPurchased = [inAppPurchase_ProductSEGUNDO alreadyPurchased]; 
     NSLog(@"%c",alreadyPurchased); 
    if (!alreadyPurchased) 
     [inAppPurchase_ProductSEGUNDO purchaseProduct]; 
} 

-(IBAction)RestoreBuySEGUNDO:(id)sender 
{ 
    [inAppPurchase_ProductSEGUNDO restorePurchase]; 
} 

- (void)requestedProduct:(InAppPurchase *)iap identifier:(NSString*)productId name:(NSString*)productName price:(NSString*)productPrice description:(NSString*)productDescription { 
    NSString * _msg = nil; 
    if (iap == inAppPurchase_ProductPRIMERO) 
    { 
     _msg = [NSString stringWithFormat:@"Product One is valid %@ price: %@", productName, [iap getValidProductLocalizedPrice]]; 

     NSLog(@"localized price is %@ (id is %@)", [iap getValidProductLocalizedPrice], [iap getValidProductId]); 
     NSString *PRIMERO =[iap getValidProductLocalizedTitle]; 
     NSLog(@"Title: %@",PRIMERO); 
     NSString *pricePRIMERO = [iap getValidProductLocalizedPrice]; 
     NSString *titlePRIMERO = [NSString stringWithFormat:@"Buy %@ %@",PRIMERO,pricePRIMERO]; 
     PRIMEROFunctionButton.titleLabel.text = titlePRIMERO; 
    } else if (iap == inAppPurchase_ProductSEGUNDO) 
    { 
     _msg = [NSString stringWithFormat:@"Product Two is valid %@ price: %@", productName, [iap getValidProductLocalizedPrice]]; 
     NSLog(@"localized price is %@ (id is %@)", [iap getValidProductLocalizedPrice], [iap getValidProductId]); 
     NSString *SEGUNDO =[iap getValidProductLocalizedTitle]; 
      NSLog(@"Title: %@",SEGUNDO); 
     NSString *priceIcons = [iap getValidProductLocalizedPrice]; 
     NSString *titleIcons = [NSString stringWithFormat:@"Buy %@ %@",SEGUNDO,priceSEGUNDO]; 
     SEGUNDOButton.titleLabel.text = titleSEGUNDO 
     ; 
    } else { 

    } 
} 

- (void)successfulPurchase:(InAppPurchase*)iap restored:(bool)isRestore identifier:(NSString*)productId receipt:(NSData*)transactionReceipt 
{ 
    NSString * statusMsg = nil; 
    if (iap == inAppPurchase_ProductPRIMERO) 
    { 
     if (isRestore) 
     { 
      statusMsg = [NSString stringWithFormat:@"Restored purchase of Product One productId: %@", productId]; 
      UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"Purchase Restore Completed" message:statusMsg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [alertView show]; 

      if ([iap isPurchased]) 
      { 
       doYouDidBuyPRIMERO = YES; 
       [[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"DO_YOU_DID_BUY_PRIMERO"]; 
       NSLog(@"doYouDidBuyPRIMERO %s", doYouDidBuyPRIMERO ? "true" : "false"); 
       [self HideCancelBuyPRIMERO]; 
      } 

      [inAppPurchase_ProductPRIMERO.progressUploadPurchase hide:YES]; 

     } else { 

      statusMsg = [NSString stringWithFormat:@"Purchased Product One productId: %@", productId]; 
      UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"Purchase Completed" message:statusMsg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [alertView show]; 

      if ([iap isPurchased]) 
      { 
       doYouDidBuyPRIMERO = YES; 
       [[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"DO_YOU_DID_BUY_PRIMERO"]; 
       NSLog(@"doYouDidBuyPRIMERO %s", doYouDidBuyPRIMERO ? "true" : "false"); 
       [self HideCancelBuyPRIMERO]; 
      } 
      [inAppPurchase_ProductPRIMERO.progressUploadPurchase hide:YES]; 
     } 

    } else if (iap == inAppPurchase_ProductSEGUNDO) { 

     if (isRestore) 
     { 
      statusMsg = [NSString stringWithFormat:@"Restored purchase of Product Two productId: %@", productId]; 

      UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"Purchase Restore Completed" message:statusMsg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [alertView show]; 

      if ([iap isPurchased]) 
      { 
      doYouDidBuySEGUNDO = YES; 

      [[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"DO_YOU_DID_BUY_SEGUNDO"]; 

      NSLog(@"doYouDidBuySEGUNDO %s", doYouDidBuySEGUNDO ? "true" : "false"); 
      [self HideCancelBuySEGUNDO]; 
      } 
      [inAppPurchase_ProductSEGUNDO.progressUploadPurchase hide:YES]; 

     } else { 

      statusMsg = [NSString stringWithFormat:@"Purchased Product Two productId: %@", productId]; 

      UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"Purchase Completed" message:statusMsg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [alertView show]; 

      if ([iap isPurchased]) 
      { 
      doYouDidBuySEGUNDO = YES; 

      [[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"DO_YOU_DID_BUY_SEGUNDO"]; 

      NSLog(@"doYouDidBuySEGUNDO %s", doYouDidBuySEGUNDO ? "true" : "false"); 
       [self HideCancelBuySEGUNDO]; 
      } 
      [inAppPurchase_ProductSEGUNDO.progressUploadPurchase hide:YES]; 
     } 

    } else { 


    } 
} 

- (void)failedPurchase:(InAppPurchase*)iap error:(NSInteger)errorCode message:(NSString*)errorMessage { 

    NSString * statusMsg = nil; 

    if (iap == inAppPurchase_ProductPRIMERO) 
    { 

     statusMsg = [NSString stringWithFormat:@"Failed purchased for Product One!\Error code: %d Error message: %@", errorCode, errorMessage]; 
     NSLog(@"%@",statusMsg); 

    }else if (iap == inAppPurchase_ProductSEGUNDO) { 

     statusMsg = [NSString stringWithFormat:@"Failed purchased for Product Two!\nError code: %d Error message: %@", errorCode, errorMessage]; 

     NSLog(@"%@",statusMsg); 

    } else { 



    } 
} 

- (void)incompleteRestore:(InAppPurchase*)iap { 

    NSString * statusMsg = nil; 

    if (iap == inAppPurchase_ProductPRIMERO) { 

     statusMsg = @"Incomplete restore for Product One!"; 

     NSLog(@"%@",statusMsg); 

    } else if (iap == inAppPurchase_ProductSEGUNDO) { 

     statusMsg = @"Incomplete restore for Product Two!"; 

     NSLog(@"%@",statusMsg); 

    } else { 


    } 
} 

- (void)failedRestore:(InAppPurchase*)iap error:(NSInteger)errorCode message:(NSString*)errorMessage { 

    NSString * statusMsg = nil; 

    if (iap == inAppPurchase_ProductPRIMERO) { 

     statusMsg = @"Failed restore for Product One"; 

     NSLog(@"%@",statusMsg); 

    } else if (iap == inAppPurchase_ProductSEGUNDO) { 

     statusMsg = @"Failed restored for Product Two!"; 

     NSLog(@"%@",statusMsg); 

    } else { 


    } 
} 

    // AND IN APP PURCHASE HELPER .m 

    #import "InAppPurchase.h" 

@implementation InAppPurchase 

@synthesize delegate; 
@synthesize validProduct; 
@synthesize productId; 
@synthesize progressUploadPurchase; 

+ (NSMutableArray *)initWithProductIdentifiers:(NSArray *)productIdentifiers delegate:(id<InAppPurchaseDelegate>)_delegate { 
    NSMutableArray * iapPurchaseArray = nil; 

    if (productIdentifiers != nil) { 
     InAppPurchase * purchase = nil; 
     NSString * productIdentifier = nil; 

     iapPurchaseArray = [[NSMutableArray alloc] initWithCapacity:productIdentifiers.count]; 

     for (int i = 0; i < productIdentifiers.count; i++) { 
      productIdentifier = [productIdentifiers objectAtIndex:i]; 
      purchase = [[InAppPurchase alloc] initWithProductId:productIdentifier delegate:_delegate]; 
      [iapPurchaseArray addObject:purchase]; 
     } 
    } 

    return iapPurchaseArray; 
} 


+ (InAppPurchase *)initWithProductIdentifier:(NSString *)productIdentifier delegate:(id<InAppPurchaseDelegate>)_delegate { 
    InAppPurchase * purchase = nil; 

    if (productIdentifier != nil) 
     purchase = [[InAppPurchase alloc] initWithProductId:productIdentifier delegate:_delegate]; 

    return purchase; 
} 

+ (InAppPopoverView *)showPurchasePopover:(NSArray *)purchases atPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title includeRestore:(BOOL)includeRestore delegate:(id<InAppPopoverViewDelegate>)delegate { 

    InAppPopoverView * inAppPopoverView = nil; 

    if (purchases != nil && purchases.count > 0) { 
     NSMutableArray * stringArray = [[NSMutableArray alloc] init]; 
     InAppPurchase * inAppPurchase = nil; 
     NSString * _productTitle = nil; 
     NSString * localizedPrice = nil; 
     BOOL wrongClassObject = FALSE; 
     BOOL alreadyPurchased = FALSE; 

     for (int i = 0; i < purchases.count; i++) { 
      inAppPurchase = [purchases objectAtIndex:i]; 


      if ([inAppPurchase isKindOfClass:InAppPurchase.class]) 
      { 

       if ([inAppPurchase isValidProduct] == FALSE) { 
        NSLog(@"Your purchases NSArray contains some non InAppPurchase that has not been validated! Please check!"); 

        _productTitle = [NSString stringWithFormat:@"%@ not validated yet!", inAppPurchase.productId]; 
       } else { 
        _productTitle = [inAppPurchase getValidProductLocalizedTitle]; 
        alreadyPurchased = [inAppPurchase alreadyPurchased]; 

        if (alreadyPurchased) { 
         localizedPrice = [inAppPurchase getValidProductLocalizedPrice]; 

         if ([InAppPurchase isRunningIPad]) 
          _productTitle = [_productTitle stringByAppendingFormat:@" (already purchased for %@)", localizedPrice]; 
         else 
          _productTitle = [_productTitle stringByAppendingFormat:@" (%@)", localizedPrice]; 
        } else 
         _productTitle = [NSString stringWithFormat:@"Buy %@", [inAppPurchase getValidProductLocalizedTitle]]; 

       } 

       [stringArray addObject:_productTitle]; 
      } else 
       wrongClassObject = TRUE; 
     } 

     if (wrongClassObject)    
      NSLog(@"Your purchases NSArray contains some non InAppPurchase class objects! Please check!"); 
     else { 

      if (includeRestore) { 
       // last add 'Restore Purchase' which is required by Apple AppStore so good idea to add or have available elsewhere 
       [stringArray addObject:@"Restore Purchases"]; 
      } 

      inAppPopoverView = [InAppPopoverView showPopoverAtPoint:point inView:view withTitle:title withStringArray:stringArray delegate:delegate]; 
     } 

    } else { 
     NSLog(@"nil InAppPurchases array provided!"); 
    } 

    return inAppPopoverView; 
} 

+ (BOOL)hasAlreadyPurchased:(NSString *)productId { 
    BOOL result = FALSE; 

    if (productId != nil) 
     result = [[NSUserDefaults standardUserDefaults] boolForKey:productId]; 

    return result; 
} 

- (id)initWithProductId:(NSString *)_productId delegate:(id<InAppPurchaseDelegate>)_delegate { 

    if ((self = [super init])) { 
     self.productId = _productId; 
     self.delegate = _delegate; 

     purchased = FALSE; 
     restored = FALSE; 
     verbose = FALSE; 
     NSLog(@"purchased %s", purchased? "true" : "false"); 
     [self requestProduct:self.productId]; 

     purchased = [[NSUserDefaults standardUserDefaults] boolForKey:self.productId]; 
     NSLog(@"purchased %s", purchased? "true" : "false"); 

     if (purchased) 
      NSLog(@"The product %@ is already purchased.", self.productId); 

     NSLog(@"purchased %s", purchased? "true" : "false"); 

    } 
    return self; 
} 

- (void)setVerbose:(BOOL)_verbose { 

    verbose = _verbose; 
} 

- (BOOL)canMakePayments { 

    return [SKPaymentQueue canMakePayments]; 
} 

- (BOOL)alreadyPurchased { 

    return [self isPurchased]; 
    NSLog(@"purchased %s", purchased? "true alreadyPurchased" : "false alreadyPurchased"); 
} 

- (BOOL)isPurchased 
{ 
    return purchased; 
    NSLog(@"purchased %s", purchased? "true" : "false"); 
} 

- (BOOL)isRestored { 

    return restored; 
} 

- (BOOL)isValidProduct { 
    BOOL result = FALSE; 

    if (self.validProduct != nil) 
     result = TRUE; 

    return result; 
} 

- (NSString *)getProductId { 

    return self.productId; 
} 

- (SKProduct *)getValidProduct { 

    return self.validProduct; 
} 

- (NSString *)getValidProductId { 
    NSString * _id = nil; 

    if ([self isValidProduct]) 
     _id = [self.validProduct productIdentifier]; 

    return _id; 
} 

- (NSString *)getValidProductLocalizedDescription { 
    NSString * description = nil; 

    if ([self isValidProduct]) 
     description = [self.validProduct localizedDescription]; 

    return description; 
} 

- (NSString *)getValidProductLocalizedTitle { 
    NSString * title = nil; 

    if ([self isValidProduct]) 
     title = [self.validProduct localizedTitle]; 

    return title; 
} 

- (NSString *)getValidProductLocalizedPrice { 
    NSString * priceStr = nil; 

    if ([self isValidProduct]) { 
     NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init]; 
     [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4]; 
     [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
     [numberFormatter setLocale:self.validProduct.priceLocale]; 

     priceStr = [numberFormatter stringFromNumber:self.validProduct.price]; 

    } 

    return priceStr; 
} 

- (BOOL)requestProduct:(NSString *)_id { 

    if (_id != nil) 
    { 

     if (verbose) 
      NSLog(@"InAppPurchase requestProduct: %@", _id); 

     if ([SKPaymentQueue canMakePayments]) 
     { 

      SKProductsRequest * prodRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:_id]]; 
      prodRequest.delegate = self; 
      [prodRequest start]; 
      return YES; 

     } else { 

      if (verbose) 
       NSLog(@"InAppPurchase requestProduct: IAP Disabled"); 

      return NO; 
     } 

    } else { 

     if (verbose) 
      NSLog(@"InAppPurchase requestProduct: productId = NIL"); 

     return NO; 
    } 
} 

- (BOOL)purchaseProduct { 

    return [self purchaseProduct:self.validProduct]; 
} 

- (BOOL)purchaseProduct:(SKProduct*)requestedProduct 
{ 
    NSLog(@"InAppPurchase purchaseProduct: %@", requestedProduct.productIdentifier); 
    if (requestedProduct != nil) 
    { 

     if (verbose) 
      NSLog(@"InAppPurchase purchaseProduct: %@", requestedProduct.productIdentifier); 

     if ([SKPaymentQueue canMakePayments]) 
     { 

      SKPayment *paymentRequest = [SKPayment paymentWithProduct:requestedProduct]; 


      [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 


      [[SKPaymentQueue defaultQueue] addPayment:paymentRequest]; 

      return YES; 

     } else { 
      if (verbose) 
       NSLog(@"InAppPurchase purchaseProduct: IAP Disabled"); 

      return NO; 
     } 

    } else { 

     if (verbose) 
      NSLog(@"InAppPurchase purchaseProduct: SKProductis nil"); 

     return NO; 
    } 
} 

- (BOOL)restorePurchase { 

    if (verbose) 
     NSLog(@"InAppPurchase restorePurchase"); 

    if ([SKPaymentQueue canMakePayments]) 
    { 
     [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

     [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 

     return YES; 

    } else { 


     return NO; 
    } 
} 


- (void)clearUserDefaultsSetting { 

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:self.productId]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 


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


    self.validProduct = nil; 
    int count = [response.products count]; 

    if (count > 0) { 

     self.validProduct = [response.products objectAtIndex:0]; 

     if (verbose) 
      NSLog(@"got valid product %@ for product id %@", self.validProduct, productId); 
    } 

    if (self.validProduct) { 


     if ([delegate respondsToSelector:@selector(requestedProduct:identifier:name:price:description:)]) 
      [delegate requestedProduct:self identifier:self.validProduct.productIdentifier name:self.validProduct.localizedTitle price:[self.validProduct.price stringValue] description:self.validProduct.localizedDescription]; 

    } else { 

     if ([delegate respondsToSelector:@selector(requestedProduct:identifier:name:price:description:)]) 
      [delegate requestedProduct:self identifier:nil name:nil price:nil description:nil]; 
    } 
} 

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { 

    for (SKPaymentTransaction *transaction in transactions) { 

     switch (transaction.transactionState) { 

      case SKPaymentTransactionStatePurchasing: 


       NSLog(@"1"); 


       [self.progressUploadPurchase show:YES]; 


       break; 

      case SKPaymentTransactionStatePurchased: 


       purchased = TRUE; 
       NSLog(@"2"); 
       NSLog(@"purchased %s", purchased? "true" : "false"); 


       purchased product. 
       if ([delegate respondsToSelector:@selector(successfulPurchase:restored:identifier:receipt:)]) 
        [delegate successfulPurchase:self restored:NO identifier:transaction.payment.productIdentifier receipt:transaction.transactionReceipt]; 


       [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

       [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:transaction.payment.productIdentifier]; 
       [[NSUserDefaults standardUserDefaults] synchronize]; 

       break; 

      case SKPaymentTransactionStateRestored: 


       purchased = TRUE; 
       NSLog(@"3"); 

       NSLog(@"purchased %s", purchased? "true" : "false"); 

       if (!restored && [delegate respondsToSelector:@selector(successfulPurchase:restored:identifier:receipt:)]) 
        [delegate successfulPurchase:self restored:YES identifier:transaction.payment.productIdentifier receipt:transaction.transactionReceipt]; 

       restored = TRUE; 

       [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

       [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:transaction.payment.productIdentifier]; 
       [[NSUserDefaults standardUserDefaults] synchronize]; 

       break; 

      case SKPaymentTransactionStateFailed: 

        NSLog(@"4"); 

       [self.progressUploadPurchase hide:YES]; 

       if (transaction.error.code != SKErrorPaymentCancelled) 
       { 

        if ([delegate respondsToSelector:@selector(failedPurchase:error:message:)]) 
         [delegate failedPurchase:self error:transaction.error.code message:transaction.error.localizedDescription]; 
       } 

       [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 
       break; 

     } 
    } 
} 


- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions { 

    if (verbose) 
     NSLog(@"InAppPurchase removedTransactions"); 

    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; 
} 

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

    if (verbose) 
     NSLog(@"InAppurchase paymentQueueRestoreCompletedTransactionsFinished"); 

    if ([queue.transactions count] == 0) { 

     if (verbose) 
      NSLog(@"InAppPurchase restore queue.transactions count == 0"); 


     [[SKPaymentQueue defaultQueue] removeTransactionObserver:self]; 

     if ([delegate respondsToSelector:@selector(incompleteRestore:)]) 
      [delegate incompleteRestore:self]; 

    } else { 


     if (verbose) 
      NSLog(@"InAppPurchase restore queue.transactions available"); 

     for (SKPaymentTransaction *transaction in queue.transactions) { 

      if (verbose) 
       NSLog(@"InAppPurchase restore queue.transactions - transaction data found"); 

      if (!restored && [delegate respondsToSelector:@selector(successfulPurchase:restored:identifier:receipt:)]) 
       [delegate successfulPurchase:self restored:YES identifier:transaction.payment.productIdentifier receipt:transaction.transactionReceipt]; 

      restored = TRUE; 
     } 
    } 
} 

- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error { 


    if (verbose) 
     NSLog(@"InAppPurchase restoreCompletedTransactionsFailedWithError"); 

    if ([delegate respondsToSelector:@selector(failedRestore:error:message:)]) 
     [delegate failedRestore:self error:error.code message:error.localizedDescription]; 
} 

#pragma mark - Internal Methods & Events 

+ (BOOL)isRunningIPad { 

    if ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)]) { 
     return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad); 
    } 

    return NO; 
} 

@end 

请帮助我,如果我的代码是错误或不完整的,告诉我在哪里请!!,我确实看到另一个来自stackoverflow的答案,但是,等待48小时,或重置我的设备,我没有找到错误,或者可以没有找到任何问题的解释,看起来很奇怪,在登陆apsstore之前运行相同的项目,当我下载应用程序时,如果它是相同的工作项目,您会注意到不同之处。感谢来自BOLIVIA ROCK的人们!

回答

0

好家伙..,等了两个星期前我不知道怎么样,但是正常工作,也许就像是在另一个问题中告诉我们&只是我们需要耐心等待,任何方式,从玻利维亚最好的问候!摇滚! XD

相关问题