iOS位置更新甚至应用程序都没有运行(比如找我的iphone)

时间:2013-08-27 10:34:43

标签: iphone ios core-location

我想编写位于前景,后台甚至终止(未运行)的“找到我的iPhone ”的位置跟踪应用。位置将定期发送到我的服务器。我在谷歌搜索并阅读了许多文档,教程评论,有关此主题的代码。然后我找到了this tutorial。但是在本教程中,位置被发送到前景中的“.txt”文件和背景没有终止 ...我的意思是,当应用程序被杀死时,它不会在后台重新启动以发送位置“ .txt“文件..所以我添加并更新了一些代码,以便在它不运行时发送位置..但是,我没有这样做...我的意思是,当我在多任务中杀死(关闭)应用程序时(双点击主页按钮),它没有发送到位置...

你能帮助我,我该如何解决这个问题?

提前致谢

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
    [self log:[NSString stringWithFormat:@"Background location %.06f %.06f %@" , newLocation.coordinate.latitude, newLocation.coordinate.longitude, newLocation.timestamp]];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    id locationValue = [launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey];
    if (locationValue)
    {
        // create a new manager and start checking for sig changes

        [self log:@"didFinishLaunchingWithOptions location key"];
        m_locManager = [[CLLocationManager alloc] init];

        [self log:@"didFinishLaunchingWithOptions created manager"];
        m_locManager.delegate = self;

        [self log:@"didFinishLaunchingWithOptions set delegate"];
        [m_locManager startMonitoringSignificantLocationChanges];

        [self log:@"didFinishLaunchingWithOptions monitoring sig changes"];

        return YES;
    }

    [self log:@"didFinishLaunchingWithOptions"];    
    return YES;
}


- (void)applicationWillResignActive:(UIApplication *)application {
    [self log:@"applicationWillResignActive"];
    NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setBool:viewController.m_significantSwitch.on forKey:@"significant"];
    [userDefaults synchronize];
}                


- (void)applicationDidEnterBackground:(UIApplication *)application {
    [self log:@"applicationDidEnterBackground"];
    [m_locManager startMonitoringSignificantLocationChanges];
}


- (void)applicationWillEnterForeground:(UIApplication *)application {

    [self log:@"applicationWillEnterForeground"];
    [m_locManager stopMonitoringSignificantLocationChanges];

}


- (void)applicationDidBecomeActive:(UIApplication *)application {
    [self log:@"applicationDidBecomeActive"];

    if (![window.subviews count])
    {
        // Add the view controller's view to the window and display.
        [window addSubview:viewController.view];
        [window makeKeyAndVisible];

        NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
        viewController.m_significantSwitch.on = [userDefaults boolForKey:@"significant"];
        if (viewController.m_significantSwitch.on)
            [viewController actionSignificant:nil];
    }
}


- (void)applicationWillTerminate:(UIApplication *)application {
    [self log:@"applicationWillTerminate"];
    [m_locManager startMonitoringSignificantLocationChanges];

}

4 个答案:

答案 0 :(得分:7)

这是不正确的,当您的应用程序终止时,它仍然可以监控重要的位置更新。

答案 1 :(得分:3)

我的朋友,你走错了路。实际上,在iOS中杀死应用程序后,没有任何方法可以执行任务。你可以阅读这个here in Apple documentation

查找我的iPhone - 这是一个Apple应用程序,他们正在使用私有API来实现这一目标。这些类型的功能不适用于通用开发人员编程。

所以请不要走这条路。所有人都会徒劳无功。

希望这有助于你!

答案 2 :(得分:1)

除非您可以接收推送通知或UILocalNotifications,否则在应用程序被杀死时您无法运行任何内容。您可以尝试复制UILocalNotifications功能,即使您的应用程序被杀/在bg /中也会执行您的操作。顺便说一句,这是一个复杂的事情,你可以做更多关于ios7后台任务的事情。

答案 3 :(得分:1)

这可能会对你有所帮助。 Getting the User’s Location

请参阅Starting the Significant-Change Location Service部分。它说

  

如果您使重要更改位置服务保持运行且您的iOS应用随后被暂停或终止,则当新位置数据到达时,该服务会自动唤醒您的应用。在唤醒时,应用程序将被置于后台,您将获得少量时间(大约10秒)来手动重新启动位置服务并处理位置数据。