2010-05-24 6 views
38

iPhone 앱의 인앱 구매가 있습니다.SKPayment에서 제품 가격에 액세스하는 방법은 무엇입니까?

UILabel에서 사용자의 현지 통화로 가격을 표시하려고합니다. 이를 위해서는 변수에 & 통화가 필요합니다.

SKPayment를 사용하여 통화를 포함한 가격을 어떻게받을 수 있습니까? (SKPayment이 사용에 대한 올바른 정보입니다.)

내가 사용하여 제품의 인스턴스를하고있어

:

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

는 의견을 사전에 모두 감사를!

답변

116

단지 NSLocaleCurrencySymbol + price.stringValue를 사용에 문제가있다 : 그것은 예를 들어 다른 로케일의 특수성을 처리하지 않습니다. 통화 기호를 앞에 놓았는지 여부. 노르웨이, 덴마크, 스웨덴, 스위스는 모두 통화를 예치합니다. 17.00Kr. 또한 대부분의 (?) 유럽 국가에서는 ','대신 ','을 사용합니다. 십진수의 경우, 예. "2.99 €가 아닌"2,99 € "입니다.

더 나은 계획은 NSNumberFormatter를 사용하는 것입니다. Ed가 시연 한대로 SKProduct가 반환 한 "priceLocale"이 핵심 요소입니다. NSNumberFormatter는 가격을 정확하게 형식화하기 위해 현명합니다.

Objective-C 카테고리를 사용하여 SKProduct에 새 속성을 추가하면 훨씬 쉽게 만들 수 있습니다.


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을 사용할 수 있습니다.

+1

그것은 아름다운 해결책입니다, 이것을 추가해 주셔서 감사합니다! 나는 당신의 해결책에 대한 해답을 바꾸었다. – favo

+4

어떻게 다른 통화로 이것을 테스트 할 수 있습니까? – knagode

+0

여하튼 이것은 "US $ "을 돌려주었습니다. 나는 iOS6으로 업그레이드했을 때 이것을 알 수있다. 왜 그런가? – schystz

9

정보 중 하나를 결정하는 정확한 방법은 초기화 SKProductsRequest- (void) start 호출 후 대리인에게 반환 SKProductResponse 대상물로부터 검색된 SKProduct 오브젝트를 사용하는 것이다. 이런 식으로 뭔가 :

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

감사합니다! 다음과 같이 사용 : myLabel.text = [NSString stringWithFormat : NSLocalizedString (@ "bla 비용은 % @ % @", nil), [priceLocale objectForKey : NSLocaleCurrencySymbol], [price stringValue]]; – favo

+1

둘 다 감사합니다! NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init];''[numberFormatter setFormatterBehavior : NSNumberFormatterBehavior10_4];''[numberFormatter setNumberStyle : NSNumberFormatterDecimalStyle];''myLabel.text = [NSString stringWithFormat : NSLocalizedString (@ "% @ % @", nil), [numberFormatter stringFromNumber : _price], [_priceLocale objectForKey : NSLocaleCurrencySymbol]]'미국의 경우 2.50 $ 및 2,50 유로의 경우와 같이 다른 지역에 대한 10 진수 분리자를 수정합니다. 유럽의 경우. – zero3nna

+0

@ Zero3nna 미국에서 전화 번호 앞에 $를 붙이면 이것은 뒤쳐져 매우 이상합니다. –

2

은 여기 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

을 스위프트 (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
  • 작품 스위프트 및 목표 - C
  • 강제 랩 해제는 결코 당신의 친구입니다.)

    공용 확장 @objc {

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

    }

SKProduct를 그것은 []이 필요하지 않기 때문에, 계산 된 특성을 사용

  • 객관적-C 시나리오 청소기 코드를 작성 참고 : 잊지 마세요 import StoreKit

  • 관련 문제