【问题标题】:Method does not reach Completion Block方法未达到完成块
【发布时间】:2014-07-12 04:13:45
【问题描述】:

我正在使用SKStoreProductViewController 通过以下方法显示 iTunes 产品。该方法被调用,但我没有成功或错误。知道为什么吗?:

@IBAction func BuySomething(sender : AnyObject) {

    NSLog("%@","called");//gets called

    let storeViewController:SKStoreProductViewController = SKStoreProductViewController();

    storeViewController.delegate = self;

    var someitunesid:String = "676059878";

    var productparameters = [SKStoreProductParameterITunesItemIdentifier:someitunesid];

    storeViewController.loadProductWithParameters(productparameters, { (success: Bool!,          error: NSError!) -> Void in
        if success {
            NSLog("%@",success)//no call
            self.presentViewController(storeViewController, animated: true, completion: nil);
        } else {
            NSLog("%@", error)//no call
        }
    })
}

【问题讨论】:

  • 确保您的设备已为 AppStore 配置了 AppleID...
  • 确保您定位的产品在当前平台上可用(如果应用程序只有 iPad,它不会在 iPhone 上加载,但不会显示错误)。

标签: ios in-app-purchase swift storekit


【解决方案1】:

由于某些原因SKStoreProductViewController 在模拟器上无法运行,您必须在实际设备上尝试。

我刚刚在实际设备上进行了尝试,并获得了成功调用回调后实际设备上的屏幕截图:

这是我用来执行此操作的代码:

import UIKit
import StoreKit

class ViewController: UIViewController,SKStoreProductViewControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()



    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    @IBAction func BuySomething(sender : AnyObject) {

        NSLog("%@","called");//gets called

        let storeViewController:SKStoreProductViewController = SKStoreProductViewController();

        storeViewController.delegate = self;

        var someitunesid:String = "676059878";

        var productparameters = [SKStoreProductParameterITunesItemIdentifier:someitunesid];

        storeViewController.loadProductWithParameters(productparameters, {
            (success: Bool!,error: NSError!) -> Void in
            if success {
                NSLog("%@",success)
                self.presentViewController(storeViewController, animated: true, completion: nil);
            } else {
                NSLog("%@", error)
            }
            })
    }

    // this is SKStoreProductViewControllerDelegate implementation
    func productViewControllerDidFinish(viewController: SKStoreProductViewController!) {

    }


}

【讨论】:

  • 我正在 iphone 和 ipad 上开发 ios 8。你让它工作真是太棒了!有趣的事。我已经导入了 StoreKit,链接了库并做了我认为应该做的一切。互联网连接很强...良好的 wifi,良好的蜂窝网络...嗯...
  • 是的,这正是我所拥有的。不多也不少。我知道模拟器,文档很清楚它不能与 StoreKit 一起使用。我正在开发一个设备,但仍然没有爱。无论我的问题如何,都可以正确回答,谢谢。
  • 我正在使用实际设备,但仍然遇到同样的问题。奇怪的是,有时完成块会被调用,有时不会......
  • 有趣的是,它似乎(对你)使用字符串作为参数。文档明确指出SKStoreProductParameterITunesItemIdentifier 的值必须是NSNumber 的一个实例。对我不起作用,无论我使用字符串还是数字。可能是因为我尝试加载的应用程序之前没有发布过。但我预计至少会调用错误案例:(
  • 如果 StoreKit 没有找到 iTunes ID,它永远不会返回错误,例如“找不到项目”或类似... :-( 这肯定是 StoreKit 中的一个错误,因为在某些时候应该在有或没有结果的情况下调用该块......启动一个计时器,在任意秒数后启动一个“未找到”警报绝对是蹩脚的,但我没有看到另一种解决方案,对于人们例如,谁在 iTunes Store 中设置了“错误”的国家/地区。就我而言,我的目标是一个仅存在于一个国家的 App Store 中的应用程序,因此如果选择了另一家商店,它就会“挂起”......
【解决方案2】:

可能我来晚了,但只有当您打开的应用不支持您的国家/地区时才会发生这种情况。

它总是有效的。

编码愉快!!!!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多