Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如果我的应用程序将记住我在应用程序内购买的内容,我该怎么做_Ios_Swift_In App Purchase - Fatal编程技术网

Ios 如果我的应用程序将记住我在应用程序内购买的内容,我该怎么做

Ios 如果我的应用程序将记住我在应用程序内购买的内容,我该怎么做,ios,swift,in-app-purchase,Ios,Swift,In App Purchase,我制作了一个应用程序,并在应用程序内购买了高级版本。因为我无法在模拟器中测试应用内购买 这是我的代码: class settingsViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver, ADBannerViewDelegate { @IBOutlet var adBennerView: ADBannerView! @IBOutlet var outletRemoveA

我制作了一个应用程序,并在应用程序内购买了高级版本。因为我无法在模拟器中测试应用内购买

这是我的代码:

class settingsViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver, ADBannerViewDelegate {

@IBOutlet var adBennerView: ADBannerView!
@IBOutlet var outletRemoveAds: UIButton!
override func viewDidLoad() {
    super.viewDidLoad()
    if(SKPaymentQueue.canMakePayments()) {
        println("IAP is enabled, loading")
        var productID:NSSet = NSSet(objects: "xxx")
        var request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as Set<NSObject>)
        request.delegate = self
        request.start()
    } else {
        println("please enable IAPS")
    }
    // Do any additional setup after loading the view.
}

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

@IBAction func removeAds(sender: AnyObject) {
    for product in list {
        var prodID = product.productIdentifier
        if(prodID == "xxx") {
            p = product
            buyProduct()
            break;
        }
    }

}
@IBAction func restorePurchases(sender: AnyObject) {
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}

var list = [SKProduct]()
var p = SKProduct()

func buyProduct() {
    println("buy " + p.productIdentifier)
    var pay = SKPayment(product: p)
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment)
}
func productsRequest(request: SKProductsRequest!, didReceiveResponse response: SKProductsResponse!) {
    println("product request")

    var myProduct = response.products
    for product in myProduct {
        println("product added")
        println(product.productIdentifier)
        println(product.localizedTitle)
        println(product.localizedDescription)
        println(product.price)

        list.append(product as! SKProduct)
    }
    outletRemoveAds.enabled = true
}
func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) {
    println("add paymnet")

    for transaction:AnyObject in transactions {
        var trans = transaction as! SKPaymentTransaction
        println(trans.error)

        switch trans.transactionState {

        case .Purchased:
            println("buy, ok unlock iap here")
            println(p.productIdentifier)

            let prodID = p.productIdentifier as String
            switch prodID {
            case "xxx":
                println("remove ads")
                removeAds()
                isPremium = true
            default:
                println("IAP not setup")
            }

            queue.finishTransaction(trans)
            break;
        case .Failed:
            println("buy error")
            queue.finishTransaction(trans)
            break;
        default:
            println("default")
            break;

        }
    }
}

func finishTransaction(trans:SKPaymentTransaction)
{
    println("finish trans")
    SKPaymentQueue.defaultQueue().finishTransaction(trans)
}

func paymentQueue(queue: SKPaymentQueue!, removedTransactions transactions: [AnyObject]!)
{
    println("remove trans");
}

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue!) {
    println("transactions restored")

    var purchasedItemIDS = []
    for transaction in queue.transactions {
        var t: SKPaymentTransaction = transaction as! SKPaymentTransaction

        let prodID = t.payment.productIdentifier as String

        switch prodID {
        case "xxx":
            println("remove ads")
            removeAds()
            isPremium = true

        default:
            println("IAP not setup")
        }

    }
}

