Подтвердить что ты не робот

Как проверить SKPaymentTransactionStateDeferred?

iOS 8 скоро выйдет. У нас есть Xcode beta 6 atm, но до сих пор не удается найти какие-либо документы в , как правильно тестировать Family Sharing (или я что-то пропустил?). Мой вопрос в том, как правильно настроить Sandbox с родительским/дочерним? Я попытался заставить его работать в бета-версии 1 без радости.

Любые подсказки ребята?

Update:

Две связанные истории на форуме разработчиков Apple:

4b9b3361

Ответ 1

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

Я сделал следующее:

1) Создайте родительскую тестовую (песочницу) учетную запись в iTunes Connect и создайте дочернюю тестовую учетную запись. Это действительно две тестовые учетные записи в iTunes Connect. Назовите их P и C для родителей и детей.

2) С обоими учетными записями перейдите в https://appleid.apple.com и измените свой год на их возраст. iTunes Connect не позволяет вам это делать. По какой-то причине процесс с совместным использованием семьи не работает, если у возрастов нет года. Я обнаружил, что вам нужно сделать выбор дважды в списке по году https://appleid.apple.com. Странно. Я поставил свой P как старше (какой-то взрослый возраст), а мой C был моложе.

3) На одном яблочном устройстве (мой iPhone, работающем под iOS8) я настраиваю общий доступ к общим ресурсам в разделе "Настройки" > iCloud для учетной записи P. Я подключился к iTunes на этом устройстве с помощью моего iTunes Apple Id (у которого есть информация о платеже).

4) Затем я приглашаю свой идентификатор яблока C быть частью моей семьи в разделе "Настройки" > "iCloud".

5) Я принимаю приглашение от P (на моем iPad, также под управлением iOS8), который включает в себя вход в iCloud на этом другом устройстве как C.

6) На моем iPhone я включил "Ask Buy" для члена семейства C.

Теперь, я готов попробовать пробную покупку как C в моем изолированном приложении. После того, как я проведу обычный процесс в своем магазине приложений, я получаю следующее предупреждение:

enter image description here

когда я нажимаю "Ask", я получаю следующее предупреждение:

enter image description here

Теперь я попробовал два варианта с отдельными покупками. Я попробовал вариант "ОК", который должен отправить уведомление на учетную запись P. Я еще не получил такое уведомление на моей учетной записи P (все еще подписанный в iCloud как на моем iPad).

Я также попробовал вариант "Утвердить в персоне" на iPad "ребенка". Я использую учетную запись P, и я вхожу в нее, если при следующем предупреждении:

enter image description here

После этого я не получаю ошибок, поэтому казалось бы, что Approve In Person работал, но мне еще предстоит конвертировать эту покупку в состояние SKPaymentTransactionStatePurchased. Все отложенные покупки все еще находятся в очереди платежей приложения, каждая из которых имеет статус SKPaymentTransactionStateDeferred. Когда я перезапускаю приложение, состояние каждой покупки, все еще в очереди, отложено.

Далее я задавался вопросом, была ли какая-то проблема с конкретной тестовой учетной записью iTunes для C, поэтому я сделал вторую дочернюю учетную запись, позвонил этому C2 и попытался установить ее как ребенка под P на моем iPhone. Однако я столкнулся с еще одной проблемой. Я получаю предупреждение (на iPad), когда я пытаюсь принять приглашение стать членом семьи под P для C2:

enter image description here

Для меня это ограничение учетной записи iCloud не должно применяться к тестовым учетным записям. Это явная ошибка, о которой я сообщил Apple.

Итак, в заключение, я еще не уверен на 100%, что моя реализация SKPaymentTransactionStateDeferred работает. Посмотрим, вернется ли мне Apple.

Ответ 2

Из iOS 8.3 для SKPayment доступен новый флаг: simulatesAskToBuyInSandbox.

Итак, если вам нужно проверить состояние SKPaymentTransactionStateDeferred, вы инициализируете новый SKMutablePayment и установите simulatesAskToBuyInSandbox = YES.

https://developer.apple.com/library/prerelease/ios/releasenotes/General/iOS83APIDiffs/frameworks/StoreKit.html

PS. ПРЕДУПРЕЖДЕНИЕ: люди жалуются, что этот API не работает должным образом (см. Комментарии)

Ответ 3

iOS 9.2.1, Xcode 7.2.1, ARC включен

