API privada de iOS para rastrear la location en segundo plano después de que se mata la aplicación (como Find My Friends)

Estoy tratando de falsificar la actualización de location en Find My Friends with Theos.

Lo que tengo hasta ahora:

Cuando la aplicación está en primer plano , pude falsificar el post de actualización (usando Theos/Logos para FMFLocation class FMFLocation ).

Lo que falta:

Cuando la aplicación está en segundo plano o fue asesinada , todavía envía mi location al server cuando mi amigo solicita mi location. Esta actualización de background NO invoca el método de actualización normal, por lo que mi gancho no funciona. Además, puede responder a la request de location de la networking incluso si la aplicación es eliminada. No creo que Apple permita este comportamiento en las aplicaciones normales.

Creo que esto solo se puede hacer con alguna API privada. ¿Podría alguien señalarme en la dirección correcta para averiguar qué API / método está usando en segundo plano?

Es posible que desee comprobar el método CLLocationMananger en CLLocationMananger ( docs ).

Como dicen los docs:

Este método inicia la entrega de events de location de forma asíncrona, y regresa poco después de que lo llama. Los events de location se entregan al gestor de ubicaciones de su delegado: didUpdateLocations: method. El primer evento que se entregará suele ser el evento de location en caching más reciente (si corresponde), pero puede ser un evento más nuevo en algunas circunstancias. Obtener una corrección de location actual puede tardar varios segundos adicionales, así que asegúrese de verificar las marcas de time en los events de location en el método de delegado.

Después de devolver una corrección de location actual, el receptor genera events de actualización solo cuando se detecta un cambio significativo en la location del usuario. Por ejemplo, podría generar un nuevo evento cuando el dispositivo se asocie con una torre celular diferente. No se basa en el valor de la propiedad distanceFilter para generar events. Llamar a este método varias veces seguidas no genera automáticamente nuevos events. Llamar a stopMonitoringSignificantLocation Los cambios intermedios, sin embargo, causan que se envíe un nuevo evento inicial la próxima vez que llame a este método.

Si inicia este service y su aplicación finaliza posteriormente, el sistema automáticamente relanza la aplicación en segundo plano si llega un nuevo evento. En tal caso, el dictionary de opciones pasó al gestor de location: didUpdateLocations: método de su delegado de aplicación contiene la key UIApplicationLaunchOptionsLocationKey para indicar que su aplicación se inició debido a un evento de location. Al relanzar, debe configurar un object de administrador de location y llamar a este método para continuar recibiendo events de location. Cuando reinicia los services de location, el evento actual se entrega a su delegado de inmediato. Además, la propiedad de location de su object de administrador de location se rellena con el object de location más reciente incluso antes de iniciar los services de location.

Además del object de delegado que implementa el método locationManager: didUpdateLocations: método, también debe implementar el gestor de location: didFailWithError: método para responder a posibles errores.

Entonces básicamente necesitas:

  • Establezca la key de location como un modo de background en su file Info.plist
  • Comience un CLLocationMananger
  • Llame a startMonitoringSignificantLocationChanges
  • En su AppDelegate , recibirá una location en el dictionary de información, con la key UIApplicationLaunchOptionsLocationKey cuando los usuarios se UIApplicationLaunchOptionsLocationKey unos 500 metros.
  • En ese método, puede actualizar la location en el server.

¡Me lo imaginé! Es el aosnotifyd que envía la location en el backgournd.

Terminé haciendo esto:

 #import <CoreLocation/CoreLocation.h> %hook AOSFindBaseServiceProvider -(void)sendCurrentLocation:(id)fp8 isFinished:(BOOL)fp12 forCmd:(id)fp16 withReason:(int)fp20 andAccuracyChange:(double)fp24{ //Mess with (CLLocation *)fp8 here %orig(c,fp12,fp16,fp20,fp24); } %end