【问题标题】:iOS - Display product price in proper currency before it is requested by user?iOS - 在用户请求之前以适当的货币显示产品价格?
【发布时间】:2015-02-17 04:38:52
【问题描述】:

我在我的应用中为商店创建了 UI,用户可以在其中购买应用内商品。我还想在其旁边显示产品的价格,而无需用户单击购买,但找不到合适的方法。

here 已经回答了一个与此问题非常相似的问题。

但是上面的解决方案需要一个SKProduct 对象。这意味着用户必须点击购买按钮,productsRequest:didReceiveResponse: 方法将被调用。只有创建了SKProduct 对象后,我才能检索有关产品的信息。

我还阅读了 Apple 文档,它使用了类似的方法。

是否可以在不让用户先请求购买的情况下检索产品信息和价格?

【问题讨论】:

  • 您无需申请购买即可获取产品信息。您只需要请求productData并提出请求,它会调用delegate并为您提供必要的信息,它不会启动付款或购买。

标签: ios objective-c in-app-purchase storekit


【解决方案1】:

这里有轻微的订购问题 - 您应该在显示用户购买能力(购买按钮)之前发出 SKProductsRequest。这样你就有了价格和其他信息,让用户做出购买决定。您还将知道您的任何产品是否无效或有本地化描述。

例如,我有一个列出所有 IAP 项目的屏幕。在该视图的初始化阶段,我启动了 SKProductsRequest。当调用关联的委托时,我会在视图中显示所有项目。

一旦您更改流程,您引用的其他解决方案将为您提供格式化定价,您还可以获取本地化描述。

【讨论】:

  • 我的逻辑可能仍然关闭,但我需要多个 ViewController 作为代表,因为在一个中,我将覆盖 productsRequest:didReceiveResponse: 以返回信息,而在另一个中,我将覆盖 productsRequest: didReceiveResponse:处理购买?我的应用程序中目前只有一个 ViewController。
  • (我正在使用 SpriteKit)。
  • 您覆盖 productsRequest:didReceiveResponse 以获取信息并实施 SKPaymentTransactionObserver paymentQueue:updatedTransactions 以获取实际购买的通知。
【解决方案2】:

是的,您可以通过在启动应用时在 appdelegate 中提出请求来做到这一点。

让我们创建一个名为getInAppProductDetails 的方法。使用此方法发出请求

-(void)getInAppProductDetails
{
    SKProductsRequest *request;
    request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObjects:
                                                                 @"InAppID1",
                                                                 @"InAppID2,
                                                                 nil]];

    request.delegate = self;
    [request start];
}

在启动期间调用上述方法。之后处理你得到的响应

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    NSArray *myProducts = response.products;
    NSMutableDictionary *dictMain = [[NSMutableDictionary alloc]init];

    for (int i = 0;i < [myProducts count]; i++)
    {
        SKProduct *product = [myProducts objectAtIndex:i];
        NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];

        [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
        [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
        [numberFormatter setLocale:product.priceLocale];

        NSString *priceString = [numberFormatter stringFromNumber:product.price];
        NSString *strTitle = product.localizedTitle;

        NSLog(@"Title: %@", product.localizedTitle);
        NSLog(@"Desc: %@", product.localizedDescription);
        NSLog(@"Price: %@", priceString);
        NSLog(@"id : %@",product.productIdentifier);

        NSMutableDictionary *dict = [[NSMutableDictionary alloc]init];
        [dict setValue:priceString forKey:@"productPrice"];
        [dict setValue:strTitle forKey:@"prodcuctTitle"];

        [dictMain setObject:dict forKey:product.productIdentifier];
    }
    [[NSUserDefaults standardUserDefaults] setObject:dictMain forKey:@"products"];
}

在此委托方法中,您可以获取存储在userdefaults 中的每个应用程序详细信息作为字典供以后使用。

要从字典中获取产品价格,你可以这样做

NSString *str1 = [[dictPriceList valueForKey:@"InAppID1"] valueForKey:@"productPrice"];
NSString *str2 = [[dictPriceList valueForKey:@"InAppID2"] valueForKey:@"productPrice"];

【讨论】:

  • 我的应用程序中只有一个视图控制器,其余的是 SKScenes (SpriteKit)。在您的代码中,您覆盖 productsRequest:didReceiveResponse: 以收集产品信息。这是否意味着我需要另一个视图控制器作为覆盖 productsRequest:didReceiveResponse: 的委托来处理购买请求?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
相关资源
最近更新 更多