2013-11-25 4 views
1

В разговоре WWDC 2013 о приёме квитанций о приеме приложений рекомендуется, чтобы в приложениях для iOS, код подтверждения получения должен быть вызван как можно скорее. Еще до application:didFinishLaunchingWithOptions: - то есть в функции main(). Я полагаю, что так это будет работать следующим образом:Можно ли вызвать SKReceiptRefreshRequest из main()?

int main(int argc, char *argv[]) { 

    @autoreleasepool { 
     validateReceiptMethod(); // <---- HERE 
     int retVal = UIApplicationMain(argc, argv, nil, nil); 
     return retVal; 
    } 
} 

Идея заключается в том, что метод UIApplicationMain() является то, что запускает приложение и называет application:didFinishLaunchingWithOptions:. Если вы положите validateReceiptMethod() после UIApplciationMain(), он никогда не запустится.

В любом случае, это отлично работает. Но что, если нет квитанции? Затем вам нужно позвонить SKReceiptRefreshRequest, чтобы получить новый магазин приложений, и это нормально. Но если вы запустите этот код до UIApplciationMain(), он также будет запущен до отображения любого вашего пользовательского интерфейса. Итак, что будет с точки зрения отображения пользователя диалогового окна входа в ID? Можно ли даже позвонить по телефону SKReceiptRefreshRequest из метода main()?

ответ

2

Итак, что произойдет с точки зрения показа пользовательского диалогового окна входа в ID?

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

Можно ли даже позвонить по телефону SKReceiptRefreshRequest из метода main()?

Это может быть возможно, если вы настроили свой собственный цикл событий, а затем остановите его, когда запрос на получение завершен, но вы не должны этого делать. Не задерживайте запуск приложения в ожидании сетевого запроса; он никогда не завершится. Если квитанция недействительна, я бы порекомендовал ввести UIApplicationMain() и запросить другую квитанцию ​​при ее завершении.

Edit: Поскольку вы не можете ничего не иметь действительный чек перед входом UIApplicationMain() делать, я не понимаю, почему компания Apple рекомендует проверять на данный момент. Это имеет смысл в OS X, поскольку приложение должно прекратить работу, но не на iOS, где приложение должно продолжать работать, и допустимо игнорировать недопустимые квитанции. Вы можете проверить раннее, сохранить состояние в глобальной переменной, а затем ответить позже; но почему бы не проверить только тогда, когда вы готовы ответить.

+0

Это хорошая идея. 'validateReceiptMethod()' может возвращать INT на основе того, что происходит (например, 0, если квитанция недействительна, 1, если она действительна, -1, если получение не найдено). Есть ли простой способ передать эту возвращаемую переменную из main() в 'application: doneFinishLaunchingWithOptions:', так что когда этот метод будет вызван, он будет знать (без необходимости повторной проверки квитанции), что нет квитанции и, следовательно, он должен называть «SKReceiptRefreshRequest» и получать новый? – Jason

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