Как узнать, КОГДА пользователь впервые купил/установил приложение (можно без UDID?)

Я хотел бы узнать, когда пользователь впервые купил мое приложение ... до сих пор я не нашел чистого способа, и UDID казался единственным вариантом.

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

я что-то пропустил? У кого-нибудь есть идея?


Ситуация такова, что у меня подписка и ПЕРВЫЙ выпуск (с момента покупки приложение должно быть бесплатным). Если я переустановлю позже.. Я всегда должен получить исходную проблему)

пример: я покупаю приложение 10.2010 я устанавливаю и запускаю его и получаю подписку от 10.2010 бесплатно (без покупки в приложении) Теперь я удаляю приложение я устанавливаю его 1.2013 и получаю подписку только от 10.2010 бесплатно! НЕ новый


person Daij-Djan    schedule 03.05.2013    source источник
comment
Храните флаг в связке ключей.   -  person    schedule 03.05.2013
comment
брелок тоже хрупкий, нет? ... он сохраняется при удалении приложений? а что если просто восстановить телефон ^^   -  person Daij-Djan    schedule 03.05.2013
comment
Это энергонезависимая и резервная копия.   -  person    schedule 03.05.2013
comment
круто, я не знал, что это не плохо. Я думаю, я все еще мог бы избавиться от него, я не восстанавливаю резервную копию, хотя?   -  person Daij-Djan    schedule 03.05.2013
comment
Да все верно. Но вы все равно не можете быть на 100% безопасным. Что, если пользователь сделает джейлбрейк телефона и удалит якобы постоянные данные? и т.п.   -  person    schedule 03.05.2013
comment
Но это чертовски лучше, чем то, что я делаю сейчас! Спасибо. (кстати: зачем упаковывать ответы в комментарии?)   -  person Daij-Djan    schedule 03.05.2013
comment
Вы не можете знать, когда пользователь впервые купил ваше приложение, только когда он впервые запустил его.   -  person Jerome Diaz    schedule 03.05.2013
comment
@JeromeDiaz Даже это неправда. Вы можете вызвать stat() в двоичном файле вашего приложения. Среди множества другой информации, он даст вам время записи на диск (т.е. когда он был установлен).   -  person    schedule 03.05.2013
comment
@Daij-Djan Добавил ответ.   -  person    schedule 03.05.2013


Ответы (2)


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

Чтобы узнать время первой установки вашего приложения, проверьте, когда бинарный файл приложения был впервые записан на диск:

if (flag_in_keychain_not_present()) {
    // installed for the first time
    set_flag_in_keychain();

    struct stat st;
    stat([NSBundle mainBundle].executablePath.UTF8String, &st);
    time_t installed = st.st_mtime;
}
person Community    schedule 03.05.2013
comment
Нашли ли вы какую-либо документацию, в которой говорится, что содержимое цепочки для ключей сохраняется при переустановке приложения. ? Кажется, это так, но я не могу найти документацию, в которой говорится, что это ожидаемое поведение. - person Andreas Paulsson; 20.09.2013
comment
@AndreasPaulsson Достаточно честно, я буду искать соответствующую документацию. Честно говоря, я уже не знаю, откуда я это знаю, но брелок постоянен. - person ; 20.09.2013
comment
Осторожно! Ответ выше показывает, когда был написан двоичный файл... а не время, когда пользователь установил его на устройство. Если вы устанавливаете и отлаживаете приложение из XCode, это одно и то же, но если вы устанавливаете приложение через TestFlight или App Store, это не так! - person litso; 04.04.2014

Я еще не пользовался Store Kit, но скажите, если я ошибаюсь,

1) в тот или иной момент требуется сервер

2) когда мы используем его для «покупки» (не подписки или расходных материалов) чего-либо, мы можем получить эту покупку на всех устройствах, используя одну и ту же учетную запись iTunes.

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

person Jerome Diaz    schedule 03.05.2013