10分钟后,iPhone App在后台运行终止 [英] iPhone App runnung in the background terminates after 10 minutes

查看:348
本文介绍了10分钟后,iPhone App在后台运行终止的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一款需要在iOS4后台运行的应用。 I
希望它像常规的基于位置的应用程序,因此BackgroundMode是
设置为location。当应用程序进入后台
状态时应用程序运行良好,但在10分钟后,它将停止响应。也许这是
被暂停/终止。
我想要做的是永远在后台运行应用程序
,没有任何时间限制,直到用户专门终止应用程序
。请指导我如何实现这一目标。
这里我在GPS更新到新位置时弹出本地通知。这里提供了一些代码:

I am working on an app that needs to run in the background on iOS4. I want it to be a like regular Location-based app so the BackgroundMode is set to location. The application works well when it enters the background state but after 10 minutes, it stops responding anymore. Perhaps it gets suspended/terminated. What I want to do is run the application in the background forever without any time limit until the user terminates the application exclusively. Please guide me how can I achieve this. Here I am popping up local notification when the GPS updates to a new location. Some code snippest is provided here:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    /*
     Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
     If your application supports background execution, called instead of applicationWillTerminate: when the user quits.
     */


 UIApplication*    app = [UIApplication sharedApplication];

    // Request permission to run in the background. Provide an
    // expiration handler in case the task runs long.
    NSAssert(bgTask == UIBackgroundTaskInvalid, nil);

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        // Synchronize the cleanup call on the main thread in case
        // the task actually finishes at around the same time.
        dispatch_async(dispatch_get_main_queue(), ^{

            if (bgTask != UIBackgroundTaskInvalid)
            {
                [app endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];

    // Start the long-running task and return immediately.

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Do the work associated with the task.

  locmanager = [[CLLocationManager alloc] init];
  [locmanager setDelegate:self];
  [locmanager setDesiredAccuracy:kCLLocationAccuracyBest];
  locmanager.distanceFilter = 20;
  [locmanager startUpdatingLocation];

  NSLog(@"App staus: applicationDidEnterBackground");
        // Synchronize the cleanup call on the main thread in case
        // the expiration handler is fired at the same time.
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                [app endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid; 
            }
        });  
    });
 NSLog(@"backgroundTimeRemaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]);
}

and

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{ 
 // Log the kind of accuracy we got from this
 NSLog(@"Accuracy-------- %f %f", [newLocation horizontalAccuracy], [newLocation verticalAccuracy]);

 CLLocationCoordinate2D loc = [newLocation coordinate];
 userCurrentLocation = newLocation;
 lat = loc.latitude;
 lon = loc.longitude;

 UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    if (localNotif == nil)
        return;
 NSDate *now = [NSDate dateWithTimeIntervalSinceNow:10]; 

 NSLog(@"Now is %@",now); 

 localNotif.fireDate = now;

    localNotif.timeZone = [NSTimeZone defaultTimeZone];

 // Notification details
    localNotif.alertBody = [NSString stringWithFormat:@"Latitude = %f, Longitude = %f", lat, lon];
 // Set the action button
    localNotif.alertAction = @"View";

    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 1;

 // Specify custom data for the notification
    NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"someValue" forKey:@"someKey"];
    localNotif.userInfo = infoDict;

 // Schedule the notification
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
    [localNotif release];

}

Plz指导我如何做到这一点?

Plz guide me how to do this?

推荐答案

你的info.plist包含这些东西?

Your info.plist contains this stuff?


应用程序可以将自身声明为连续的后台位置应用程序。需要标准位置服务提供的常规位置更新的应用程序可以将其自身声明为连续后台应用程序。它通过在其Info.plist文件中包含UIBackgroundModes键并将此键的值设置为包含位置字符串的数组来完成此操作。如果具有此密钥的应用程序在进入后台时运行位置服务,则系统不会挂起该服务。相反,它允许继续运行,以便它可以在后台执行与位置相关的任务。

An application can declare itself as a continuous background location application. An application that needs the regular location updates offered by the standard location services may declare itself as a continuous background application. It does this by including the UIBackgroundModes key in its Info.plist file and setting the value of this key to an array containing the location string. If an application with this key is running location services when it enters the background, it is not suspended by the system. Instead, it is allowed to continue running so that it may perform location-related tasks in the background.

http: //developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html%23//apple_ref/doc/uid/TP40007072-CH5

这篇关于10分钟后,iPhone App在后台运行终止的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