Reputation: 1800
I'm trying to add In-app purchase in my app for the first time. There is no guide with swift language on the net. So I started to convert Obj-c to swift but I don't know what mean this line and how I can convert it into swift.
proUpgradeProduct = [products count] == 1 ? [[products firstObject] retain] : nil;
from this guide: http://troybrant.net/blog/2010/01/in-app-purchases-a-full-walkthrough/
extract:
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
NSArray *products = response.products;
proUpgradeProduct = [products count] == 1 ? [[products firstObject] retain] : nil;
if (proUpgradeProduct)
{
NSLog(@"Product title: %@" , proUpgradeProduct.localizedTitle);
NSLog(@"Product description: %@" , proUpgradeProduct.localizedDescription);
NSLog(@"Product price: %@" , proUpgradeProduct.price);
NSLog(@"Product id: %@" , proUpgradeProduct.productIdentifier);
}
for (NSString *invalidProductId in response.invalidProductIdentifiers)
{
NSLog(@"Invalid product id: %@" , invalidProductId);
}
// finally release the reqest we alloc/init’ed in requestProUpgradeProductData
[productsRequest release];
[[NSNotificationCenter defaultCenter] postNotificationName:kInAppPurchaseManagerProductsFetchedNotification object:self userInfo:nil];
}
Please if anyone know In-App purchase guide in swift it will be so nice !
Upvotes: 0
Views: 941
Reputation: 1191
First I need import the StoreKit and Implemented SKProductsRequestDelegate, SKPaymentTransactionObserver
//In this method check your products can make payments and then call the productsRequest
func requestProductInfo(idProduct : String!) {
var productInfo : SKProduct?
if SKPaymentQueue.canMakePayments() {
let productRequest = SKProductsRequest(productIdentifiers: [idProduct])
productRequest.delegate = self
productRequest.start()
} else {
NSLog("Can't Make Payments Right Now...! =(")
}
}
//MARK: Getting products from In-App Purchase (iTunes Connect)
public func productsRequest(request: SKProductsRequest!, didReceiveResponse response: SKProductsResponse!) {
if response.products.count != 0 {
for product in response.products {
producsArray.append(product as! SKProduct)
}
println("Getting Products from iTunes Connect\(producsArray.count)")
//Call the method to purchase
buyProduct(producsArray[0])
} else {
println("No Products....")
}
}
After to get all Items. You can Purchase any product. Only you need implemented the public func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!)
//Purchase Product
func buyProduct(product : SKProduct){
println("Purchase....")
var payment = SKPayment(product: product)
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().addPayment(payment)
}
public func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {
for transaction in transactions as! [SKPaymentTransaction] {
switch transaction.transactionState {
case SKPaymentTransactionState.Purchased:
println("Transaction completed successfully.")
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
case SKPaymentTransactionState.Failed:
println("Transaction Failed");
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
case SKPaymentTransactionState.Restored:
println("Restored....\(transaction.payment.productIdentifier)");
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
default:
println(transaction.transactionState.rawValue)
}
}
}
Is very important after tu purchase any product release the the SKPaymentQueue calling finishTransaction
:
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
Upvotes: 0
Reputation: 8828
The trick is to know what the errors are saying, but its fixed by typing things correctly using optionals
var products = response.products
var proUpgradeProductOpt:SKProduct? = products.count == 1 ? products.first as SKProduct? : nil
if let proUpgradeProduct = proUpgradeProductOpt {
println("Product title: \(proUpgradeProduct.localizedTitle)")
println("Product description: \(proUpgradeProduct.localizedDescription)")
println("Product price: \(proUpgradeProduct.price)")
println("Product id: \(proUpgradeProduct.productIdentifier)")
}
Upvotes: 2