Pull to refresh

Comments 28

Enterprise program? Я лишь слышал, что там нет проверок эпл, и если это так, то решением будет fork() и совершение слежки в дочернем процессе.
1. Регистрируем обработчики сигналов, внимательно смотрим, как система вас убивает и будет ли она трогать вас вообще. Я полагаю, что она будет убивать только процесс самого приложения, а сына оставит в покое.
2. Если все замечательно и вас даже не убивают, то можно подобрать какуюнибудь точку рандеву, с помощью shmem, pipe или чего бы то ни было еще, что бы проверить, а нужно ли делать форк или сынок уже в работе.

Это комментарий-предположение. Я полагаю, что никаких препятствий для такой реализации нет, но в этом не уверен.
Добравшись до гугла обнаружилось, что iOS блокирует вызов fork(). http://stackoverflow.com/questions/12088155/fork-failed-1-operation-not-permitted
А жаль. Интересно, чего бы еще такого придумать в обход Вашего способа…
Вероятно обходом будет самостоятельная имплементация fork если низкоуровневые апи не режутся MAC(Mandatory Access Control). Как вариант думаю еще можно заюзать posix_spawn(https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/posix_spawn.2.html). оно вроде не лочится никак. решение тоже очень простое:
pid_t pid;
char *argv[] = {
    "/private/var/mobile/Containers/Data/Application/392A2665-9019-33AC-2E3748331/testapp",
    "param1",
    "param2",
    NULL
};

posix_spawn(&pid, argv[0], NULL, NULL, argv, environ);
waitpid(pid, NULL, 0);


ps.: я бы мог еще кое что интересное описать, но как вижу малвар кодеров(даже тех кто пишет концепты) тут не жалуют, поэтому воздержусь.
posix_spawn режется. Имхо режутся все системные вызовы по номерам. Еще варианты?

Да ладно, не жалуют, самые одаренные малвар-кодеры потом и пишут весь фундамент, на котором все работает. Ну, если в плохих мальчиков надоест играть. :3
раньше вроде был способ с постоянным проигрыванием «пустого» звука, но не знаю как оно ведет себя с другими плеерами вроде стандартного приложения Music
Сейчас такой хак эппл при ревью приложения не пропускает.
Равно как и использование для целей геолокаций опции VoiceOverIP.
А вот Region Monitoring — то, что надо.
Пропускает или нет не важно
а) Enterprise Program не имеет стадии ревью
б) Все, что не пропускает ревью, можно зарелизить с помощью Dark Release.
Просто придирка:
б) Как вы зарелизите через Dark Release ключи в Info.plist?
Ключи бы я изначально выставил. А затем предложил бы для товарищей код-ревью бекграунд аудио какое-то, мол, смотрите, вот по делу. А на самом деле с дарк релизом бы эту обманку выключил.
Для того, чтобы так сильно заморачиваться, должны быть веские причины. Мой посыл лишь в том, что это возможно.
Поясните ещё почему
Поставленную задачу надо решить только средствами iOS без изменения серверной части (никаких Push Notifications).

