web-dev-qa-db-fra.com

Comment obtenir la devise locale pour SKProduct | Affichage du prix IAP en Swift

J'essaie d'afficher le prix d'un achat intégré à l'application en utilisant la devise locale, afin d'afficher le dollar correct pour les États-Unis et les États-Unis, ainsi que pour l'euro, la livre sterling, etc. 

Je sais que chaque produit SKProduct a un prix qui apparaît pendant la transaction sous forme d'alerte, il apparaît lors de la confirmation de l'achat. 

Cependant, je souhaite afficher le prix avant confirmation. 

Je pensais faire quelque chose comme ça: 

//Products Array
var productsArray: Array<SKProduct!> = []

//Request Products
    func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
        if response.products.count != 0 {
            for product in response.products {
                print("\(product.localizedTitle)")
                productsArray.append(product)
            }
        }
        else {
            print("There are no products.")
        }

        if response.invalidProductIdentifiers.count != 0 {
            print("\(response.invalidProductIdentifiers.description)")
        }


     }


let item = SKProduct
  for i in productsArray {
    if i.localizedTitle == "com.Company.App.item1" 
      item = i
    }
  }

Mais cela ne fonctionne pas car i Ne semble pas avoir de propriété de prix.

Est-ce que quelqu'un sait comment je peux définir un libellé d'étiquette sur le prix d'un IP en utilisant la devise locale correcte? 

Par exemple, £ 1,49 GBP correspond à 1,99 USD en utilisant la matrice de tarification des pommes et la sortie de la valeur doit correspondre à la valeur du prix du produit lors de la confirmation de la transaction. 

13
RileyDev

Swift 4.2 version de la réponse d'Olivier

func priceStringForProduct(item: SKProduct) -> String? {
    let price = item.price
    if price == NSDecimalNumber(decimal: 0.00) {
        return "GET" //or whatever you like really... maybe 'Free'
    } else {
        let numberFormatter = NumberFormatter()
        let locale = item.priceLocale
        numberFormatter.numberStyle = .currency
        numberFormatter.locale = locale
        return numberFormatter.string(from: price)
    }
}
3
Fri3ndlyGerman

vous devez utiliser NSNumberFormatter avec les valeurs de produit pour price et priceLocale pour générer une chaîne correctement formatée, indépendamment de l'emplacement de l'utilisateur. product.price renvoie le prix dans la devise locale sous la forme d'un NSDecimalNumber et product.productLocale renvoie le NSLocale pour la valeur du prix.

par exemple

var item = SKProduct()
for i in productsArray {
    if i.productIdentifier == "com.Company.App.item1" {
      item = i
      if let formattedPrice = priceStringForProduct(item) {
        //update ui with price
      }
    } 
 }

où priceStringForProduct est une fonction définie ailleurs: -

func priceStringForProduct(item: SKProduct) -> String? {
    let numberFormatter = NSNumberFormatter()
    let price = item.price
    let locale = item.priceLocale
    numberFormatter.numberStyle = .CurrencyStyle
    numberFormatter.locale = locale
    return numberFormatter.stringFromNumber(price)
}

Vous pouvez également vouloir gérer le cas particulier où le prix est 0.0 (niveau gratuit). Dans ce cas, modifiez la fonction priceStringForProduct pour:

func priceStringForProduct(item: SKProduct) -> String? {
    let price = item.price
    if price == NSDecimalNumber(float: 0.0) {
        return "GET" //or whatever you like really... maybe 'Free'
    } else {
        let numberFormatter = NSNumberFormatter()
        let locale = item.priceLocale
        numberFormatter.numberStyle = .CurrencyStyle
        numberFormatter.locale = locale
        return numberFormatter.stringFromNumber(price)
    }
}

Modifier: Ajoutez d’autres choses, lorsque vous spécifiez votre produitArray, une façon plus «swifty» de le faire est la suivante:

var productsArray = [SKProduct]()

puis dans votre didRecieveResponse, au lieu de parcourir en boucle les produits, vous pouvez simplement définir productsArray en tant que response.products.

var productsArray = [SKProduct]()
    if response.products.count != 0 {

        print("\(response.products.map {p -> String in return p.localizedTitle})")
        productsArray = response.products

    }

Edit: Pour tester un certain nombre de paramètres régionaux, je crée généralement un tableau de NSLocales, puis affiche en boucle le résultat. Il y a un repo avec tous les here de localeIdentifiers 

alors:

let testPrice = NSDecimalNumber(float: 1.99)
let localeArray = [NSLocale(localeIdentifier: "uz_Latn"),
    NSLocale(localeIdentifier: "en_BZ"),
    NSLocale(localeIdentifier: "nyn_UG"),
    NSLocale(localeIdentifier: "ebu_KE"),
    NSLocale(localeIdentifier: "en_JM"),
    NSLocale(localeIdentifier: "en_US")]
    /*I got these at random from the link above, pick the countries
    you expect to operate in*/

    for locale in localeArray {
        let numberFormatter = NSNumberFormatter()
        numberFormatter.numberStyle = .CurrencyStyle
        numberFormatter.locale = locale
        print(numberFormatter.stringFromNumber(testPrice))
    }
16
Olivier Wilkinson

Le code de programmation de StoreKit contient cet extrait de code permettant d'afficher le prix dans la devise de l'App Store:

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setLocale:product.priceLocale];
NSString *formattedPrice = [numberFormatter stringFromNumber:product.price];

https://developer.Apple.com/library/content/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/ShowUI.html Liste 2-3

4
phil mccullick

Vous NE DEVEZ PAS afficher le prix dans la devise locale. Vous devez l'afficher dans la devise fournie par le magasin. Si un utilisateur français achète sur l'App Store français, le prix est exprimé en euros et c'est ce que l'utilisateur paye. Si cet utilisateur se rend en Nouvelle-Zélande et change ses paramètres régionaux pour la Nouvelle-Zélande mais reste chez l'app store français, ils sont toujours facturés en euros. Donc, c'est ce que vous devriez afficher. 

Vous dites que "1,49 £ correspond à 1,99 $ selon la matrice de tarification d'Apple". Mais 1,49 £ IS PAS 1,99 $. Si, en tant qu'utilisateur britannique, je vais aux États-Unis et que je l'achète au Royaume-Uni, je paie 1,49 £, même si je suis aux États-Unis. Et "1,49 £" est ce que le magasin vous dira. 

4
gnasher729

Swift 3 version du priceStringForProduct:item d'Olivier

func priceStringForProduct(item: SKProduct) -> String? {
        let price = item.price
        if price == 0 {
            return "Free!" //or whatever you like
        } else {
            let numberFormatter = NumberFormatter()
            let locale = item.priceLocale
            numberFormatter.numberStyle = .currency
            numberFormatter.locale = locale
            return numberFormatter.string(from: price)
        }
    }
1
Jacob Davis