web-dev-qa-db-ja.com

SKPaymentで製品の価格にアクセスする方法は?

IPhoneアプリのアプリ内購入を利用しています。

UILabelにユーザーの現地通貨で価格を表示したい。これには、変数の価格と通貨が必要です。

SKPaymentを使用して通貨を含む価格を取得するにはどうすればよいですか? (SKPaymentがこの用途に適している場合。)

私は以下を使用して製品をインスタンス化しています:

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

フィードバックをありがとうございました!

40
favo

NSLocaleCurrencySymbol + price.stringValueを使用するだけでは問題があります。これは、さまざまなロケールの特殊性を処理しません。通貨記号を前に置くかどうか。ノルウェー、デンマーク、スウェーデン、スイスはすべて通貨を後に置きます。 17.00Kr。また、ヨーロッパのほとんどの国では、「。」の代わりに「、」を使用しています。小数の場合、 「2.99ユーロ」ではなく「2,99ユーロ」。

NSNumberFormatterを使用することをお勧めします。 Edが示したように、SKProductが返した「priceLocale」が鍵となります。それはNSNumberFormatterに価格を正しくフォーマットするための賢さを与えます。

Objective-Cカテゴリを使用してSKProductに新しいプロパティを追加することで、これを大幅に簡単にすることもできます。次の2つのファイルをプロジェクトに追加します。


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コード内。

119
gid

その情報を判別する正しい方法は、初期化されたSKProduct- (void) startを呼び出した後にデリゲートに返されたSKProductResponseオブジェクトから取得した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;
    }
}
9
Ed Marty

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

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
Reza Shirazian
  • SwiftおよびObjective-Cで動作します
  • 強制アンラップはneverです。
  • 計算されたプロパティを使用すると、[]を必要としないため、Objective-Cシナリオのコードが簡潔になります。

    @objcパブリック拡張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

0
Darkwonder