Другой метод должен изменить сокет, таким образом, это никогда не генерирует SIGPIPE на записи (). Это более удобно в библиотеках, где Вы не могли бы хотеть глобальный обработчик сигналов для SIGPIPE.
На самом основанном на BSD (MacOS, FreeBSD...) системы, (принятие Вас используют C/C++), можно сделать это с:
int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));
С этим в действительности, вместо сгенерированного сигнала SIGPIPE, EPIPE будет возвращен.
Есть ли способ узнать, запускалось ли ваше приложение раньше? (например, настройки, которые вы записываете при выходе, созданные файлы данных, отметку даты первого запуска?)
если да, вы можете добавить код в свое обновление, например:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (nil == [defaults objectForKey:@"app_v2_has_been_run"]) {
if (nil == [defaults objectForKey:@"some_key_v1_makes"] {
// they never had v1 of your app
} else {
// they had v1 of your app, so unlock some stuff for them
}
[defaults setObject:[NSDate date] forKey:@"app_v2_has_been_run"]; // or whatever
}
Одним из возможных решений может быть размещение кода в новом обновлении вашего платного приложения, который переключал бы любой переключатель, который вы использовали бы для идентификации платных клиентов (будь то список свойств или другая форма) . Если вы даете существующим платным клиентам достаточно времени для обновления, они должны быть помечены как заплатившие. Затем сделайте свою платную версию бесплатной / платной версией обновления и удалите существующую «Lite» версию из магазина. Новые клиенты должны будут использовать покупку в приложении, чтобы разблокировать полную версию, но существующие клиенты будут признаны как уже заплатившие.
Проблема в том, как заставить всех ваших существующих клиентов перейти на промежуточную версию который вовремя переключает переключатель «платный», чтобы перевести приложение на бесплатную / платную модель обновления.