Как получить доступ к цене продукта в SKPayment? - PullRequest
40 голосов
/ 24 мая 2010

У меня покупка в приложении для iPhone.

Я хочу отобразить цену в местной валюте пользователя в UILabel. Для этого мне нужна цена и валюта в переменной.

Как узнать цену, включая валюту, с помощью SKPayment? (Если SKPayment подходит для этого использования.)

Я создаю экземпляр продукта, используя:

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

Спасибо всем заранее за отзыв!

Ответы [ 5 ]

118 голосов
/ 25 мая 2010

Существует проблема с использованием только NSLocaleCurrencySymbol + price.stringValue: он не обрабатывает особенности различных локалей, например. ставят ли они символ валюты впереди или нет. Норвегия, Дания, Швеция и Швейцария все ставят свою валюту после, например. 17.00Kr. Кроме того, большинство (?) Европейских стран используют «,» вместо «.» для десятичных дробей, например. «2,99 €», а не «2,99 €».

Лучше всего использовать NSNumberFormatter. "PriceLocale", который вернул SKProduct, как продемонстрировал Эд, является ключевым. Это дает NSNumberFormatter умения правильно форматировать цену.

Вы также можете сделать это намного проще, добавив новое свойство в SKProduct с помощью категории Objective-C. Добавьте следующие два файла в ваш проект:


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

Тогда, #import "SKProduct+priceAsString.h" в вашем коде, и вы просто сможете использовать product.priceAsString в коде.

9 голосов
/ 24 мая 2010

Правильный способ определить любую из этой информации - использовать объект SKProduct, полученный из объекта SKProductResponse, возвращенного делегату после вызова - (void) start в инициализированном SKProductsRequest. Как то так:

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;
    }
}
2 голосов
/ 11 сентября 2016

Вот решение для 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
  }
}
2 голосов
/ 29 августа 2016

Вот Swift-версия приведенного выше ответа с использованием 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
    }
}
0 голосов
/ 15 февраля 2018
  • Работает в Swift и Objective-C
  • Принудительное развертывание никогда вашего друга.
  • Использование вычисляемых свойств создает более чистый код для сценария Objective-C, потому что он не требует [];)

    @ objc public extension 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)
    }
    

    }

ПРИМЕЧАНИЕ: не забудьте import StoreKit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...