func removeAds() {
    adBennerView!.removeFromSuperview()
}
类设置视图控制器:UIViewController、SKProductsRequestDelegate、SKPaymentTransactionObserver、AdBannerViewDeleteGate{
@阿德班纳维:阿德班纳维!
@IBOutlet var outletRemoveAds:UIButton!
重写func viewDidLoad(){
super.viewDidLoad()
if(SKPaymentQueue.canMakePayments()){
println(“IAP已启用,正在加载”)
var productID:NSSet=NSSet(对象:“xxx”)
var请求:SKProductsRequest=SKProductsRequest(产品标识符:设置的产品ID)
request.delegate=self
request.start()
}否则{
println(“请启用IAPS”)
}
//加载视图后执行任何其他设置。
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
//处置所有可以重新创建的资源。
}
@iAction func removeAds(发送方:AnyObject){
对于列表中的产品{
var prodID=product.productIdentifier
如果(prodID==“xxx”){
p=产品
购买产品()
打破
}
}
}
@iAction func restorePurchases(发件人:AnyObject){
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}
变量列表=[SKProduct]()
var p=SKProduct()
func buydroduct(){
println(“购买”+p.productIdentifier)
var pay=SKPayment(产品:p)
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().addPayment(按SKPayment付款)
}
func productsRequest(请求:SKProductsRequest!,DID接收方响应:SKProductsResponse!){
println(“产品请求”)
var myProduct=response.products
对于myProduct中的产品{
println(“添加的产品”)
println(product.productIdentifier)
println(产品本地化标题)
println(产品本地化描述)
println(产品价格)
list.append(产品名称为!SKProduct)
}
outletRemoveAds.enabled=true
}
func paymentQueue(队列:SKPaymentQueue!,更新的交易:[AnyObject]!){
println(“添加付款网”)
对于事务:事务中的任何对象{
var trans=交易记录为!SKPaymentTransaction
println(传输错误)
开关trans.transactionState{
案例。购买:
println(“购买,确定,在此处解锁iap”)
println(p.productIdentifier)
将prodID=p.productIdentifier设为字符串
开关prodID{
案例“xxx”:
println(“删除广告”)
removeAds()
isPremium=true
违约:
println(“IAP未设置”)
}
queue.finishTransaction(trans)
打破
案例。失败:
println(“购买错误”)
queue.finishTransaction(trans)
打破
违约:
println(“默认”)
打破
}
}
}
func finishTransaction(trans:SKPaymentTransaction)
{
println(“完成转换”)
SKPaymentQueue.defaultQueue().finishTransaction(trans)
}
func paymentQueue(队列:SKPaymentQueue!,removedTransactions交易:[AnyObject]!)
{
println(“删除trans”);
}
func paymentQueueRestoreCompletedTransactionsFinished(队列:SKPaymentQueue!){
println(“恢复的事务”)
var purchasedItemId=[]
对于queue.transactions中的事务{
var t:SKPaymentTransaction=交易记录为!SKPaymentTransaction
将prodID=t.payment.productIdentifier设为字符串
开关prodID{
案例“xxx”:
println(“删除广告”)
removeAds()
isPremium=true
违约:
println(“IAP未设置”)
}
}
}
func removeAds(){
AdBenerView!.removeFromSuperview()
}

如果用户购买了高级版本-
isPremium
变为
true
,那么我怎么知道用户每次登录
isPremium
时仍然是true呢?

这种情况的发生是因为您只将
isPremium
存储在RAM中,而不是存储在其他任何地方。为此,请尝试使用
NSUserDefaults
如何操作(实际上,建议不要对此类信息使用
NSUserDefaults
,因为这很容易破解,但您必须了解存储应用程序状态信息的基础知识).

之所以会出现这种情况,是因为您只将
isPremium
存储在RAM中,而不存储在其他任何地方。为此,请尝试使用
NSUserDefaults
,看看如何操作(实际上,建议不要对此类信息使用
NSUserDefaults
,因为这很容易破解,但您必须了解存储应用程序状态信息的基础知识)。

在真实设备上进行测试。无论如何,您都需要这样做。决不要只使用模拟器进行测试。保存值“1”对于NSUserdefault,一旦事务成功。在应用程序午餐时,请检查该值是否为1。如果为1,则应用程序已解锁。@SamB但如何测试它?它也不能在真实设备上工作(在测试中)在真实设备上测试。无论如何,您都需要这样做。永远不要仅使用模拟器进行测试。保存值“1”对于NSUserdefault,一旦事务成功。在应用程序午餐时检查该值是否为1。如果为1,则应用程序已解锁。@SamB但如何测试它?它在实际设备上也不工作(在测试中)有什么方法可以测试我的应用内购买吗?我想会更好。测试是什么意思?测试是否购买?测试我是否购买,当我通过Xcode在真实设备上运行它时,每次检查它是否由应用内机制购买是一种不好的做法。你需要在应用中自己管理此信息。尝试存储在它里面,正如我已经建议的,wh