参考In app Purchases ...我参考此技术说明:https://developer.apple.com/library/ios/technotes/tn2387/_index.html
它声明我们应该didFinishLaunchingWithOptions在AppDelegate文件中添加事务观察器.而且,我们应该删除事务观察员参加applicationWillTerminate的AppDelegate.
这与我所阅读的许多教程(当前的教程)不一致,并且与此问题上的许多主题(最近也是如此)不一致.
我很迷惑.苹果显然是"堆积之王".所以我应该采用技术说明的方向并添加事务队列观察器didFinishLaunchingWithOptions并将其删除applicationWillTerminate?
有人可以再详细说明一下吗?提前致谢.
我有一个简单的应用程序,有一个非消费类应用内购买选项.
从我的初始视图控制器,我有一个"输入"按钮.
此按钮将向一个TabBarController"A"以及一系列视图和"付费"用户发送一个"免费"用户(尚未购买非消费品)给另一个TabBarController"B"一组不同的视图.这些视图永远不会相交.
我想检查一下,我的代码能够有效地区分用户是否进行了应用内购买或其他方式.
这是我的代码:
import UIKit
import StoreKit
class MainMainViewController: UIViewController, UIScrollViewDelegate, SKProductsRequestDelegate, SKPaymentTransactionObserver {
let defaults = NSUserDefaults.standardUserDefaults()
var product_id: NSString?;
...
override func viewDidLoad() {
product_id = "some.iap.id";
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
super.viewDidLoad()
}
@IBAction func Enter(sender: AnyObject) {
//Check if product is purchased
if (defaults.boolForKey("purchased")){
print("User has purchased da goods!")
// Grant or otherwise full access based on whether user has purchased/not purchased.
// Goto TabBarController A - FULL Access:
let vc = self.storyboard!.instantiateViewControllerWithIdentifier("TabBarControllerPaid") as! TabBarControllerPaid
self.presentViewController(vc, animated: true, …Run Code Online (Sandbox Code Playgroud) 这个问题困扰了我几天。
这是我的相关故事板布局:
我已经将所有三个视图控制器设置为所有布局,并且仍然得到一个结果表视图,在横幅视图上方有一个“间隙” - 看起来与横幅视图的高度相同。如下:
有效的一件事是将容器视图拖动到底部横幅视图上,如下所示:
结果在我的测试设备以及每个模拟器上都完美呈现 - 即没有间隙。
但这样的解决方案本质上是一种黑客攻击,我想看看是否可以采取任何措施来正确解决该问题。
作为记录,我已经尝试了 IB 中的每个选项 - 调整滚动视图插图、在顶部/底部栏下延伸边缘等......以及我在谷歌上到处搜索的各种代码片段。似乎没有什么可以解决我的问题。
我设法解决了导航栏下表格视图顶部的间隙(这似乎是一个存在大量内容的常见问题)。但像我上面这样的情况好像并不多。
非常感谢任何帮助或指示。谢谢大家:-)
* 附加信息 *
根据下面的评论,我添加了我为所述容器尝试过的约束:
我已经完成了一个小应用程序,我有一个非消耗品的购买选项。它在 App Store 上。
购买的产品运行正常。我的恢复购买功能似乎什么也没做。
我已为恢复购买添加了此代码@IBAction:
@IBAction func restorePurchases(sender: AnyObject) {
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}
Run Code Online (Sandbox Code Playgroud)
但是当我点击恢复购买按钮时没有任何反应。
我想我必须添加一个函数来检查恢复是否成功。我计划将代码修改为以下内容:
@IBAction func restorePurchases(sender: AnyObject) {
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}
func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {
for transaction:AnyObject in transactions {
if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
switch trans.transactionState {
case .Restored:
SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction)
var alert = UIAlertView(title: "Thank You", message: "Your purchase(s) were restored.", delegate: nil, cancelButtonTitle: "OK")
alert.show()
break;
case .Failed:
SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction)
var alert = UIAlertView(title: "Sorry", …Run Code Online (Sandbox Code Playgroud) 我有一些恢复交易仍然卡在我的付款队列中 - 因为finishTransaction在我测试有缺陷的恢复购买操作时,一旦交易恢复,我从未调用过该交易。
从一些在线研究中,我意识到我必须手动强制完成付款队列中未完成的交易。
有人在 Objective-C 中发布了这段代码:
// take current payment queue
SKPaymentQueue* currentQueue = [SKPaymentQueue defaultQueue];
// finish ALL transactions in queue
[currentQueue.transactions enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[currentQueue finishTransaction:(SKPaymentTransaction *)obj];
}];
Run Code Online (Sandbox Code Playgroud)
我不知道如何将其转换为 Swift 2.0。
任何人都可以帮我做到这一点吗?谢谢 :-)