RevenueCat - Почему я получаю: Ошибка домена = SKErrorDomain Code = 2 "Не удается подключиться к iTunes Store" - PullRequest
0 голосов
/ 02 марта 2019

У меня есть две автоматически обновляемые подписки, ежемесячная и годовая (iOS).Я могу сделать покупку, когда использую нового свежего пользователя в песочнице.Хотя я должен ввести свой пароль три раза.Вот поток:

  1. Нажмите на подписку
  2. Введите пароль
  3. Предложено ввести пароль еще раз
  4. получить "не удается подключиться к iTunes Store"ошибка
  5. попробуйте еще раз и введите пароль
  6. покупка успешно завершена.

Идем дальше, поэтому, как только это удается, я теперь подписан, и мой пользовательский интерфейс обновляется черезслушатель в appDelegate, который публикует уведомление, на которое я подписан.Но когда я пытаюсь сменить подписку с ежемесячной на ежегодную или наоборот, всегда выдается ошибка «Не удается подключиться к iTunes Store».Нет обновлений пользовательского интерфейса.Вот процесс:

  1. Нажмите на другую подписку
  2. Предложено ввести пароль iTunes
  3. Получите диалоговое окно «Подтвердить покупку», в котором говорится, что я изменяю свою подписку
  4. Нажмите «Продолжить»
  5. Получите оповещение об успехе «Все готово».
  6. Отключите оповещение
  7. Получите сообщение об ошибке «Не удается подключиться к iTunes Store»
  8. Мой слушатель не вызывался, пользовательский интерфейс не обновлялся и т. Д.

Но затем, если я отклоню ошибку и снова нажму на подписку, я получу предупреждение, в котором говорится:Я уже подписался на этот план, хотя ошибка была выдана, и мой слушатель не принял изменения.

Я использую Firebase.Я следовал инструкциям по быстрому старту и специфическим для Firebase документам.Все мои журналы отладки, кажется, в порядке, нет не 200 статусов, нет недействительных идентификаторов продукта.Вот некоторые фрагменты кода:

AppDelegate:

Purchases.debugLogsEnabled = true
Purchases.configure(withAPIKey: Constants.revenueCatKey)
Purchases.shared.delegate = self

FirebaseApp.configure()

authHandle = Auth.auth().addStateDidChangeListener() { (auth, user) in

        if let uid = user?.uid {

            Purchases.shared.identify(uid, { (info, error) in
                if let e = error {
                    print("sign in error: \(e.localizedDescription)")
                } else {
                    print("User \(uid) signed in")
                }
            })
          }
            ...
        }
    }

extension AppDelegate: PurchasesDelegate {

    func purchases(_ purchases: Purchases, didReceiveUpdated purchaserInfo: PurchaserInfo) {

        if self.currentUser != nil {

            if purchaserInfo.activeSubscriptions.contains(Constants.audiomeshSubscriptions.monthly) {
                guard let myRef = DataService.instance.REF_PRIVATE else { return }
                myRef.updateData(["plan" : "paidMonthly"]) { err in
                    if let err = err {
                        print("error updating user-private with new subscription: \(err)")
                    } else {

                        NotificationCenter.default.post(name: Notification.Name(rawValue: "purchaserInfoUpdated"), object: nil)
                    }
                }


            }
            else if purchaserInfo.activeSubscriptions.contains(Constants.audiomeshSubscriptions.yearly) {
                //do the same for yearly subscription

            }
            else {
                 //handle non-paying users here
            }
        } 
    }
}

UpgradeController (пользовательский интерфейс покупки):

@objc func purchaseButtonSelected(sender: AudiomeshButton) {
    let buttonTag = sender.tag
    guard let option = options?[buttonTag] else { return }

    let product:SKProduct = option.product

    Purchases.shared.makePurchase(product, { (transaction, purchaserInfo, error) in

        if let error = error {
            print("error making purchase: \(error)")

        } else {
                print("Purchase Successful")
        }
    })
}

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Таким образом, на этот вопрос относительно легко ответить, но ответ довольно неудовлетворительный.

В Песочнице не работают обновления и перекрестные классы.

В этом случае почти всегда возвращается эта ошибка.Хорошей новостью является то, что он работает на производстве, а RevenueCat правильно отслеживает все дела.

0 голосов
/ 02 марта 2019

Итак, это общее сообщение NSError, которое выдается для всех ошибок SKError.Код ошибки 2 - «платеж отменен».Однако это также ошибка, которая выдается, когда вы уже подписаны на элемент.

Вы уверены, что срок годовой подписки истекает до повторной подписки?С годовыми подписками они будут обновляться каждый час, 6 раз, до истечения срока действия.

Чтобы увидеть конкретный SKError, вы сделаете что-то вроде:

if let error = error as? SKError  {
                print("SKError - ")
                switch error.code {  // https://developer.apple.com/reference/storekit/skerror.code
                case .unknown:
                    print("unknown error")
                case .paymentCancelled:
                    print("cancelled error")
                case .clientInvalid:
                    print("client invalid")
                case .paymentInvalid:
                    print("payment invalid")
                case .paymentNotAllowed:
                    print("payment not allowed")
                case .cloudServiceNetworkConnectionFailed:
                    print("cloud service network connection failed")
                case .cloudServicePermissionDenied:
                    print("cloud service permission denied")
                case .storeProductNotAvailable:
                    print("store product not available")
                case .cloudServiceRevoked:
                    print("cloud service revoked")
                }
            }

Как только вы узнаете, что это SKErrorвернулся Я могу обновить свой ответ, если необходимо, с дополнительной информацией о том, что может происходить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...