我快要崩溃了,我已经在这上面浪费了一天半的时间。我认为 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/