dalam pembelian aplikasi meminta kata sandi beberapa kali

Saya memiliki aplikasi iPhone di pasaran yang memiliki tiga pembelian aplikasi berbeda di dalamnya. Masalahnya adalah, ketika pengguna membeli suatu fitur, mereka biasanya diminta memasukkan kata sandi lebih dari satu kali. Apakah ini normal? Apakah ada hubungannya dengan Apple atau dengan kode saya?

Berikut ini contoh salah satu pembeliannya:

        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;

    }

dan ini file InAppPurchaseManager.m saya:

#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

Maaf jika kodenya banyak - Saya hanya ingin memastikan semua kode yang relevan ada di sana.


person coder    schedule 02.12.2011    source sumber
comment
Jadi, apakah jawaban saya membantu Anda? Anda harus menerimanya jika memang demikian :-)   -  person Alexey Blinov    schedule 04.03.2012


Jawaban (1)


Anda menelepon [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; di dalam - (void)recordTransaction:(SKPaymentTransaction *)transaction. Inilah yang meminta kata sandi untuk kedua kalinya. Anda tidak perlu menelepon restoreCompletedTransactions untuk menyimpan detail transaksi.

person Alexey Blinov    schedule 01.03.2012