2014-01-03 2 views
13

Я реализую покупки в приложении для своего приложения (которое будет выпущено) и обеспечит поддержку 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:

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

Как в связи с не -renewing подписки, от 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). Кажется, мы вернулись к «нормальному» сейчас с не обновляющимися подписками. То есть, когда я делаю восстановление, я снова вижу возобновление подписки в квитанции.

+0

ли вы когда-нибудь слышали что-нибудь обратно на это? Я тоже смотрю на это, и, как вы можете видеть все невозобновляемые квитанции в разделе покупки в приложении квитанции. Однако я бы также упомянул о яблочных документах здесь https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html#//apple_ref/doc/uid/TP40010573-CH106-SW1, где если вы посмотрите на получение покупки в приложении, вы увидите, что «значение этого ключа является массивом, содержащим все квитанции о покупке в приложении». – MrNeilM

+0

Нет. Я ничего не слышал. В прошлый раз, когда я отправил отчет об ошибке, я услышал в тот же день, что и релиз iOS7. Итак, возможно, я вернусь к дате выхода iOS8? –

+0

Интересно. Таким образом, я на самом деле написал (хорошо, что нужно убирать) код, чтобы прочитать квитанцию, входящую в In App Purchase, выработать срок действия, с учетом всех продлений и любых упущений в сервисе или перекрытий и т. Д. Кроме того, используя SKReceiptRefreshRequest Я могу взять новую копию квитанции на другое устройство. Таким образом, вполне возможно управлять подпиской на Non-Renewing на всех пользовательских устройствах без каких-либо бэкэнд или синхронизации. Кажется, у Apple есть противоречивая информация? – MrNeilM

ответ

2

Это также озадачило меня. После того, как смотреть на документы много раз, я наконец-то увидел следующее в получении полевых заметок для Receipt Validation Programming Guide:

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

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

В то время как раздел «Упорно Использование Квитанция App» в In-App Purchase Programming Guide еще указывает на то, что расходные материалы, так и не возобновление подписки обрабатываются одинаково.

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

+2

Да, я считаю, что это так. Наконец-то я получил ответ от Apple о внесении изменений в квитанцию. В то время, когда они отправили мне по электронной почте, это изменение еще не было в документах по производству. Похоже, они забыли обновить документ IAP. Плохое яблоко! ;). –

+0

Apple установила документ IAP. В таблице 1-2 «Сравнение типов подписки» в «Руководстве по IAP» (https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Products.html) подписка на подписку, используемая для '' '' '' Появляется в квитанции'. «Once» теперь изменен на 'always'. – Daniel

3

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

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

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

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

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

Для не возобновлять подписку, использовать ICloud или свой собственный сервер, чтобы сохранить постоянную запись. (с) 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]; 
+0

transactionReceipt устарел в iOS 7. – user965972

+0

@ user965972 код был предоставлен Apple через документацию StoreKit. В моем приложении я использую квитанцию ​​пакета, которую можно найти в '[[NSBundle mainBundle] appStoreReceiptURL];' –

+0

Итак? Некоторые из документации Apple устарели. Вы должны посмотреть на API, чтобы узнать, устарели ли они или нет. Квитанция магазина приложения не является квитанцией о транзакции. Квитанция пакета содержит все транзакции. Квитанция транзакции относится к конкретной транзакции, которая устарела. – user965972

 Смежные вопросы

  • Нет связанных вопросов^_^