Swift IAP本地化价格

时间:2015-06-06 19:00:19

标签: swift ios8 in-app-purchase

我正在尝试通过标签将本地化价格添加到我游戏的商店部分。我正在努力让它发挥作用。

这是购买位代码的一部分,非常标准。

我的所有商品标识符都有一个枚举。

enum ProductID: String {
   case product1
   case product2
}

和标准付款代码。

func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {
println("add payment")

    for transaction in transactions {

     switch transaction.transactionState {

    case .purchased:
        print("buy, ok unlock iap here")
        print(p.productIdentifier)

        let productIdentifier = transaction.payment.productIdentifier

        switch productIdentifier {
        case ProductID.product1.rawValue:
            print("Product 1 bought")
            //do something
        case ProductID.product2.rawValue:
           print("Product 2 bought")
           //do something
         default:
             print("IAP not setup")
     }
 }  

我使用以下扩展来获取本地化价格,再次漂亮的锅炉板

extension SKProduct {

    var localizedPrice: String {
        let formatter = NSNumberFormatter() 
        formatter.numberStyle = .CurrencyStyle
        formatter.locale = self.priceLocale
        return formatter.stringFromNumber(self.price) ?? "\(price)"
    }
}

因此,在我的产品按钮下方的价格标签中,我如何添加每个产品的本地化价格

priceProduct1Label.text = "\(?.localizedPrice)"
priceProduct2Label.text = "\(?.localizedPrice)"

我基本上为问号输入什么?我读过的视频和教程要么不告诉你,要么他们不会对产品使用switch语句。 非常感谢你提前回复

3 个答案:

答案 0 :(得分:1)

我终于明白了。当按下其中一个购买按钮时,我基本上采用了用于识别产品的相同代码。我刚刚用标签详细信息替换了加载buyProduct()函数的行。比如我的一个价格标签的例子。

func loadPriceLabel1() {
    for product in products where product.productIdentifier == ProductID.product1.rawValue {

       self.titleLabel.text = "\(product.localizedTitle)"
       self.priceLabel1.text = "\(product.localizedPrice)"
       etc        
    }
}

我在产品请求完成后,在购买按钮启用后立即加载标签功能。可能是一个稍微笨重的解决方案,但它的效果很好。如果有人有任何改进建议,请告诉我。

答案 1 :(得分:0)

您正在寻找SKProduct的实例,您可以通过SKProductsRequest使用一个或多个产品标识加载:

import StoreKit

class MyStore: NSObject, SKProductsRequestDelegate {

    func loadProductsForProductIdentifiers( productIdentifiers: Set<String ) {

        let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers )
        productRequest.delegate = self ///< Make sure to set a delegate
        productRequest.start()
    }

    // MARK: - SKProductsRequestDelegate

    func productsRequest(request: SKProductsRequest!, didReceiveResponse response: SKProductsResponse!) {

        for object in response.products {
            if let product = object as? SKProduct {
                // Store these products and use their `productIdentifier` property to identify them
            }
        }
    }
}

答案 2 :(得分:0)

我对crashoverride777的上述答案略有不同,而不是标签,按钮,并且不仅要绘制iTunes Connect的本地化价格,还要绘制构成按钮标题的其他内容 - localizedTitle:< / p>

    func loadBuy00ButtonTitle() {
    for product in productArray {
        let prodID = product.productIdentifier
        if(prodID == "com.YourCompanyNameGoesHere.YourAppNameGoesHere.buy00Button") {
            let prod = product
            buy00Button.setTitle("Buy \(prod.localizedTitle): \(prod.localizedPrice())", for: .normal)
        }
    }
}

我在美国,因此我的按钮标题为:“购买100个硬币:0.99美元” - 对于该产品(购买),“100个硬币”是本地化标题,“0.99美元”是本地化价格。

再次稍微改变一下,我也使用他提供的相同扩展名(在他的问题中),我将其放在一个单独的Swift文件中:

import StoreKit

extension SKProduct {

    func localizedPrice() -> String {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.locale = self.priceLocale
        return formatter.string(from: self.price)!
    }

}

Ben Dodson's SKProduct localized price extension in Swift