2016-01-20 73 views
0

我的应用程序包含一些应用程序内购买,无论何时打开应用程序,我的手机会一直要求我登录iTunes Store。我如何阻止这种情况发生?Xcode Project包含IAP后,iPhone不停止弹出“登录iTunes Store”

override func viewDidLoad() { 
    super.viewDidLoad() 

    SKPaymentQueue.defaultQueue().addTransactionObserver(self) 

    // Do any additional setup after loading the view, typically from a nib. 
    // Set IAPS 

     if(SKPaymentQueue.canMakePayments()) { 
      print("In-App Purchases Enabled, Loading") 
      let productID:NSSet = NSSet(objects: "my bundle ;)") 
      let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>) 
      request.delegate = self 
      request.start() 
     } else { 
      print("Please enable In-App Purchases.") 
    } 

    showInStore() 

} 

override func viewDidDisappear(animated: Bool) { 

    SKPaymentQueue.defaultQueue().removeTransactionObserver(self) 
} 


    @IBAction func btnRemoveAds(sender: UIButton) { 
    for product in list { 
     let prodID = product.productIdentifier 
     if(prodID == "my bundle") { 
      p = product 
      buyProduct() 

// removeAds() 休息 }如果其他人(PRODID == “我的包”){

  w = product 
      buyProduct() 
      break 
     } 
    } 

} 


    func removeAds() { 

    self.view.willRemoveSubview(self.adView) 
    self.adView.hidden = true 
} 

    @IBAction func RestorePurchases(sender: UIButton) { 
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions() 
} 

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

func buyProduct() { 
    print("Buy " + p.productIdentifier) 
    let pay = SKPayment(product: p) 
    SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment) 
} 

func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) { 
    print("Requesting Product") 
    let myProduct = response.products 

    for product in myProduct { 
     print("Product Added") 
     print(product.productIdentifier) 
     print(product.localizedTitle) 
     print(product.localizedDescription) 
     print(product.price) 

     list.append(product) 

    } 


} 

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) { 
    print("Purchases Restored") 

    _ = [] // Swift 2 made me replace with a _ : orginal is let purchasedItemIDS[] 
    for transaction in queue.transactions { 
     let t: SKPaymentTransaction = transaction 

     let prodID = t.payment.productIdentifier as String 

     switch prodID { 
     case "my bundle ;)": 
      print("Removing Ads") 
      removeAds() 
      systemStatus.text = "Ads have been removed on this device! " 
      systemStatus.textColor = UIColor.greenColor() 


     default: 
      print("In-App Purchases Not Setup") 
     } 

    } 
} 

func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
    print("Add Payment") 

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

     switch trans.transactionState { 

     case .Purchased: 
      print("Unlock In-App Purchases Here.") 
      print(p.productIdentifier) 
      let prodID = p.productIdentifier as String 
      switch prodID { 
      case "my bundle ;)": 
       print("Remove Ads") 
       removeAds() 
       systemStatus.text = "Ads have been removed on this device! " 
       systemStatus.textColor = UIColor.greenColor() 


      default: 
       print("In-App Purchases Not Setup") 
      } 

      queue.finishTransaction(trans) 
      break 
     case .Failed: 
      print("Purchase Error") 
      queue.finishTransaction(trans) 
      break 
     default: 
      print("Nothing") 
      break 

     } 
    } 
} 

func finishTransaction(trans:SKPaymentTransaction) 
{ 
    print("Transactions Completed.") 
    SKPaymentQueue.defaultQueue().finishTransaction(trans) 
    removeAds() 
    systemStatus.text = "Ads have been removed on this device! " 
    systemStatus.textColor = UIColor.greenColor() 


} 

func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) 
{ 
    print("Transactions Removed") 
} 
+0

看看http://stackoverflow.com/questions/4988663/skpaymentqueue-addtransactionobserver-asking-for-app-store-password-on-startup-a – Michael

+0

已经这样做:( –

+0

也许你应该发布你的你知道'finishTransaction'实际上被调用吗?它也可以抛出一个异常。你怎么解决这个问题? – Michael

回答

0

看你的代码你现在正在做的第一个2个错误我提及。

1)您应该在应用程序启动或初始化商店时添加事务观察器。去你的购买/恢复功能,并拿出这条线

SKPaymentQueue.defaultQueue().addTransactionObserver(self) 

并将其移动到viewDidLoad。很多教程都以错误的方式教会你。

2)我看不到你删除事务观察者的代码。 您需要致电

SKPaymentQueue.defaultQueue().removeTransactionObserver(self) 

当您退出您的商店。这很可能会导致你的问题。

3)通常你的代码有点混乱。例如,在委托函数“didFinishTransaction”中,您正在调用删除广告的方法。这不是它的地方。

看一看这个答案,看你怎么可以组织你的代码更好

Restore Purchase : Non-Consumable

原来的答复:

相当与IAP的一个普遍的现象,如果操作不当,这基本上意味着一个旧交易正在徘徊。 在你的IAP代码中有几点需要记住。

1)确保您在应用程序启动时添加一次transactionObserver。每次购买一件商品时,大多数教程都会添加它,这不是苹果公司推荐的。

2)关闭应用程序后,移除交易观察者。 3)确保您在每次购物时都致电完成交易。

没有看到您的代码很难帮助。

+0

可悲的是没有工作=( –

+0

这很糟糕。你应该发布你的代码,它的很难帮助,没有任何代码 – crashoverride777

+0

我以为我做到了,对不起,我现在做了! –