2011-12-02 23 views
3

我有一個iPhone應用程序在市場上有三個不同的應用程序購買它。問題是,當用戶購買功能時,他們通常會不止一次提示輸入密碼。這是正常的嗎?是蘋果公司還是我的代碼?在應用程序購買多次要求密碼

這裏是購買的一個示例:

 InAppPurchaseManager *manager = [[InAppPurchaseManager alloc] init]; 

    [manager loadStore]; 

    if([manager canMakePurchases]){ 
     [manager purchaseFeature:@"com.myfeature1"]; 

     VehicleExpensesController *aViewController = [[VehicleExpensesController alloc] 
                 initWithNibName:@"VehicleExpensesController" bundle:nil]; 
     [self presentModalViewController:aViewController animated:YES]; 
     [aViewController release], aViewController = nil; 

    } 

,這裏是我的InAppPurchaseManager.m文件:

#import "InAppPurchaseManager.h" 
@implementation InAppPurchaseManager 


- (void)requestProUpgradeProductData 
{ 
    NSSet *productIdentifiers = [NSSet setWithObjects:@"com.myfeature1", @"com.myfeature2", @"com.myfeature3", nil ]; 
productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers]; 
productsRequest.delegate = self; 
[productsRequest start]; 

// we will release the request object in the delegate callback 
} 

#pragma mark - 
#pragma mark SKProductsRequestDelegate methods 

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response 
{ 
NSArray *products = response.products; 
proUpgradeProduct = [products count] == 1 ? [[products firstObject] retain] : nil; 

if (proUpgradeProduct) 
{ 
    NSLog(@"Product title: %@" , proUpgradeProduct.localizedTitle); 
    NSLog(@"Product description: %@" , proUpgradeProduct.localizedDescription); 
    NSLog(@"Product price: %@" , proUpgradeProduct.price); 
    NSLog(@"Product id: %@" , proUpgradeProduct.productIdentifier); 
} 

for (NSString *invalidProductId in response.invalidProductIdentifiers) 
{ 
    NSLog(@"Invalid product id: %@" , invalidProductId); 
} 

// finally release the reqest we alloc/init’ed in requestProUpgradeProductData 
[productsRequest release]; 

[[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerProductsFetchedNotification object:self userInfo:nil]; 
} 
#pragma - 
#pragma Public methods 

// 
// call this method once on startup 
// 
- (void)loadStore 
{ 
    // restarts any purchases if they were interrupted last time the app was open 
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

    // get the product description (defined in early sections) 
    [self requestProUpgradeProductData]; 
} 

// call this before making a purchase 
// 
- (BOOL)canMakePurchases 
{ 
    return [SKPaymentQueue canMakePayments]; 
} 

// 
// kick off the upgrade transaction 
// 
- (void)purchaseFeature:(NSString *) identifier 
{ 
SKPayment *payment = [SKPayment paymentWithProductIdentifier:identifier]; 
[[SKPaymentQueue defaultQueue] addPayment:payment]; 

} 

// 
// saves a record of the transaction by storing the receipt to disk 
// 
- (void)recordTransaction:(SKPaymentTransaction *)transaction 
{ 
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 

if ([transaction.payment.productIdentifier isEqualToString:@"com.myfeature1"]) 
{ 
    // save the transaction receipt to disk 
    [[NSUserDefaults standardUserDefaults] setValue:transaction.transactionReceipt forKey:@"DiscountCalculator" ]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
if ([transaction.payment.productIdentifier isEqualToString:@"com.myfeature2"]) 
{ 
    // save the transaction receipt to disk 
    [[NSUserDefaults standardUserDefaults] setValue:transaction.transactionReceipt forKey:@"VehicleExpenses" ]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
if ([transaction.payment.productIdentifier isEqualToString:@"com.myfeature3"]) 
{ 
    // save the transaction receipt to disk 
    [[NSUserDefaults standardUserDefaults] setValue:transaction.transactionReceipt forKey:@"NoAds" ]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
} 

// 
// enable pro features 
// 
- (void)provideContent:(NSString *)productId 
{ 
if ([productId isEqualToString:@"com.myfeature1"]) 
{ 
    // enable the pro features 
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"DiscountCalculatorIsPurchased" ]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
}else if ([productId isEqualToString:@"com.myfeature2"]) 
{ 
    // enable the pro features 
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"VehicleExpensesIsPurchased" ]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
}else if ([productId isEqualToString:@"com.myfeature3"]) 
{ 
    // enable the pro features 
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"NoAdsIsPurchased" ]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
} 

// 
// removes the transaction from the queue and posts a notification with the transaction result 
// 
- (void)finishTransaction:(SKPaymentTransaction *)transaction wasSuccessful:(BOOL)wasSuccessful 
{ 
// remove the transaction from the payment queue. 
[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:transaction, @"transaction" , nil]; 
if (wasSuccessful) 
{ 
    // send out a notification that we’ve finished the transaction 
    [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionSucceededNotification object:self userInfo:userInfo]; 
} 
else 
{ 
    // send out a notification for the failed transaction 
    [[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerTransactionFailedNotification object:self userInfo:userInfo]; 
} 
} 

// 
// called when the transaction was successful 
// 
- (void)completeTransaction:(SKPaymentTransaction *)transaction 
{ 
[self recordTransaction:transaction]; 
[self provideContent:transaction.payment.productIdentifier]; 
[self finishTransaction:transaction wasSuccessful:YES]; 
} 

// 
// called when a transaction has been restored and and successfully completed 
// 
- (void)restoreTransaction:(SKPaymentTransaction *)transaction 
{ 
[self recordTransaction:transaction.originalTransaction]; 
[self provideContent:transaction.originalTransaction.payment.productIdentifier]; 
[self finishTransaction:transaction wasSuccessful:YES]; 
} 

// 
// called when a transaction has failed 
// 
- (void)failedTransaction:(SKPaymentTransaction *)transaction 
{ 
if (transaction.error.code != SKErrorPaymentCancelled) 
{ 
    // error! 
    [self finishTransaction:transaction wasSuccessful:NO]; 
} 
else 
{ 
    // this is fine, the user just cancelled, so don’t notify 
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} 
} 

#pragma mark - 
#pragma mark SKPaymentTransactionObserver methods 

// 
// called when the transaction status is updated 
// 
- (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]; 
      break; 
     default: 
      break; 
    } 
} 
} 
@end 

很抱歉,如果其大量的代碼 - 我只是想確認所有相關的代碼都在那裏。

+0

那麼我的回答對你有幫助嗎?你應該接受它,如果它:-) –

回答

4

您正在撥打- (void)recordTransaction:(SKPaymentTransaction *)transaction內部的 [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];。這是第二次請求密碼的內容。您不需要撥打restoreCompletedTransactions來存儲交易的詳細信息。

相關問題