Покупка в приложении успешна (.purchased), функция вызывается, но переменная не сохраняет свое новое значение - PullRequest
0 голосов
/ 14 сентября 2018

У меня проблемы с настройкой покупок в приложении на Swift 4 в Xcode.

Покупка прошла успешно, я знаю это, потому что в консоль выводится следующее:

«Добавление продукта в очередь платежей

приобретено com.taptrudel.ZenHangman.Zap

ProductID: com.taptrudel.ZenHangman.Zap

Дано пользователю 10 zaps, новый счет zap:13

numberOfZaps = 3 "

extension IAPService: SKPaymentTransactionObserver {
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction in transactions {
        print(transaction.transactionState.status(), transaction.payment.productIdentifier)
        switch transaction.transactionState {
        case .purchasing, .deferred: break // do nothing
        case .purchased:
            queue.finishTransaction(transaction)
            givePurchasedProduct(productID: transaction.payment.productIdentifier)
        case .restored:
            self.restorePurchase()
            queue.finishTransaction(transaction)

       case .failed:
            queue.finishTransaction(transaction)

        }
    }
}
}

Расширение, указанное выше, вызывает givePurchasedProduct (productId: String), когда состояние покупки становится .purchased

Эта функция находится чуть ниже,он просто передает productId в функцию в моей игровой сцене, которая дает пользователю только что купленный расходный материал.

func givePurchasedProduct(productID: String) {

        guard let gameScene = GameScene(fileNamed: "GameScene") else { return }
        gameScene.givePurchasedProduct(productId: productID)
    }

Теперь, если вы посмотрите ниже, мы находимся в моей GameScene.

func givePurchasedProduct(productId: String) {
        print("ProductID : \(productId)")
        if productId.range(of: "Zap") != nil {
            numberOfZaps += 10
            print("Gave user 10 zaps, new zap count: \(numberOfZaps)")
            // TODO: CALL SAVE DATA HERE
        }
    }

Если вы вернетесь к сообщению с консоли, которое я вставил вверху этого сообщения, вы увидите, что

  1. Состояние покупки становится .purchased

  2. метод givePurchasedProduct () называется

  3. Мы успешно добавили (10) zaps (пользователь начинает с 3) в общей сложности (13) кПеременная numberOfZaps.

  4. Сразу после этого я касаюсь фона в любом месте, как я сделал, так что это напечатало бы количество zaps, чтобы убедиться, что все работает.Как вы можете видеть ... без каких-либо действий между добавлением 10 zaps и печатью количества zaps, я почему-то, кажется, потерял их ... numberOfZaps немедленно возвращается к 3.

  5. Я искал весь свой проект каждый раз, когда устанавливал «numberOfZaps», чтобы попытаться выявить проблему, хотя она была установлена ​​только один раз в верхней части моей игровой сцены с другими переменными.

  6. Я безнадежен, поскольку я боролся с этой проблемой в течение дней .Единственное, о чем я могу думать, это то, что, учитывая, что это тестовые покупки в «песочнице», переменная каким-то образом возвращается к своему первоначальному значению, учитывая, что на самом деле не было сделано реального платежа

СПАСИБОМИЛЛИОН ЗА ВРЕМЯ, КОТОРОЕ ВЫ УДИВИТЕЛЬНЫ

пс.Я просто заметил, что если бы я использовал (2) "zaps", например.Оставив меня с (1) zap от оригинала (3), который дается каждому пользователю.

Инициализация показана ниже.

class GameScene: SKScene {

    var level = 1

    var gameStarted = false

    var numberOfZaps = 3

Хотя, когда я покупаю (10) больше zaps.

Ожидается, что пользователь теперь увидит (11) zaps

Хотя моя консоль показывает мне, что у нас снова есть (13) скачок после покупки.Таким образом, кажется, что он добавляет 10 к исходному значению 3 независимо от того, где в данный момент находится счетчик.

Но, как обычно, сразу после того, как я нажимаю «ОК» на подтверждение моих новых zaps, когда я проверяю числоOfZapsмы вернулись в (3).(не 13, не 11 ..)

Я действительно не знаю, что еще я могу здесь сделать.

Единственное время numberOfZaps изменено в 3 разных местах

1) Однажды, когда он инициализируется в верхней части моей игровой сцены

2) Когда пользователь покупает (10) zaps, я добавляю (10) к числуOfZaps

3)Когда пользователь использует zap во время уровня, я вычитаю (1) из numberOfZaps

Когда я вычитаю (1) zap, счетчик работает отлично и поддерживает данные, хотя, когда я добавляю (10) zaps независимо отгде счетчик находится в данный момент, я получаю (13) zaps, чтобы набрать достаточно времени для печати моего утверждения, и, как только я покидаю функцию, мои zaps возвращаются к (3).

По этой причинеЯ также попытался добавить "себя".перед "numberOfZaps", чтобы убедиться, что я ссылаюсь на правильный экземпляр переменной.

Спасибо!

1 Ответ

0 голосов
/ 14 сентября 2018

В функции givePurchasedProduct вы создаете новый экземпляр GameScene, меняете его количество zaps, а затем объект GameScene отбрасывается.Какой бы другой объект GameScene у вас не был, который якобы контролирует реальную игровую сцену, которую показывает ваше приложение, он не изменяется.

...