2015-10-14 84 views
0

我有一個快速的問題在我的應用程序內購買一個奇怪的故障設置:應用程序內購買產品ID更新一個在後面

ViewController有2個按鈕:一個。當用戶點擊其中一個按鈕時,我將我的productID設置爲所選項目。然後我有一個購買按鈕,用戶應該點擊購買該項目。 問題我的是,我似乎無法得到SKProductRequest以正確的項目啓動productsRequest方法。

換句話說,蘋果的productRequest總是滯後於正確的產品1。這裏是我的代碼,我已經實現了:

ViewController.h

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

@interface ViewController : UIViewController <SKPaymentTransactionObserver, SKProductsRequestDelegate> 

/// In app purchase crap 
@property (strong, nonatomic) SKProduct *product; 
@property (strong, nonatomic) SKProductsRequest *request; 
@property (retain, nonatomic) NSString *productID; 

@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

int start; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Attempt to get request aligned with item selected.. :\ 
    start = YES; 
    _productID = @"com.example.IAP.itemA"; 

    [self Buy:self]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 




- (IBAction)Buy:(id)sender { 

// Check for user to be able to make payment 
    if ([SKPaymentQueue canMakePayments]) { 
     _request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:_productID]]; 
     _request.delegate = self; 

     [_request start]; 
    } else { 
     NSLog(@"Please enable In App Purchasing in your settings"); 
    } 
} 



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

    NSArray *products = response.products; 

    if (products.count != 0) { 
     NSLog(@"Products available: %@", _product.localizedTitle); 
     _product = products[0]; 
     if (start != YES) { 
      [self beginPaymentQueue]; 
     } 
     else { 
      start = NO; 
     } 
    } else { 
     NSLog(@"Products not found."); 
    } 

    products = response.invalidProductIdentifiers; 

    for (SKProduct *product in products) { 
     NSLog(@"Product not found: %@", product); 
    } 
} 

- (void)beginPaymentQueue {    
    SKPayment *payment = [SKPayment paymentWithProduct:_product]; 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
    [[SKPaymentQueue defaultQueue] addPayment:payment]; 
} 


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

    for (SKPaymentTransaction *transaction in transactions) { 
     switch (transaction.transactionState) { 
      case SKPaymentTransactionStatePurchased: { [self UnlockPurchase]; 
       [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
       break; } 
      case SKPaymentTransactionStateFailed: { NSLog(@"Transaction Failed"); 
       [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
       break; } 
      default: 
       break; 
     } 
    } 
} 

- (void)UnlockPurchase { 
    NSLog(@"Purchase Successful!"); 
} 



// Item Buttons 
- (IBAction)buttonA:(id)sender { 
    _productID = @"com.example.IAP.itemA"; 
} 

- (IBAction)buttonB:(id)sender { 
    _productID = @"com.example.IAP.itemB"; 
} 

不知道該怎麼辦......我已經打過電話了CanPurchase方法在viewDidLoad方法中,我甚至嘗試了用於productID的方法內部的switch語句,但沒有任何工作。

如果有人可以提出解決方案或嘗試幫助,我會非常感激。我一直在努力解決這個問題。謝謝!

FYI:這裏是一個記錄所發生的事情(我在這裏手動添加註釋的每一行,讓你知道什麼是用戶做來獲取日誌到位全日)

app loads  12:14:49.488 IAP[4928:370136] Products available: (null) 
click B then buy 12:14:52.053 IAP[4928:370136] Products available: IAP A 
cancel iap  12:15:01.086 IAP[4928:370136] Transaction Failed 
click B then buy 12:15:02.622 IAP[4928:370136] Products available: IAP B 
cancel iap  12:15:04.256 IAP[4928:370136] Transaction Failed 
click A then buy 12:15:02.622 IAP[4928:370136] Products available: IAP B 
cancel iap  12:15:04.256 IAP[4928:370136] Transaction Failed 
click A then buy 12:15:02.622 IAP[4928:370136] Products available: IAP A 
cancel iap  12:15:04.256 IAP[4928:370136] Transaction Failed 

該循環繼續進行,始終使productRequest與選定的IAP滯後1。請幫忙!

+0

爲什麼要將產品,產品請求等保存爲_properties_?這似乎是一個公開的邀請,犯了一個錯誤(比如滯後1)!保留_request_作爲財產特別令我擔憂。 (據我所知,你可能需要將產品交給視圖控制器) – matt

回答

1

看起來你只是混淆自己這裏:

NSArray *products = response.products; 
if (products.count != 0) { 
    NSLog(@"Products available: %@", _product.localizedTitle); 
    _product = products[0]; 

您都可以從先前存儲在產品本地化的稱號。這就是你爲何落後的原因。取而代之的是,從產品中獲得產品,從而得到其產品的標題:

NSArray *products = response.products; 
if (products.count != 0) { 
    SKProduct* product = products[0]; 
    NSLog(@"Products available: %@", product.localizedTitle); 
+0

以及不我覺得啞哈哈。感謝你的幫助 - 我覺得這很簡單,但我完全忽略了這一點。 –

+1

儘量避免在不需要時使用屬性。您向該請求投入的產品將從響應中返回;你不應該掛在它上面。而且肯定沒有理由繼續請求。 – matt

相關問題