0

ユーザーがアプリのフル バージョンにアップグレードできるように、iOS アプリでアプリ内購入を行っています。ストアを処理するクラスを作成しました。問題は、ストアをテストするときに無効な ProductID エラーが発生することです。問題はアプリストアから製品を取得できないことだと判断しました...

これを修正するにはどうすればよいですか?

コードは次のとおりです。

#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 connect にテスト ユーザーを登録すると、そのアドレスに電子メールが送信され、Apple ID でログインして確認するように求められました ... 試してみましたが、「不明な Apple ID」と表示されました ...このメールが未確認の場合はどうなりますか?

4

2 に答える 2

1

環境でアプリ内購入をテストする必要がありsandboxます。iTunes Connect でテスト ユーザーを設定している場合は、デバイス設定で Apple Store から明示的にサインアウトする必要があります。次に、アプリ内購入を許可するためにログインするかどうかを尋ねられたときにアプリを起動した後、テスト ユーザー アカウントでログインします。

于 2012-12-29T10:33:58.653 に答える
0

わかりました...それはARCが原因でした...解決策は、私が使用していたストアキット管理オブジェクトを保持することでした.

于 2013-01-01T19:58:31.610 に答える