2010-05-24 2 views
38

Sto avendo un acquisto in-app per un'app per iPhone.Come accedere al prezzo di un prodotto in SKPayment?

Desidero visualizzare il prezzo nella valuta locale degli utenti in una UILabel. Per questo ho bisogno della valuta & in una variabile.

Come posso ottenere il prezzo inclusa la valuta utilizzando SKPayment? (Se SKPayment è corretto per questo uso.)

sto un'istanza del prodotto mediante:

SKPayment *payment = [SKPayment paymentWithProductIdentifier:@"Identifier"]; 

Grazie a tutti in anticipo per il vostro feedback!

risposta

116

C'è un problema con usando solo NSLocaleCurrencySymbol + price.stringValue: non gestisce le peculiarità dei diversi locali, ad esempio. se mettono il simbolo della valuta davanti o no. Norvegia, Danimarca, Svezia e Svizzera mettono tutti la loro valuta dopo, ad es. 17.00Kr. Inoltre, la maggior parte dei (?) Paesi europei usa "," invece di "." per decimali, ad es. "2,99 €" anziché "2,99 €".

Un piano migliore consiste nell'utilizzare NSNumberFormatter. Il "priceLocale" restituito da SKProduct, come ha dimostrato Ed, è la chiave. Fornisce a NSNumberFormatter le capacità per formattare correttamente un prezzo.

È anche possibile semplificare molto l'operazione aggiungendo una nuova proprietà a SKProduct utilizzando una categoria Objective-C. Aggiungere i seguenti due file al progetto:


SKProduct + priceAsString.h:

#import <Foundation/Foundation.h> 
#import <StoreKit/StoreKit.h> 

@interface SKProduct (priceAsString) 
@property (nonatomic, readonly) NSString *priceAsString; 
@end 

SKProduct + priceAsString.m:

#import "SKProduct+priceAsString.h" 

@implementation SKProduct (priceAsString) 

- (NSString *) priceAsString 
{ 
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
    [formatter setFormatterBehavior:NSNumberFormatterBehavior10_4]; 
    [formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
    [formatter setLocale:[self priceLocale]]; 

    NSString *str = [formatter stringFromNumber:[self price]]; 
    [formatter release]; 
    return str; 
} 

@end 

Quindi, #import "SKProduct+priceAsString.h" nel codice e si dovrebbe essere in grado di utilizzare product.priceAsString nel codice.

+1

questa è una bellissima soluzione, grazie per aver aggiunto questo! Ho cambiato la risposta alla tua soluzione. – favo

+4

Qualche idea su come testare questo con valute diverse? – knagode

+0

In qualche modo questo sta restituendo "US $ " per me. Ho notato questo quando ho aggiornato a iOS6, qualche idea perché? – schystz

9

Il modo corretto per determinare una di tali informazioni è quello di utilizzare un oggetto SKProduct, recuperato dall'oggetto SKProductResponse restituito al delegato dopo una chiamata a - (void) start su un inizializzato SKProductsRequest. Qualcosa di simile a questo:

SKProductsRequest *req = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:@"Identifier"]]; 
req.delegate = self; 
[req start]; 

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse: (SKProductsResponse *)response { 
    [request autorelease]; 
    if (response.products.count) { 
     SKProduct *product = [response.products objectAtIndex:0]; 
     NSLocale *priceLocale = product.priceLocale; 
     NSDecimalNumber *price = product.price; 
     NSString *description = product.localizedDescription; 
    } 
} 
+5

grazie! usato in questo modo: myLabel.text = [NSString stringWithFormat: NSLocalizedString (@ "i costi di bla sono% @% @", nil), [priceLocale objectForKey: NSLocaleCurrencySymbol], [price stringValue]]; – favo

+1

grazie a tutti e due! ma per essere corretti al 101% dovresti usare: 'NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init];' [numberFormatter setFormatterBehavior: NSNumberFormatterBehavior10_4]; '[numberFormatter setNumberStyle: NSNumberFormatterDecimalStyle];' 'myLabel.text = [NSString stringWithFormat: NSLocalizedString (@ "% @% @", nil), [numberFormatter stringFromNumber: _price], [_priceLocale objectForKey: NSLocaleCurrencySymbol]]; 'per correggere il separatore decimale per diverse regioni, ad esempio 2,50 $ per US e 2,50 € per l'europeo. – zero3nna

+0

@ Zero3nna negli Stati Uniti metti il ​​$ davanti al numero, questo lo mette dietro a noi che è molto strano per noi. –

2

Ecco la versione Swift della risposta di cui sopra con un extension:

extension SKProduct { 

    func priceAsString() -> String { 

     let formatter = NSNumberFormatter() 
     formatter.formatterBehavior = .Behavior10_4 
     formatter.numberStyle = .CurrencyStyle 
     formatter.locale = self.priceLocale 
     return formatter.stringFromNumber(self.price)! as String 
    } 
} 
1

Ecco la soluzione per Swift 3.0

extension SKProduct { 
    func priceAsString() -> String { 
    let formatter = NumberFormatter() 
    formatter.formatterBehavior = .behavior10_4 
    formatter.numberStyle = .currency 
    formatter.locale = self.priceLocale 
    return formatter.string(from: self.price)! as String 
    } 
} 
0
  • Opere in Swift e Objective-C
  • Forza Scartare è mai tuo amico.
  • Uso delle proprietà elaborato crea codice più pulito per lo scenario Objective-C, perché non ha bisogno di [];)

    @objc estensione pubblico SKProduct {

    var priceAsString: String? { 
    
        let formatter = NumberFormatter() 
        formatter.formatterBehavior = .behavior10_4 
        formatter.numberStyle = .currency 
        formatter.locale = self.priceLocale 
        formatter.string(from: self.price) 
    
        return formatter.string(from: self.price) 
    } 
    

    }

NOTA: non dimenticare import StoreKit