【问题标题】:iOS - In app purchase - Get products priceiOS - 应用内购买 - 获取产品价格
【发布时间】:2019-03-26 22:17:59
【问题描述】:

在我的 iOS 应用程序中,我有 3 种产品可供用户使用应用内购买进行购买。 从我的 iOS 应用程序中,我只想获取苹果服务器上所有 3 件商品的价格。 我怎样才能在没有用户干预的情况下只获得价格。 (可能是我必须在视图中处理加载或某种方法)

【问题讨论】:

    标签: ios in-app-purchase


    【解决方案1】:

    您无需任何用户干预即可获取任何产品信息。您所要做的就是发送一个产品请求信息并实现一个回调方法来处理响应,如下所示(示例取自http://troybrant.net/blog/2010/01/in-app-purchases-a-full-walkthrough/):

    - (void)requestProUpgradeProductData
    {
        NSSet *productIdentifiers = [NSSet setWithObject:@"com.runmonster.runmonsterfree.upgradetopro" ];
        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];
    }
    

    只需从 viewDidLoad 调用 requestProUpgradeProductData。

    【讨论】:

    • 我正在尝试从 viewDidLoad 调用 requestProUpgradeProductData,我在方法 requestProUpgradeProductData 中获得了 Null 产品 ID,并且应用程序崩溃了。我有多个产品 ID,我希望在应用程序启动时在我的标签上动态显示 5 种产品的价格等级,如果用户从 itunes 更改价格等级,我的标签应该显示该值。如果可以的话请帮忙。等待您的回复。
    • NSSet *productIdentifiers = [NSSet setWithObject:@"com.runmonster.runmonsterfree.upgradetopro" ];这里 com.runmonster.runmonsterfree.upgradetopro 是单个产品 ID,但是当有多个产品 ID 时该怎么办?任何帮助将不胜感激。
    • 谢谢。调用方法 requestProUpgradeProductData from viewDidLoad 对我有用。
    • 产品成本的检索有时会变慢。
    【解决方案2】:

    您可以随时使用已知标识符列表创建SKProductsRequest 的实例。我在应用程序启动时完成了它。这是一个使用委托的异步调用,因此很容易做到没有阻塞。

    myProductsRequest = [SKProductsRequest initWithProductIdentifiers:someSetOfIds];
    myProductsRequest.delegate = myDelegageSomewhere;
    

    在你的SKProductsRequestDelegate

    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
    {
      for(SKProduct *product in response.products)
      {
         [self doSomethingWithPrice:product.price]
      }
    }
    

    该信息与用户的 iTunes 帐户相关联。这就是它获取不同国家/地区商店(不同货币)价格的方式。

    【讨论】:

      【解决方案3】:
      -(NSString*)getPrice:(SKProduct*)product{
          NSNumberFormatter * _priceFormatter;
      
          _priceFormatter = [[NSNumberFormatter alloc] init];
          [_priceFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
          [_priceFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
      
          [_priceFormatter setLocale:product.priceLocale];
          return [_priceFormatter stringFromNumber:product.price];
      
      }
      

      【讨论】:

        【解决方案4】:

        您可以将此功能添加到您的课程中。

        func priceOf(product: SKProduct) -> String {
            let numberFormatter = NumberFormatter()
            numberFormatter.formatterBehavior = .behavior10_4
            numberFormatter.numberStyle = .currency
            numberFormatter.locale = product.priceLocale
            return numberFormatter.string(from: product.price)!
        }
        

        那么,你就可以传递你的产品了!

        priceLabel.text = "The price of the item is \(priceOf(product: product))"
        

        product 替换为您的SKProduct 的名称。

        【讨论】:

          【解决方案5】:

          Swift 3.x,你会在下面使用

          public func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { 
                  for product in response.products {
                    let price =  product.price
                    let currencySymbol = productpriceLocale.currencySymbol
                  }
              }
          

          【讨论】:

            【解决方案6】:

            获取应用内商品的价格,您可以使用我的服务器。
            仅适用于 App Store 中可用的应用程序。
            发送帖子请求至:

            http://195.138.193.194:5003/store/
            

            有身体:

            {
              "bundleId": "com.example.bundle",
              "products": [
                "com.example.productId1",
                "com.example.productId2",
              ]
            }
            

            【讨论】:

            • 您的服务器的带宽限制是多少?您确定要每天(或每小时)收到数百或数千个来自在 Stack Overflow 上看到此答案的人的请求吗?
            • 一个请求大约需要 10 秒。在一个线程中工作。一个小时可以处理大约 300 个请求。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-09
            • 1970-01-01
            相关资源
            最近更新 更多