2016-01-20 77 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

我以爲我做到了,對不起,我現在做了! –