앱 내 결제기능을 적용하기위해 in-app purchases를 사용한다.
필요조건
- itunes connect 계정 (은행정보 입력되어 있어야 함)
1. 프레임 워크 추가하기
프레임워크는 좌측 프로젝트 > TARGETS > Capabilities > in-App Purchase ON 으로 하여 완료되었을경우 자동으로 추가됨
프레임워크 추가 되었는지 확인
2. 인 앱 제픔 productID 확인하기
ViewController.swift
// StoreKit 를 import 해주고 SKProductsRequestDelegate,SKPaymentTransactionObserver 를 추가 합니다
import StoreKit
class ViewController: UIViewController,SKProductsRequestDelegate,SKPaymentTransactionObserver {
...
}
// productID 에는 itunes connect > 나의 App > CustomApp > App내 추가기능 에 등록 한 제품 ID를 입력 합니다. ( 미리 제품을 등록해야 합니다!)
UIViewController,SKProductsRequestDelegate,SKPaymentTransactionObserver {
// 제품 타이틀과 정보, 구매버튼 아울렛
@IBOutlet weak var productTitle: UILabel!
@IBOutlet weak var productDescription: UITextView!
@IBOutlet weak var buybutton: UIButton!
@IBOutlet weak var reStorebutton: UIButton!
var product: SKProduct?
var productID = "product ID 입력"
...
...
}
3. 코딩 작업
이제 결제 작업을 위해 트랜젝션 감시자 설정과, 제품정보를 얻어서 사용자에게 표시하는 메서드
를 만들어야 한다.
override func viewDidLoad() {
super.viewDidLoad()
//구매제품정보 얻을때까지 구매버튼, Restore 버튼 비활성화
buybutton.enabled = false
reStorebutton.enabled = false
//결제 작업을 위해 트랜잭션 감시자를 설정reStorebutton.enabled = false
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
//앱스토어에 접속하고 지정한 ID에 대한 제품 정보를 가지고 와서 표시하는 함수 호출
//앱스토어에 접속하고 지정한 ID에 대한 제품 정보를 가지고 와서 표시하는 함수 호출
ItemProduct()
}
// 제품정보가져오는 함수
// 제품정보가져오는 함수
func ItemProduct(){
if SKPaymentQueue.canMakePayments(){
let request = SKProductsRequest(productIdentifiers: NSSet(object: self.productID) as! Set<String>)
request.delegate = self
// 제품정보를 가져올 경우 didReceiveResponse 델리게이트 메서드 호출
request.start()
}else{
print("Please enable in App purchase in Settings")
}
}
//didReceiveResponse 델리게이트 메서드
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
var products = response.products
print(products)
if (products.count != 0){
product = products[0] as SKProduct
//제품정보 확인! 구매버튼, Restore 버튼 활성화
buybutton.enabled = true
reStorebutton. enabled = true
reStorebutton. enabled = true
// 제품 타이틀과 정보 각각 넣기
productTitle.text = product!.localizedTitle
productDescription.text = product!.localizedDescription
}else{
print("product not found")
}
if response.invalidProductIdentifiers.count != 0 {
print(response.invalidProductIdentifiers.description)
}
for product in products
{
print("Product not found: \(product)")
}
}
// 구매버튼의 함수에 결제프로세스를 시작, 트랜잭션 감시자 객체의 updatedTransactions 메서드를 호출하도록 한다
// 구매버튼의 함수에 결제프로세스를 시작, 트랜잭션 감시자 객체의 updatedTransactions 메서드를 호출하도록 한다
@IBAction func buyproduct(sender: AnyObject) {
// Restore 버튼 함수에 Restore 트랜젝션 메서드 호출
let payment = SKPayment(product: product!)
SKPaymentQueue.defaultQueue().addPayment(payment)
} // Restore 버튼 함수에 Restore 트랜젝션 메서드 호출
@IBAction func RestoreAction(sender: AnyObject) {
print("restore")
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}
//updatedTransactions 메서드
func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transactions in transactions as [SKPaymentTransaction]{
switch transactions.transactionState{
case SKPaymentTransactionState.Purchased:
print("buy, ok unlock")
self.success()
SKPaymentQueue.defaultQueue().finishTransaction(transactions)
break;
case SKPaymentTransactionState.Failed:
print("buy error")
SKPaymentQueue.defaultQueue().finishTransaction(transactions)
break;
case SKPaymentTransactionState.Restored:
print("Rstore")
self.restoreFeature()
SKPaymentQueue.defaultQueue().finishTransaction(transactions)
break;
default:
print("defult")
break;
}
}
}
// 결제 완료 됐을 시 실행될 함수
func success() {
buybutton.enabled = false
print("ok")
}
// Restore 완료 됐을 시 실행될 함수
// Restore 완료 됐을 시 실행될 함수
func restoreFeature(){
reStorebutton.enabled = false
print("restore")
}
이렇게 구매버튼 과 Restore 버튼을 사용하여 인 앱 결제를 마무리 하였다.
댓글 없음:
댓글 쓰기