2016-04-22 17 views
5

Sto cercando di visualizzare il prezzo di un in app purchase utilizzando la valuta locale, così il dollaro corretta viene visualizzata sia per noi & CA: così come Euro, GBP eccCome ottenere valuta locale per SKProduct | Visualizzare IAP Prezzo a Swift

So ogni SKProduct ha un prezzo che appare durante la transazione come una vista di avviso, questo appare quando si conferma l'acquisto.

Tuttavia, desidero visualizzare il prezzo prima della conferma.

Stavo pensando di fare qualcosa di simile:

//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 
    } 
    } 

Ma questo non funziona come i Non sembra avere una proprietà di prezzo.

Qualcuno sa come posso impostare un testo etichetta al prezzo di un PA utilizzando la valuta locale corretta?

Ad esempio £ 1.49 GBP è $ 1,99 dollari USA utilizzando la Matrice di prezzi di Apple e l'output del valore deve corrispondere ai valori del prezzo del prodotto quando si conferma la transazione.

risposta

8

è necessario utilizzare NSNumberFormatter con i valori del prodotto per prezzo e priceLocale per generare una stringa formattata correttamente indipendentemente dalla posizione dell'utente. product.price restituisce il prezzo nella valuta locale come NSDecimalNumber e product.productLocale restituisce l'NSLocale per il valore del prezzo.

esempio

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 
     } 
    } 
} 

dove priceStringForProduct è funzione definita altrove: -

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) 
} 

Si potrebbe anche voler gestire il caso particolare in cui il prezzo è 0,0 (tier gratuito). In questo caso, modificare la funzione priceStringForProduct a:

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) 
    } 
} 

Edit: Coppia le altre cose, quando si specifica il vostro productArray un modo più 'Swifty' di farlo è:

var productsArray = [SKProduct]() 

e poi nella vostra didRecieveResponse , invece di loop attraverso i prodotti si può semplicemente impostare productsArray come response.products

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

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

    } 

Modifica: per eseguire il test per una serie di diversi locali solito io faccio una serie di NSLo cales e quindi loop attraverso la stampa del risultato. C'è un pronti contro termine con tutti i di localeIdentifiers here

così:

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)) 
    } 
+0

Ah, sì si specifica che si desidera che lo SKProduct di indice 1 di productsArray, non ho notato questo. in pratica hai rimosso il prodotto dall'array e poi hai provato a eseguire il loop del prodotto piuttosto che l'array. Cambierò il codice nella mia risposta, solo un secondo. –

+0

Ho cambiato il ciclo nella mia risposta, dovrebbe funzionare ora (si spera! Haha) –

+0

In realtà l'ho cambiato io stesso in 'for i in productsArray' ma penso che Xcode fosse lento. BTW Avevo bisogno di usare 'i.productIdentifier' not' i.localizedTitle' perché il titolo è solo il nome di iAP. Quando ho cambiato, sembrava funzionare. Tuttavia, come posso testare questo per luoghi diversi? – RileyDev

1

NON DEVE visualizzare il prezzo nella valuta locale. È necessario visualizzarlo nella valuta fornita dal negozio. Se si dice che un utente francese acquista dall'app store francese, il prezzo sale in Euro, e questo è ciò che paga l'utente. Se quell'utente si reca in Nuova Zelanda e cambia la propria localizzazione in Nuova Zelanda ma rimane con l'app store francese, vengono comunque fatturati in euro. Quindi è quello che dovresti mostrare.

Si dice "£ 1,49 è $ 1,99 secondo la matrice dei prezzi di Apple". Ma £ 1,49 non costa $ 1,99.Se io, come utente britannico, vado negli Stati Uniti e compro dall'app store del Regno Unito, pago £ 1,49 anche se sono negli Stati Uniti. E "£ 1,49" è ciò che il negozio ti dirà.

versione
0

Swift 3 di Olivier priceStringForProduct:item

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) 
     } 
    } 
Problemi correlati