Подтверждено! Свойство simulatesAskToBuyInSandbox не приводит к тому, что наблюдатель очереди платежей регистрирует состояние SKPaymentTransactionStateDeferred. Вместо этого он просто обрабатывает платеж, а наблюдатель регистрирует состояние SKPaymentTransactionStatePurchased.

SKMutablePayment *payment = [SKMutablePayment
   paymentWithProduct:productUserRequested];

payment.simulatesAskToBuyInSandbox = true;
[[SKPaymentQueue defaultQueue] addPayment:payment];

Единственным тестом, который я смог выполнить, был вызов моего метода для отложенного платежа, когда наблюдатель зарегистрировал состояние SKPaymentTransactionStatePurchased вместо моего обычного метода и не вызвал:

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

Это сохраняет транзакцию приложением. завершение и дает возможность проверить пользователя, не завершившего покупку (например, потерю приема на заключительных этапах покупки) и отложенную покупку. Это предполагает, что ваш метод покупки передает отложенный параметр, как описано в разделе Листинг 4-2. Реагирование на статусы транзакций в В руководстве по покупке приложений: Доставка продуктов. Вот как выглядит метод:

Чтобы имитировать подвесные покупки:

[self showTransactionAsInProgress:transaction deferred:NO];

Моделировать отложенные:

[self showTransactionAsInProgress:transaction deferred:YES];

Примечание: после приложения. перезапустите приложение Apple в приложении. механизм покупки запросит ваши учетные данные, если вы не обработали какие-либо другие платежи за учетные данные, не удалили приложение или не вышли из "iTunes и магазинов приложений" в "Настройки". Кроме того, если вы нажмете здесь "Отменить", транзакция не будет терпеть неудачу, потому что наблюдатель очереди платежей будет продолжать регистрировать состояние SKPaymentTransactionStatePurchased.

ОБНОВЛЕНИЕ 3/4/2016:

Я нашел это предложение от Apple, которое может оказаться полезным, это модный способ сделать то, что я предложил:

Проверить прерванную транзакцию

Установите контрольную точку в наблюдателях очереди транзакций paymentQueue: updatedTransactions: метод, чтобы вы могли контролировать его поставляет продукт. Затем сделайте покупку, как обычно, в тесте окружающей среды и использовать точку останова для временного игнорирования транзакции, например, путем немедленного возврата из метода используя команду возврата потока в LLDB.

Завершите и перезапустите приложение. Store Kit вызывает paymentQueue: updatedTransactions: метод снова вскоре после запуска; на этот раз, пусть ваше приложение будет нормально отвечать. Убедитесь, что ваше приложение правильно доставляет продукт и завершает транзакцию.

Надеюсь, это поможет! Приветствия.

Ответ 4

При создании дочерней учетной записи в соответствии с ответом Криса Принса убедитесь, что вы установили ее "возраст" в возрасте от 13 до 18 лет. Если вы установите значение менее 13, вы не сможете проверить его возраст (даже если вы добавите кредитную карту на свою учетную запись P). Если он выше 18 - опция включить Ask для покупки, ушла. Проводили часы, пытаясь выяснить, что я делаю неправильно.

Также вам нужно создать учетную запись C через itunes connect, а не через опцию "Создавать дочернюю учетную запись" на экране совместного доступа к семье.

Желаю, чтобы я мог комментировать, но поскольку у меня нет 50 очков репутации, я должен создать отдельный ответ.

Ответ 5

Как оказалось, среда песочницы не поддерживает родительское дочернее отношение, поэтому сообщения не будут отправляться, когда соответствующие учетные записи будут настроены, как указано в ответе @ChrisPrince.

Статья, которую я выкопала, можно найти здесь: https://forums.developer.apple.com/thread/38561#117143

Откликом важности ответа от сотрудника Apple является

Что касается поддержки Ask-To-Buy, поддержка этой функции в Sandbox отсутствует. "Запросить покупку" - это не реализация API, а процесс поддержки, реализованный iTunesConnect, который требует взаимодействия StoreKit с определенной учетной записью iTunes. Эта поддержка существует только в производственной среде. Чтобы этот процесс работал в среде песочницы, ИТЦ необходимо было бы внедрить для тестовых учетных записей ссылки на другие учетные записи для предоставления одобрения для покупок.

Остальная часть статьи освещает рекомендации и потоки для поддержки Ask для покупки, но тестирование должно проводиться в рабочей среде, в которой активны отношения дочернего/родительского аккаунта.