关于inapp购买

时间:2011-03-29 14:12:07

标签: iphone

我在iphone上开发了一个应用程序。 我已经在app商店加载了它的Lite版本。 现在我无法从应用程序本身加载完整版本,如何做到这一点。 我知道这是可能的,但是如何做到这一点。

2 个答案:

答案 0 :(得分:1)

你可以用两种方式做到这一点。您有lite和full作为两个单独的应用程序,或者您可以进行应用程序内升级。根据您实施Lite限制的方式,其中一个或另一个可能是更好的选择。

在双应用程序方案中,您将Full作为单独的包开发,具有单独的包ID。 Xcode目标和条件编译可能会派上用场。在Lite版本中,您希望将链接硬编码到App Store中的完整版本。通过iTunes Connect中的复制粘贴找出链接。

在第二种情况下,full / lite是运行时设置,升级包是应用内购买。实施StoreKit API,提供硬编码的应用内商品ID。一旦注意到升级购买(这是一个异步过程),将设置翻转为Full。

我建议采用第二种方法。首先,所有评论都将在Lite版本下进行,而不是在Lite和Full之间进行分割。此外,如果您的应用具有设置或数据文件,则升级时不会丢失这些文件。

编辑:这里是应用内购买的实现方式。在应用程序的某个地方有一个升级按钮(链接,图像,等等),如下所示:

if(![SKPaymentQueue canMakePayments])
{
    //Display the "cannot pay here" message
    return;
}

@try
{
    [[SKPaymentQueue defaultQueue]
        addPayment:[SKPayment paymentWithProductIdentifier: @"com.mydomain.myproduct.full"]];
}
@catch (NSException * e)
{
    //Sorry...
}

同时,您的应用中需要一个处理StoreKit通知的类。我提到它是异步的;好吧,它仍然是。就我而言,我使用了AppDelegate:

@interface MyAppDelegate : NSObject <..., SKPaymentTransactionObserver>

您将应用委托指定为一个:

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    //...
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

然后实现事务处理方法:

- (void)paymentQueue:(SKPaymentQueue *)q updatedTransactions:(NSArray *)tr
{
    int i, n = [tr count];
    for(i=0;i<n;i++)
    {
        SKPaymentTransaction *t = [tr objectAtIndex:i];
        if(t.transactionState == SKPaymentTransactionStatePurchased)
            [self ProcessPurchase: t.payment.productIdentifier];

        //Support for restored transactions
        if(t.transactionState == SKPaymentTransactionStateRestored)
            [self ProcessPurchase: t.originalTransaction.payment.productIdentifier];

        //Failed/purchased/restored
        if(t.transactionState != SKPaymentTransactionStatePurchasing)
            [q finishTransaction:t];
}

-(void)ProcessPurchase:(NSString*)ProgID
{
    if([ProgID compare:@"com.mydomain.myproduct.full"] == 0)
    {
        //It's an upgrade! Change the settings, enable hidden content, and stuff...
    }
}

像这样。

答案 1 :(得分:0)

您需要为完整版创建单独的软件包ID。因为这是两种不同的应用。