2012-12-29 36 views
0

我在iOS應用中購買了應用內購買,允許用戶升級到完整版本的應用。我已經做了一個應該處理商店的課程。問題是在測試商店時,我收到無效的ProductID錯誤。我確定問題是無法從應用程序商店獲得產品...StoreKit未收到產品陣列

我該如何解決這個問題?

下面是代碼:

#import <Foundation/Foundation.h> 
#import <StoreKit/StoreKit.h> 

@interface PSStoreKitManager : NSObject <SKProductsRequestDelegate,SKPaymentTransactionObserver> 

@property (strong, nonatomic) NSArray *products; 


-(void)initStore; 
-(void)upgradeToFull; 

@end 


@implementation PSStoreKitManager 
@synthesize products = _products; 

-(void)initStore { 

    if ([SKPaymentQueue canMakePayments]) { 
     [self requestProductData]; 
    }else { 
     NSLog(@"payments disabbled"); 
    } 
    NSLog(@"prod id %@",kFullVersionProductId); 
} 

-(void)upgradeToFull { 
    SKProduct *fullVersion; 
    NSLog(@"no items in array products %d",[self.products count]); 
    for (SKProduct *crt in self.products) { 
     if ([crt.productIdentifier isEqualToString:kFullVersionProductId]) { 
      fullVersion = crt; 
     } 
    } 
    SKPayment *payment = [SKPayment paymentWithProduct:fullVersion]; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 

} 

-(void)requestProductData { 
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:kFullVersionProductId]]; 
    [request setDelegate:self]; 
    [request start]; 
} 

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { 
    self.products = response.products; 
    NSLog(@"data in response: %d",[response.products count]); 
} 

#pragma mark -- Transaction observer 

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

{ 

    // Your application should implement these two methods. 

    [self recordTransaction:transaction]; 

    [self provideContent:transaction.payment.productIdentifier]; 



    // Remove the transaction from the payment queue. 

    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

} 

- (void) restoreTransaction: (SKPaymentTransaction *)transaction 

{ 

    [self recordTransaction: transaction]; 

    [self provideContent: transaction.originalTransaction.payment.productIdentifier]; 

    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

} 

- (void) failedTransaction: (SKPaymentTransaction *)transaction 

{ 

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

     // Optionally, display an error here. 

    } 

    [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

} 

-(void)recordTransaction:(SKPaymentTransaction *)transaction { 
    if ([transaction.payment.productIdentifier isEqualToString:kFullVersionProductId]) { 
     [[NSUserDefaults standardUserDefaults] setValue:transaction.transactionReceipt forKey:kUpgradeToFullReceipt]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 

} 

-(void)provideContent:(NSString *)productId { 
    if ([productId isEqualToString:kFullVersionProductId]) { 
     NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
     [def setBool:YES forKey:kIsUpgradedToFull]; 
     [def synchronize]; 
    } 
} 



@end 

這是在應用程序委託:

//set up store observer 
    PSStoreKitManager *observer = [[PSStoreKitManager alloc] init]; 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:observer]; 

這是建立在applicationDidFinishLaunching作爲觀察員店。它是這樣使用:

PSStoreKitManager *store = [[PSStoreKitManager alloc] init]; 
      [store initStore]; 
      [store upgradeToFull]; 

另一個問題是:當我註冊itunnes測試用戶將它連接通過電子郵件發送該地址,並要求通過登錄電子與我的Apple ID,以確認它......我想,但它說「未知的蘋果身份證」......如果這封電子郵件未經確認,是否是一個問題?

+0

是否 - (void)productsRequest:(SKProductsRequest *)請求didReceiveResponse:(SKProductsResponse *)被調用的響應方法? – tiguero

+0

這就是問題......不......我如何確保它被調用? – user1028028

+0

你是否保留你的要求? – tiguero

回答

0

好吧想通了......這是由ARC引起的......解決方案是保留我使用它的商店套件管理對象,否則它的發佈速度會更快,以至於響應可能會到達......

1

您需要在​​環境中測試您的應用內購買。如果您在iTunes連接中設置了測試用戶,則需要在設備設置中從Apple商店明確註銷。然後,在提示您是否要登錄以允許應用內購買時啓動您的應用後,請使用您的測試用戶帳戶登錄。

+0

我不能達到那裏......當我調用[商店initStore]它與'無效產品ID'崩潰,因爲self.products數組是空的所以initWithProductIdentifier得到一個空prodctId ...所以我永遠不會看到與測試用戶ID登錄... – user1028028