为啥应用内购买方法可以在模拟器上完美运行,但不能在真实设备 iOS 6 上运行?

Posted

技术标签:

【中文标题】为啥应用内购买方法可以在模拟器上完美运行,但不能在真实设备 iOS 6 上运行?【英文标题】:why in app purchase method run on simulator perfectly but not on real device iOS 6?为什么应用内购买方法可以在模拟器上完美运行,但不能在真实设备 iOS 6 上运行? 【发布时间】:2013-05-03 15:39:12 【问题描述】:

这次我的问题是,我确实创建了一个应用内购买方法,购买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上,两种方法都不起作用,不让我购买或恢复,甚至没有显示“使用苹果ID”,“创建新的”消息对话框apple id”、“cancel”等,按照教程制作的代码如下:

     //--- 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

请帮帮我,如果我的代码错误或不完整,请告诉我在哪里!!,我确实从 *** 看到了另一个答案,但是,等待 48 小时,或者重置我的设备,我没有找到错误,或者找不到对问题的任何解释,在登上 apsstore 之前工作同一个项目似乎很奇怪,如果它是同一个工作项目,当我下载应用程序时你注意到的差异再次感谢来自玻利维亚的家伙和 GRETTINGS ROCK ON!!!

【问题讨论】:

【参考方案1】:

好吧,伙计们..,在两周前等待之后,我不知道如何但正常工作,也许就像在另一个问题中告诉我们一样,只是我们需要更多耐心等待,无论如何,来自玻利维亚的问候!摇滚!!呵呵

【讨论】:

以上是关于为啥应用内购买方法可以在模拟器上完美运行,但不能在真实设备 iOS 6 上运行?的主要内容,如果未能解决你的问题,请参考以下文章

应用内购买适用于 iOS 3 和 5,但不适用于 iOS 4

我在 vb6(winsock) 中创建的客户端/服务器程序不能在 WAN 上运行,但可以在 LAN 上完美运行 为啥?

可以使用iOS 8模拟器测试应用内购买吗?

为啥我的应用没有在安卓模拟器上运行?

IOS 7 模拟器的应用内购买可能吗? [关闭]

可以在 IOS 8 (Xcode 6) 模拟器中测试应用内购买吗?