2016-04-22 5 views
5

Próbuję wyświetlić cenie jednego w app zakupu za pomocą lokalnej waluty, więc prawidłowa dolar jest wyświetlany zarówno w USA & Kalifornia, a także w EUR, GBP itpJak uzyskać lokalną walutę dla SKProduct | Wyświetlanie IAP Cena w Swift

znam każdy SKProduct ma cenę, która pojawia się w trakcie transakcji jako widok alertu, pojawia się przy potwierdzaniu zakupu.

Jednak chcę wyświetlić cenę przed potwierdzeniem.

myślałem aby zrobić coś takiego:

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

Ale to nie działa jak i nie wydają się mieć właściwość cen.

Czy ktoś wie, w jaki sposób mogę ustawić tekst etykiety do ceny iAP za pomocą właściwej lokalnej waluty?

Na przykład 1,49 GBP to 1,99 USD za pomocą tabeli cenników jabłek, a wyświetlenie wartości powinno odpowiadać wartościom ceny produktu podczas potwierdzania transakcji.

Odpowiedz

8

należy używać NSNumberFormatter z wartościami produktu dla ceny i priceLocale do wyprowadzenia łańcucha, który jest poprawnie sformatowany niezależnie od lokalizacji użytkownika. product.price zwraca cenę w lokalnej walucie jako NSDecimalNumber, a product.productLocale zwraca NSLocale dla wartości ceny.

np

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

gdzie priceStringForProduct funkcja jest zdefiniowana w innym miejscu: -

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

kupili także obsługiwać specjalny przypadek, gdy cena jest 0.0 (wolna tier). W tym przypadku zmiany funkcji priceStringForProduct do:

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: Kilka innych rzeczy, gdy podasz swój productArray sposób bardziej 'Swifty' robi to jest:

var productsArray = [SKProduct]() 

a następnie w didRecieveResponse zamiast zapętlenie poprzez produkty można po prostu ustawić productsArray jak response.products

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

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

    } 

Edycja: Aby przetestować dla wielu różnych lokalizacjach zwykle zrobić tablicę NSLo i kończy pętlę drukowania wyniku. Jest repo ze wszystkimi localeIdentifiers męska here

tak:

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, tak ty określasz, że chcesz SKProduct o indeksie 1 productsArray, nie zauważyłem tego. w zasadzie wyjęliście produkt z tablicy, a następnie próbowali przechwycić produkt, a nie tablicę. Zmienię kod w mojej odpowiedzi, tylko na sekundę. –

+0

Zmieniłem pętlę w mojej odpowiedzi, to powinno działać teraz (mam nadzieję! Haha) –

+0

Właściwie to zmieniłem ją na 'for i in productsArray', ale myślę, że Xcode był powolny. BTW Potrzebowałem użyć 'i.productIdentifier', a nie' i.localizedTitle', ponieważ tytuł jest tylko nazwą iAP. Kiedy się zmieniłem, wydawało się, że działa. Jak jednak mogę to przetestować dla różnych lokalizacji? – RileyDev

1

ZABRANIA się wyświetlić ceny w walucie lokalnej. Musisz wyświetlić go w walucie udostępnianej przez sklep. Jeśli, powiedzmy, francuski użytkownik kupuje od francuskiego sklepu z aplikacjami, cena pojawia się w euro i to właśnie płaci użytkownik. Jeśli ten użytkownik wyruszy do Nowej Zelandii i zmieni lokalizację na Nową Zelandię, ale pozostanie w sklepie z aplikacjami w języku francuskim, nadal będą naliczane opłaty w euro. To właśnie powinieneś wyświetlić.

Mówi się, że "1,49 £ to 1,99 USD według matrycy cenowej Apple". Ale 1,49 £ NIE JEST 1,99 USD.Jeśli ja, jako użytkownik brytyjski, udam się do USA i kupię w sklepie z aplikacjami w Wielkiej Brytanii, zapłacę 1,49 £, nawet jeśli jestem w USA. I "1,49 £" jest tym, co sklep ci powie.

0

Swift 3 wersja Oliviera 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) 
     } 
    } 
Powiązane problemy