Приложение продолжает запрашивать Apple ID после открытия просмотра с помощью SKPaymentTransactionObserver
Так что я знаю, что проблема в ViewController с IAP, но не знаю, как это исправить.
я добавить SKPaymentQueue.defaultQueue().addTransactionObserver(self)
в viewDidLoad
и иметь делегатов для класса; SKProductsRequestDelegate, SKPaymentTransactionObserver
,
Я использую методы для совершения транзакций по покупкам, восстановления любых покупок и внесения любых изменений, необходимых для покупок без расходных материалов.
Но независимо от того, что пользователь делает, после загрузки IAPViewController
приложение продолжает предлагать пользователю войти в систему. В основном, когда пользователь выходит из приложения, затем открывает его снова.
Я пытался добавить SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
при отклонении зрения, однако, это не похоже на работу.
У кого-нибудь есть предложения?? Мне пришлось вытащить мое приложение из обзора из-за этой ошибки:(
Вот полный код;
class IAPViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
var productIDs: Array<String!> = []
var productsArray: Array<SKProduct!> = []
var selectedProductIndex: Int!
var transactionInProgress = false
override func viewDidLoad() {
super.viewDidLoad()
productIDs.append("com.COMPANY.NAME.BUY01")
productIDs.append("com.COMPANY.NAME.BUY02")
productIDs.append("com.COMPANY.NAME.BUY03")
productIDs.append("com.COMPANY.NAME.BUY04")
requestProductInfo()
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
}
@IBAction func purchase04(sender: AnyObject) {
selectedProductIndex = 0
transactionAction()
}
@IBAction func restoreAction(sender: AnyObject) {
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}
//StoreKit
func transactionAction() {
let payment = SKPayment(product: self.productsArray[self.selectedProductIndex] as SKProduct)
SKPaymentQueue.defaultQueue().addPayment(payment)
self.transactionInProgress = true
}
//Request Products
func requestProductInfo() {
if SKPaymentQueue.canMakePayments() {
let productIdentifiers = NSSet(array: productIDs)
let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)
productRequest.delegate = self
productRequest.start()
}
else {
print("Cannot perform In App Purchases.")
}
}
func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
if response.products.count != 0 {
for product in response.products {
print("\(product.localizedTitle)")
productsArray.append(product)
}
}
else {
print("There are no products.")
}
if response.invalidProductIdentifiers.count != 0 {
print("\(response.invalidProductIdentifiers.description)")
}
print("Number of products in productsArray \(productsArray.count) - Number of products in productIDs \(productIDs.count)")
}
//Payment Observer
func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case SKPaymentTransactionState.Purchased:
print("Transaction completed successfully.", terminator: "")
self.deliverProduct(transaction)
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
transactionInProgress = false
case SKPaymentTransactionState.Failed:
print("Transaction Failed", terminator: "");
SKPaymentQueue.defaultQueue().finishTransaction(transaction)
transactionInProgress = false
default:
print(transaction.transactionState.rawValue, terminator: "")
}
}
}
func deliverProduct(transaction:SKPaymentTransaction) {
if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY01"
{
print("Consumable Product 1 Purchased")
}
else if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY02"
{
print("Consumable Product 2 Purchased")
}
else if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY03"
{
print("Product 3 purchased")
}
else if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY04"
{
print("Product 4 purchased")
}
}
//Restore Purchases
func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {
print("Transactions Restored")
let purchasedItemIDS = []
for transaction:SKPaymentTransaction in queue.transactions {
if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY04"
{
print("Consumable Product Purchased")
}
}
let alertController = UIAlertController(title: "Restored Purchases", message: "Your purchases have been restored. ", preferredStyle: .Alert)
let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in
// ...
}
alertController.addAction(OKAction)
self.presentViewController(alertController, animated: true) {
// ...
}
}
@IBAction func exit(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}
}
1 ответ
Похоже, вы еще не звонили finishTransaction
согласно документации здесь:
Транзакции остаются в очереди платежей до тех пор, пока они не будут удалены. StoreKit будет вызывать paymentQueue: updatedTransactions вашего наблюдателя: каждый раз, когда ваше приложение запускается или возобновляется из фона, пока они не будут удалены. В связи с этим ваших клиентов могут неоднократно просить подтвердить подлинность их покупок или лишить их возможности покупать ваши продукты.
Вызовите finishTransaction: для вашей транзакции, чтобы удалить ее из очереди. Завершенные транзакции не подлежат восстановлению. Поэтому обязательно предоставьте свой контент, загрузите весь размещенный в Apple контент продукта или завершите процесс покупки до завершения транзакции. См. Завершение транзакции для получения дополнительной информации.
Знаете ли вы, что один из двух звонков finishTransaction
на самом деле работает?