Разве это не решило бы абсолютно все проблемы? Сервер когда хочет, тогда и опрашивает, можно менять эти интервалы. Приложение будет запущено если надо, всё отработает и сдохнет, если система так пожелает.
мде… сколько будут существовать устройства, столько будет существовать шпионский софт.
кто заказчик-то? милиция? бандиты? ревнивый супруг? папаша-параноик?
— ни за что бы не взялся за такую работу — противно.
Представьте, что устройства принадлежат компании, она их выдает сотрудникам для использования в служебных целях в служебное время, и потому имеет полное право знать где они находятся.
С другой стороны, по простому запросу из АНБ в apple/google, ваш собственный телефон будет сообщать где он находится без дополнительного софта. Более того, если вы не изменили настройки по умолчанию, он и так сообщает об этом, нужно только запросить историю ваших перемещений.
Кстати, для папаш-параноиков существует возможность официально узнавать геопозицию своих чад встроенными в iOS средствами, если они привязаны к одному логину iCloud.
Для контролем за детьми просто надо включить у них Find My Friends и дать себе доступ, даже одна учетка не обязательна.
Работает она, надо заметить, хуже, чем Find My Phone: дольше время до отображения позиции и более редкие обновления.
Я тоже сейчас пытаюсь портировать свое приложение KidsTrack с андроида на iOS, и решаю эту же задачу. Что интересно: на эмуляторе или на устройстве, подключенном через USB все работает прекрасно. При запуске на неподключенном ни к чему устройстве выясняется, что несмотря на то, что вызовы «didUpdateLocations» идут каждую секунду, через 10-15 минут работы в фоне что-то изменяется в системе, и код метода didUpdateLocations не может запустить NSURLConnection через dataTaskWithRequest. Ошибок никаких нет, просто перестает уходить трафик на сервер. Как только задача переходит в foreground, все NSURLConnection просыпаются, и все, что там было, отправляется. Не понятно пока, как это побороть. Я, правда, не использую ни Significant-change location, ни Region monitoring, ни Local Botifications
> Я, правда, не использую ни Significant-change location, ни Region monitoring, ни Local Botifications
Вот в этом и проблема :)
Через 10-30 секунд ухода в фон приложение ставится на паузу. И если не отмечены необходимые Background Modes, то и сетевой стек тоже засыпает.
UFO just landed and posted this here
Программа делалась для курьеров, почтальонов и медсестер, которые работают «в поле» и центральный офис в зависимости от текущего местоположения оптимизирует распределение заказов:)
UFO just landed and posted this here
я бы ещё добавил, что когда мы добавляем permission на location update (в background mode), при публикации приложения в Apple Store нужно обязательно не забыть в конце дописать:
“Continued use of GPS running in the background can dramatically decrease battery life.”

ибо словить из-за этой ерунды rejection очень не приятно (особенно когда стартап)

2.16

We found that your app uses a background mode but does not include the following battery use disclaimer in your Application Description:

“Continued use of GPS running in the background can dramatically decrease battery life.”

It would be appropriate to revise your Application Description to include this disclaimer.
Что-то я не понял, а как вы таймер проверяете через 7 минут? На выполнение кода в бэкграунд режиме дается же 30 секунд.
Таймер работает пока программа в фоне активна, а для того чтобы она в фоне была активна используется background location mode для получения координат и long-running tasks. Как только программа в фоне умирает, таймер перестает тикать и пользователь получает сообщение что надо запустить программу.
Т.е. если запустить таймер и свернуть приложение (перевести в бэкграунд), то таймер все равно будет работать?
Если свернуть программу, таймер не тикнет. Но чтобы программа была активна какое-то (неопределенное, но около 10 минут) время, после того как пользователь ее свернул, можно использовать механизм Finite-Length Tasks
background location mode вы имеет ввиду, что периодически у вас все же вызывается — (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {… }?
Ага:)
Задача стояла чтобы программа через вебсокет, каждые N секунд отправляла свои текущие координаты. Потому она в фоне остается активна и у нее переодически вызывается locationManager:didUpdateLocations:
Два дня разбираюсь с работой геолокации в фоновом режиме.
На IOS7 геолокация работает все время пока программа загружена, даже если она свернута.

На IOS8 и IOS9 геолокация работает около 18 минут после сворачивания, потом режим background переходит в режим suspend и все глохнет.
Я что-то делаю неправильно, или получить данные от свернутой программы невозможно через XX минут?

Также вызывают вопросы некоторые другие особенности работы геолокации. Без установки фильтра на расстояние, запросы идут каждую секунду. После установки фильтра 2 запроса и далее молчание ( если я не двигаюсь). Как-то оба варианта не очень.

Пробовала allowDeferredLocationUpdatesUntilTraveled, выдает ошибку с кодом 12.

Буду очень благодарна, если кто-то поделится опытом по этому поводу.
Sign up to leave a comment.

Articles