我正在尝试使用Theos欺骗Find My Friends
中的位置更新。
到目前为止我有什么:
当应用程序位于前景时,我能够欺骗更新消息(使用Theos/Logos
挂钩FMFLocation
类)。
缺少什么:
当应用程序处于后台或已杀死时,当我的朋友请求我的位置时,它仍会将我的位置发送到服务器。此后台更新不会调用常规更新方法,因此我的钩子不起作用。此外,即使应用程序被杀,它也可以响应来自网络的位置请求。我认为Apple不会在常规应用中允许这种行为。
我认为这只能通过一些私有API来完成。有人能指出我正确的方向,找出它在后台使用的API /方法吗?
答案 0 :(得分:1)
您可能需要查看-startMonitoringSignificantLocationChanges
(docs)中的CLLocationMananger
方法。
正如文档所述:
此方法异步启动位置事件的传递, 你打电话后不久回来。地点活动将发送至 你的委托的locationManager:didUpdateLocations:方法。首先 要交付的事件通常是最近缓存的位置 事件(如果有的话),但在某些情况下可能是较新的事件。 获取当前位置修复可能需要几秒钟, 所以一定要检查你的位置事件的时间戳 委托方法。
返回当前位置修复后,接收器会生成更新 仅当用户位置发生重大变化时才会发生事件 检测。例如,它可能会在设备生成新事件 变得与不同的细胞塔相关联。它不依赖 distanceFilter属性中的值,用于生成事件。调用 这种方法连续几次不会自动产生 在生成的新事件中。调用 但是,stopMonitoringSignificantLocationChanges介于两者之间 导致下次调用时发送新的初始事件 方法
如果您启动此服务,则随后会提交您的申请 终止后,系统会自动将应用程序重新启动到 新活动到来的背景。在这种情况下,选项 字典传递给locationManager:didUpdateLocations:方法 您的应用程序委托包含密钥 UIApplicationLaunchOptionsLocationKey表示你的 应用程序是由于位置事件而启动的。重新启动后, 您仍然必须配置位置管理器对象并调用它 继续接收位置事件的方法。当你重新启动 位置服务,当前事件将传递给您的代理人 立即。此外,您所在位置的位置属性 管理器对象甚至填充了最新的位置对象 在开始定位服务之前。
除了你的委托对象实现了 locationManager:didUpdateLocations:方法,它也应该实现 locationManager:didFailWithError:响应潜力的方法 错误。
所以基本上你需要:
location
文件Info.plist
键设置为后台模式
CLLocationMananger
startMonitoringSignificantLocationChanges
AppDelegate
上,您会在信息词典中收到一个位置,当用户移动约500米时,该位置会以UIApplicationLaunchOptionsLocationKey
键入。答案 1 :(得分:1)
我明白了!它是在后台发送位置的aosnotifyd
。
我最终这样做了:
#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