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

Не возобновляемые подписки: удалены из чеков?

Я реализую покупки в приложении для своего приложения (для его выхода) и поддерживаю поддержку iOS6 и iOS7. Мой вопрос связан с различиями между невозобновляемыми механизмами подписки на iOS6 и iOS7, а точнее на то, как осуществляется восстановление. Чтобы разместить как iOS6, так и iOS7, я применил серверное решение для восстановления. Я по желанию разрешаю пользователю создавать имя пользователя/пароль, которые могут быть использованы на другом устройстве (или на том же устройстве, если данные потеряны) для восстановления. У меня большая часть этого в основном работает, но по мере того, как я прогрессировал с моим тестированием, я нашел кое-что любопытное.

Исходная часть моего процесса восстановления для iOS7 использует SKReceiptRefreshRequest для обновления квитанции в приложении. Когда я удалю приложение с устройства iOS7, переустановите (на данный момент нет квитанции, проверено с помощью iExplorer) и выполните восстановление, SKReceiptRefreshRequest восстанавливает 10 покупок (которые я создал во время тестирования для этого конкретного пользователя), Один из них - нерасходуемый, а девять квитанций не обновляются. Это меня смущает. В документах Apple я ожидал увидеть только нерасходные покупки в обновленной квитанции. Из https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateLocally.html:

"Расходные материалы и не обновляемые подписки: входящее приложение квитанция покупателя о потребляемом продукте или невозобновление подписка добавляется в квитанцию ​​при совершении покупки. это хранится в квитанции, пока ваше приложение не завершит эту транзакцию. После этого момента он будет удален из чека в следующий раз квитанция обновляется - например, когда пользователь совершает другую покупку или если ваше приложение явно обновляет квитанцию."

Как относящийся к не возобновляемым подпискам, от https://developer.apple.com/in-app-purchase/In-App-Purchase-Guidelines.pdf:

Используйте iCloud или собственный сервер для отслеживания покупок и разрешите пользователю восстановить приобретенные подписки на все устройства iOS, принадлежащие одному Пользователь

И следующая таблица из (https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Products.html)

enter image description here

У кого-нибудь есть идеи?

Вопрос: Почему SKReceiptRefreshRequest оставляет покупки для невозобновления продуктов в квитанции? Является ли это ошибкой в ​​документах Apple или что-то еще происходит?

2/23/14; Обновление: Недавно я опубликовал отчет об ошибке в Apple. Еще нет слова. Хотя, на самом деле, я не хочу, чтобы эта "ошибка" исчезла!

10/20/15; Обновление: Кажется, что Apple действительно решила эту "ошибку". Теперь, когда я делаю восстановление с помощью SKReceiptRefreshRequest (который, по-видимому, рекомендуется Apple для восстановления, см. https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Restoring.html), я теперь я не получаю невозобновляемые покупки подписки, появляющиеся в квитанции. Я получаю только расходные материалы (у моего приложения есть только не возобновляемые подписки и покупки без расходных материалов). Я собираюсь представить отчет об ошибке Apple сразу после того, как я напишу это как минимум, их документы неоднозначны по ожидаемому поведению.

До сих пор мое тестирование включало мое приложение, работающее на iOS 8.4 и iOS9 (бета-версия 9.1 на самом деле, поскольку у меня нет правильного устройства, на котором запущена производственная версия), и поэтому кажется, что это изменение на стороне сервера с Apple и, строго говоря, изменение iOS/устройства. Также обратите внимание, что все мое тестирование до сих пор находится в разработке моего приложения, а также в песочнице для покупки приложений. Я скоро проведу производственный тест.

12/3/15; Обновление;. При запросе поддержки Apple Tech Support я провел еще несколько тестов. На этот раз на iPad работает iOS9.2 beta 4 (13C75). Кажется, мы вернулись к "нормальному" сейчас с не обновляющимися подписками. То есть, когда я делаю восстановление, я снова вижу возобновление подписки в квитанции.

4b9b3361

Ответ 1

Будьте осторожны, сохраняющиеся не возобновляемые подписки в приложении Receipt не дают вам никаких гарантий, которые могут быть приняты рецензентами App Store. Успех зависит от конкретного рецензента. Я недавно получил это сообщение от Apple:

Мы обнаружили, что ваше приложение включает в себя функцию восстановления ранее приобрели продукты In-App Purchase, введя идентификатор пользователя Apple и пароль. Тем не менее, невозобновление подписки на покупки в приложении не может таким образом восстанавливается.

Было бы уместно пересмотреть ваш двоичный файл, чтобы удалить эту функцию. Если вы хотите, чтобы пользователи могли восстанавливать Non-Renewing Подпишитесь на продукты In-App Purchase, вам нужно будет реализовать свои собственный механизм восстановления.

Итак, последняя попытка отправить приложение была неудачной. В отличие от предыдущих.

Итак, теперь мой план состоит в том, чтобы сохранить квитанцию ​​App на iCloud Key-Value Storage и автоматически восстановить все покупки. Он будет удовлетворять запросы Яблоков:

Чтобы не обновлять подписки, используйте iCloud или собственный сервер, чтобы постоянная запись. (c) Руководство по программированию магазина Kit

здесь приведен код Apple, предназначенный для этих целей:

#if USE_ICLOUD_STORAGE
NSUbiquitousKeyValueStore *storage = [NSUbiquitousKeyValueStore defaultStore];
#else
NSUserDefaults *storage = [NSUserDefaults standardUserDefaults];
#endif

NSData *newReceipt = transaction.transactionReceipt;
NSArray *savedReceipts = [storage arrayForKey:@"receipts"];
if (!receipts) {
    // Storing the first receipt
    [storage setObject:@[newReceipt] forKey:@"receipts"];
} else {
    // Adding another receipt
    NSArray *updatedReceipts = [savedReceipts arrayByAddingObject:newReceipt];
    [storage setObject:updatedReceipts forKey:@"receipts"];
}

[storage synchronize];

Ответ 2

Это также озадачило меня. Много раз просматривая документы, я, наконец, увидел в примечаниях поля квитанции для Руководство по проверке чеков для чеков:

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

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

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

Я угадываю из поведения, которое мы наблюдаем, что документ IAP устарел? Надеюсь, что так.