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

IOS 7 Локальная (на устройстве) проверка чеков и проверка покупок в приложениях

Я выполнил проверку подлинности на местном уровне на устройстве, используя OpenSSL и компилятор asn1c, с помощью руководства по программированию проверки подлинности Apple. Мое приложение поддерживает только iOS 7 и выше.

Как рекомендовано Apple, я звоню, [[NSBundle mainBundle] appStoreReceiptURL], чтобы получить квитанцию ​​магазина приложения. Я также делаю это, когда приложение запускается перед отображением любого пользовательского интерфейса. Этот первый вызов запуска необходим, поскольку Apple рекомендует обновлять квитанцию, если ее там не было при первой попытке. В результате этого вызова (SKReceiptRefreshRequest) приложение запрашивает у пользователя ввод информации о своей записи в iTunes.

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

Любые указатели или предложения будут очень полезными.

4b9b3361

Ответ 1

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

Не пытайтесь обновлять квитанцию, когда приложение запускается и не блокирует пользовательский интерфейс. То, что я делал, не показывало никакого пользовательского интерфейса при запуске до тех пор, пока квитанция не была найдена, поэтому, когда будет предложено ввести пароль iTunes при запуске, нажав "Отмена", будет отображаться ограниченная версия приложения, ввод правильного пароля будет пытаться загрузить новую квитанцию ​​и действовать в зависимости от того, был ли найден.

Итак, при запуске, если вы найдете квитанцию, которая прекрасна, если не попробовать и не обновить ее.

DO, однако, обновите его, когда пользователь нажимает кнопку "Восстановить покупки".

Надеюсь, это поможет.

Ответ 2

Я удалил свой предыдущий ответ, я неправильно понял вопрос.

Я считаю, что вы все делаете правильно, и Apple, если честно, смущает свои собственные рекомендации. В конце концов, в Руководстве по программированию проверки чеков они четко конкретизируют: "Если проверка не выполняется в iOS, используйте класс SKReceiptRefreshRequest для обновления квитанции", и нет способа повлиять на какой сервер этот вызов сделан (Ссылка SKReceiptRefreshRequest)

В соответствии с http://asciiwwdc.com/2013/sessions/308, какой сервер вызывается, зависит от того, как приложение подписано, и оно должно быть подписано для производства при представлении, очевидно.

Ответ 3

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

#define ITMS_PROD_VERIFY_RECEIPT_URL        @"https://buy.itunes.apple.com/verifyReceipt"
#define ITMS_SANDBOX_VERIFY_RECEIPT_URL     @"https://sandbox.itunes.apple.com/verifyReceipt";

ITMS_PROD_VERIFY_RECEIPT_URL - это производственный сервер. ITMS_SANDBOX_VERIFY_RECEIPT_URL - это песочница.

  • Удостоверьтесь, что вы создали правильный сертификат подготовки от портала обеспечения Apple. Знайте разницу между Ad-Hoc и распределением.
  • Когда вы используете тестовую учетную запись Test iTunes, созданную вами из iTunes Connect для покупки, вам придется протестировать ее в сервере песочницы. В Release Идентификация подписи кода вы должны выбрать Ad-Hoc, а не предоставление ресурсов.
  • Но если вы хотите освободить приложение, вам нужно выбрать распределение ресурсов, а также производственный сервер (ITMS_PROD_VERIFY_RECEIPT_URL). Вы не можете использовать учетную запись тестового пользователя на этом сервере. Вам нужно будет использовать реальную учетную запись пользователя iTune, чтобы купить ее (после того, как Apple одобрит ее), чтобы совершить реальную покупку.

Узнать, как реализовать IAP локально и проверить получение в местном масштабе, узнать из: - 1. http://www.raywenderlich.com/21081/introduction-to-in-app-purchases-in-ios-6-tutorial

2. http://www.raywenderlich.com/23266/in-app-purchases-in-ios-6-tutorial-consumables-and-receipt-validation

Вы можете загрузить завершенный образец проекта здесь: - 3. http://cdn1.raywenderlich.com/downloads/InAppRagePart2Finished.zip

ПРИМЕЧАНИЕ. Возможно, существует другой способ проверки квитанции, которую я не знаю.

Я нашел что-то, что могло бы помочь: 1. https://developer.apple.com/library/ios/documentation/StoreKit/Reference/SKReceiptRefreshRequest_ClassRef/SKReceiptRefreshRequest_ClassRef.pdf

- (id)initWithReceiptProperties:(NSDictionary *)properties

В нем говорится: "В рабочей среде установите этот параметр равным нулю". свойства В тестовой среде свойства, которые должна иметь новая квитанция. Для ключей см. "Получение Свойства "(стр. 4). В рабочей среде установите этот параметр равным нулю.

Ответ 4

Диалог для ввода пользователя psw отображается, если квитанция недействительна или не существует.

So RATHER, тогда попросите psw в начале, если квитанция не существует (для пользователя запутывается bcs, он просто запускает приложение и не требует никаких причин) PROVIDE Восстановите btn, который вы должны предоставить ANYWAY и w8, пока не получите квитанцию, которую вы можете разумно изменить.

Итак, поставьте свой код обновления в оператор if:

if([[NSFileManager defaultManager] fileExistsAtPath:[[[NSBundle mainBundle] appStoreReceiptURL] path]] == YES) {

        self.receiptRefreshRequest = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil];
        self.receiptRefreshRequest.delegate = self;
        [self.receiptRefreshRequest start];
}

Ответ 5

Я бы хотел поделиться своим опытом. Я работаю над песочницей и приложением, отсутствующим после удаления приложения. (И затем re-Command-R-ing) Я не знаю, происходит ли это в процессе производства, но звучит так, как будто это так. Просить обновить при первой загрузке приложения и запросить пароль для пользователя поражает. Это проблема, конечно.

Кажется, что [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] также тихо обновляет квитанцию ​​приложения без появления диалогового окна. Смысл, после того, как транзакция была восстановлена, запрос appReceiptURL + Data возвращает значение, отличное от нуля. Это только из-за моего небольшого количества тестов. Пожалуйста, сделайте собственное тестирование.