user3722523
user3722523

Reputation: 1800

In App purchase swift

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

Answers (2)

Josué H.
Josué H.

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

chasew
chasew

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

Related Questions