Как приложение Navita TEM получает информацию журнала звонков?

Как Navita https://itunes.apple.com/us/app/navita-t.e.m.-personal/id590228620?mt=8 управлять отображением журнала вызовов?

Если я вытащил приложение из диспетчера задач, тогда он пропустит вызовы, это означает, что он должен предположительно использовать CTCallCenter callEventHandler и создает свой собственный журнал вызовов, сохраняя время/продолжительность в ответ на обратные вызовы callEventHandler.

Однако, если это так, то как это удается сделать в фоновом режиме? У меня создалось впечатление, что callEventHandler можно использовать только приложениями на переднем плане, а не в фоновом режиме?

В приложении используются службы определения местоположения, однако даже после его отключения он все еще мог получать информацию о вызовах (при условии, что приложение не приостановлено). Хотя я мог бы использовать обновления фонового местоположения, чтобы он сам загружался, чтобы получать обратные вызовы callEventHandler, но, по-видимому, нет.

Приложение Navita дополнительно может отображать время вызова и продолжительность вызова.

Награда будет присуждаться ответу, который содержит достаточную, точную и подробную информацию, которая позволяет мне эмулировать поведение приложения Navita, в частности, я должен быть в состоянии написать приложение, которое может получить время и продолжительность телефона вызов, который произошел, когда приложение не было на переднем плане, в то время как службы определения местоположения были отключены, а после того, как приложение было в фоновом режиме дольше, чем через 3 минуты, предоставленное с помощью beginBackgroundTaskWithExpirationHandler:

   Here is what I observe with the Navita app that I want to be able to reproduce:

1) Run app
2) Task away from app
3) Go to device settings, privacy, and turn off Location Services.
4) Go to device settings, privacy, background app refresh and turn off for the app
5) Wait > 10 minutes to make sure the app is not still in the background as a consequence of using beginBackgroundTaskWithExpirationHandler:
6) Call the device from another phone, answer the phone call, then hang up.
7) Launch the app again and display the call time and duration

(Это iOS7 и unjailbroken)

Ответ 1

Вот что я нашел из разборки Navita TEM и ресурсов.

Приложение использует два фоновых режима - местоположение и аудио. Вы можете увидеть его в файле Info.plist. Когда вы включаете приложение регистрации телефонных звонков, вы также включаете переключатели "предупреждения" и "в реальном времени". Когда "предупреждения" включали приложение бесконечно петли в фоновом режиме "bg-sound.mp3", который не имеет звука, он просто отключается. Из-за этого он не использует хаки, подобные этому Как получить событие вызова с помощью CTCallCenter: setCallEventHandler: это произошло, когда приложение было приостановлено?. Это аналогичный трюк для местоположения, используемого для того, чтобы приложение работало в фоновом режиме и получало события телефонного звонка. Как-то это не было отклонено из AppStore.

Ответ 2

Если вы наблюдаете за колл-центром, когда приложение находится в фоновом режиме, вы получаете набор обновлений, когда приложение возвращается на передний план. Этот набор данных может быть не таким точным, как если бы приложение было в основном на переднем плане, но оно включает в себя довольно немного информации.