ios - 使用 Swift 进行应用内购买

标签 ios swift in-app-purchase

我快要崩溃了,我已经在这上面浪费了一天半的时间。我认为 Swift 应该更容易,但与 Objective-C 相比,我发现它是一场噩梦。一个月来我一直在尝试将一个项目移植到 swift 上,我正在认真考虑放弃它并回到 Objective-C。如果有人可以提供帮助,将不胜感激。我之前使用过 raywenderlich.com 上的教程,它提供了一个很好的可重用 IAP 类。但是,当尝试将其转换为 Swift 时,我总是遇到无法解决的问题。 Xcode 给出的一些错误在其描述中完全没有意义,谷歌也帮不上什么忙。

首先,这是一个合适的代码翻译吗? Swift 指南在这里没有帮助:

objective-C

typedef void (^RequestProductsCompletionHandler)(BOOL success, NSArray * products);

swift

typealias RequestProductsCompletionHandler = (success : Bool, products : NSArray)

当我稍后尝试对此采取行动时

_completionHandler(true, skProducts)

我得到了错误

Cannot convert the expression's type '(BooleanLiteralConvertible, [AnyObject]!)' to type 'BooleanLiteralConvertible'

我也有这个问题

- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers {

if ((self = [super init])) {

    // Store product identifiers
    _productIdentifiers = productIdentifiers;

    // Check for previously purchased products
    _purchasedProductIdentifiers = [NSMutableSet set];
    for (NSString * productIdentifier in _productIdentifiers) {
        BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier];
        if (productPurchased) {
            [_purchasedProductIdentifiers addObject:productIdentifier];
            NSLog(@"Previously purchased: %@", productIdentifier);
        } else {
            NSLog(@"Not purchased: %@", productIdentifier);
        }
    }

}
return self;

因为这应该是一个初始化程序,所以我不知道如何实现它。我试图将它更改为一个常规函数,我可以在创建对象后调用它,但即便如此我还是遇到了这个问题

for productIdentifier in _productIdentifiers {
        let productPurchased = NSUserDefaults.standardUserDefaults().boolForKey(productIdentifier)
        if productPurchased {
            _purchasedProductIdentifiers.addObject(productIdentifier)
        }
    }

因为它声称 NSSet

'NSSet?' does not have a member named 'Generator'

无论那是什么意思。我还从这一行中得到关于排序或其他东西的其他随机错误。

基本上看起来变化太大了,转换本教程代码只是一个初学者。真的很高兴在 Swift 中看到这方面的教程,但谷歌不是我的 friend 。我很难相信没有这样的例子存在。

谁能帮忙!?有这方面的教程吗?最好将 IAP 设置为单独的可重用类。

最佳答案

我创建了 raywenderlich.com IAP 帮助程序的 Swift 版本。

这是 RequestProductsCompletionHandler 的外观:

typealias RequestProductsCompletionHandler = (success: Bool, products: NSArray!) -> ()

这是类变量和 init 的样子。

class IAPHelper: NSObject,SKProductsRequestDelegate,SKPaymentTransactionObserver {
    var productsRequest: SKProductsRequest!
    var completionHandler: RequestProductsCompletionHandler!
    var nonConsumableProductIDs: NSMutableSet!
    var purchasedProductIdentifiers: NSMutableSet!

    init(nonConsumableProductIDs: NSMutableSet) {
        super.init()

        // Store non-consumable product identifiers
        self.nonConsumableProductIDs = nonConsumableProductIDs

        // check for perviously purchased products
        purchasedProductIdentifiers = NSMutableSet()
        for item in nonConsumableProductIDs {
           let productIdentifier = item as String
            let productPurcahsed = NSUserDefaults.standardUserDefaults().boolForKey(productIdentifier)
            if productPurcahsed {
                println("Previously purchased: \(productIdentifier)")
                purchasedProductIdentifiers.addObject(productIdentifier)
            } else {
                println("Not purchased: \(productIdentifier)")
            }
        }

        SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    }

这是我在子类中调用它的方式:

let nonConsumableProductIDs = NSMutableSet(objects: "com.mainstreetcodellc.Smoothie.removeAds") // non-consumable products
private let _SmoothieIAPHelperSharedInstance = SmoothieIAPHelper(nonConsumableProductIDs: nonConsumableProductIDs)

class SmoothieIAPHelper: IAPHelper {

    class var sharedInstance: SmoothieIAPHelper {
        return _SmoothieIAPHelperSharedInstance
    }
}

我不愿意发布我的其余代码,因为代码太多,而且我不记得自从我第一次学习 raywenderlich 教程以来我添加了什么。如果有特定部分给您带来麻烦,我会非常乐意发布更多片段。不过,到目前为止我发布的内容应该可以回答您的问题。

关于ios - 使用 Swift 进行应用内购买,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556127/

相关文章:

ios - NSDateFormatter "dateFromString"返回零

ios - 内购、ID商品

ios - 在不增加图标大小的情况下增加可触摸区域

ios - 我的自定义 UIView 如何绘制清晰的背景?

iphone 网络服务应用程序

iOS Storekit 导致实时应用程序崩溃

javascript - 如何查看苹果收据的有效期?

ios - ScrollView 错误行为之上的 TableView

cocoa - 在 Swift 中获取应用名称

ios - 围绕单个轴旋转 SceneKit 圆柱体