it-roy-ru.com

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

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

Любые намеки, ребята?

Обновление:

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

  1. Как создать учетную запись детской песочницы в iTunes Connect? ( https://devforums.Apple.com/message/1030357#1030357 )
  2. Тестирование «Попроси купить» в песочнице ( https://devforums.Apple.com/message/1005569#1005569 )
23
Maciek Czarnik

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

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

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

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

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

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

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

6) На моем iPhone я включаю «Ask To Buy» для члена семьи C.

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

enter image description here

когда я нажимаю «Спросить», я получаю следующее предупреждение:

enter image description here

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

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

enter image description here

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

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

enter image description here

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

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

22
Chris Prince

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

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

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

PS. ВНИМАНИЕ: люди жалуются, что этот API не работает должным образом (см. Комментарии)

7
kas-kad

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 и App Store» в «Настройках». Кроме того, если вы нажмете «Отмена» здесь, транзакция не будет завершена неудачей, поскольку наблюдатель в очереди платежей будет продолжать регистрировать состояние SKPaymentTransactionStatePurchased.

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

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

Тестирование прерванной транзакции

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

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

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

5
serge-k

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

Кроме того, вам необходимо создать учетную запись C через iTunes Connect, а не через опцию «Создать учетную запись ребенка» на экране обмена фотографиями в семье. 

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

3
Raimundas Sakalauskas

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

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

Важный фрагмент ответа от сотрудника Apple:

Что касается поддержки Ask-To-Buy, в Песочнице эта функция не поддерживается. «Ask to Buy» - это не реализация API, а процесс поддержки, реализованный iTunesConnect, который требует взаимодействия StoreKit с определенной учетной записью iTunes. Эта поддержка существует только в производственной среде. Чтобы этот процесс работал в среде «песочницы», ITC потребуется внедрить для тестовых учетных записей ссылки на другие учетные записи для предоставления разрешения на покупку.

В оставшейся части статьи освещаются рекомендации и схемы поддержки Ask to Buy, но тестирование должно проводиться в производственной среде, где активны отношения между дочерним и родительским аккаунтами.

0
James