【问题标题】:iOS private API to track location in background after the app is killed (like Find My Friends)iOS 私有 API 用于在应用程序被杀死后在后台跟踪位置(如 Find My Friends)
【发布时间】:2013-06-23 19:18:40
【问题描述】:

我正在尝试使用 Theos 欺骗 Find My Friends 中的位置更新。

我目前所拥有的:

当应用程序处于前台时,我能够欺骗更新消息(使用Theos/Logos 挂钩FMFLocation 类)。

缺少什么:

当应用程序处于backgroundkilled时,当我的朋友请求我的位置时,它仍然会将我的位置发送到服务器。此后台更新不会调用常规更新方法,因此我的钩子不起作用。此外,即使应用程序被杀死,它也可以响应来自网络的位置请求。我认为 Apple 不允许在常规应用中出现这种行为。

我认为这只能通过一些私有 API 来完成。谁能指出正确的方向以找出它在后台使用的 API/方法?

【问题讨论】:

    标签: iphone ios core-location


    【解决方案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
    

    【讨论】:

    【解决方案2】:

    您可能需要检查CLLocationMananger (docs) 中的-startMonitoringSignificantLocationChanges 方法。

    如文档所述:

    该方法异步发起位置事件的传递, 你打电话后不久就回来了。位置事件被传递到 你的委托的 locationManager:didUpdateLocations: 方法。首先 要传递的事件通常是最近缓存的位置 事件(如果有),但在某些情况下可能是较新的事件。 获取当前位置可能需要几秒钟的时间, 所以一定要检查你的位置事件的时间戳 委托方法。

    在返回当前位置修复后,接收器生成更新 仅当用户位置发生重大变化时才发生事件 检测到。例如,它可能会在设备 与不同的蜂窝塔相关联。它不依赖 distanceFilter 属性中的值以生成事件。打电话 此方法连续多次不会自动产生 在正在生成的新事件中。打电话 但是,两者之间的 stopMonitoringSignificantLocationChanges 确实 下次您调用它时会发送一个新的初始事件 方法。

    如果您启动此服务并且您的应用程序随后 终止,系统自动重新启动应用程序到 新事件到达时的背景。在这种情况下,选项 字典传递给 locationManager:didUpdateLocations: 方法 您的应用程序委托包含密钥 UIApplicationLaunchOptionsLocationKey 来表明你的 由于位置事件而启动了应用程序。重启后, 您仍然必须配置一个位置管理器对象并调用它 方法继续接收位置事件。当你重新启动 位置服务,当前事件被传递给您的代表 立即地。此外,您所在位置的 location 属性 manager 对象甚至填充了最新的位置对象 在您开始定位服务之前。

    除了你的委托对象实现 locationManager:didUpdateLocations: 方法,它也应该实现 locationManager:didFailWithError: 方法来响应潜在的 错误。

    所以基本上你需要:

    • Info.plist 文件中将location 键设置为后台模式
    • 开始CLLocationMananger
    • 致电startMonitoringSignificantLocationChanges
    • 在您的AppDelegate 上,您将在信息字典中收到一个位置,当用户移动大约 500 米时,该位置以UIApplicationLaunchOptionsLocationKey 为关键字。
    • 使用该方法,您可以更新服务器上的位置。

    【讨论】:

    • 其实Find My Friends可以根据网络请求发送位置,即使应用被杀死并且没有检测到移动,这显然不是startMonitoringSignificantLocationChanges触发的。
    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多