首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IOS不确定背景时间

IOS不确定背景时间
EN

Stack Overflow用户
提问于 2014-02-07 23:43:05
回答 1查看 288关注 0票数 1

我有一个将数据发布到服务器的应用程序。只有当用户在一定距离内到达某个位置时,才会发布此数据。我重新进行了背景位置更新,希望这将允许我保持背景进行。但大约17-18分钟后,背景就停止执行了。

我想可能是因为locationManager.pauseslocationupdatesautomatically.但即使我将其设置为false,应用程序的终止时间仍为17分钟左右。这是我的应用程序代表的代码。

代码语言:javascript
复制
//
//  BAAppDelegate.m
//  Beacon App
//
//  Created by Huy Ly on 2/10/13.
//  Copyright (c) 2013 Placesign. All rights reserved.
//

#import "BAAppDelegate.h"

@implementation BAAppDelegate
@synthesize backgroundAnnouncementRevision, backgroundAnnouncementText, backgroundOfferDescription, backgroundOfferName, backgroundOfferPrice, backgroundOfferRevision, isAnnouncing, isOffering, locationManager, targetLocation, currentLocation, beaconTimer;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    NSLog(@"Application will resign active");
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    NSLog(@"Application entered background");
    // 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, this method is called instead of applicationWillTerminate: when the user quits.
    locationManager.distanceFilter = kCLDistanceFilterNone;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager setPausesLocationUpdatesAutomatically:YES];
    [locationManager startUpdatingLocation];
    NSLog(@"Starting timer for posting in background");
    /*
    //Runs the Timer on a background task main thread
    UIApplication *app = [UIApplication sharedApplication];


    //create new uiBackgroundTask
    __block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];*/

    //and create new timer with async call:
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //run function methodRunAfterBackground
        beaconTimer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(sendBeacon) userInfo:nil repeats:YES];
        [[NSRunLoop currentRunLoop] addTimer:beaconTimer forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentRunLoop] run];
    });

}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    NSLog(@"Application entered foreground");

    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
    [beaconTimer invalidate];
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    NSLog(@"Application became active");

    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    [beaconTimer invalidate];
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    NSLog(@"Application will terminate");
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    [beaconTimer invalidate];
}


-(void) sendBeacon{
    NSLog(@"Beacon Background Send Started");

    NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
    if ([[NSUserDefaults standardUserDefaults]valueForKey:@"PlaceID"]== nil) {
        isAnnouncing = FALSE;
        isOffering   = FALSE;
    }

    //Do a single distance check to see if user is still within bounds
    //Get the current location
    [locationManager startUpdatingLocation];

    //Compare current location with target location
    CLLocationDistance distance = [currentLocation distanceFromLocation:targetLocation];
    distance=distance/1000;

    //If user is within location boundary, posts to server
    if (distance < 0.1 || true) {
        NSLog(@"Background Sent");
        //Set Up the NSURL
        NSString *urlString = [standardUserDefaults valueForKey:@"statusUpdate"];
        NSURL *url          = [NSURL URLWithString:urlString];
        NSString *jsonString = [[NSString alloc] initWithFormat:@"{\"Announcement\":{\"Text\":\"%@\",\"ElementContext\":{\"Revision\":%@,\"Source\":{\"ID\":0,\"Type\":0}}},\"Offer\":{\"Description\":\"%@\",\"ElementContext\":{\"Revision\":%@,\"Source\":{\"ID\":0,\"Type\":0}},\"Name\":\"%@\",\"Price\":%@},\"OpStatus\":{\"ElementContext\":{\"Revision\":0,\"Source\":{\"ID\":0,\"Type\":0}},\"Value\":0},\"PlaceID\":%@,\"ResourcesOnPremise\":[{\"ElementContext\":{\"Revision\":0,\"Source\":{\"ID\":%@,\"Type\":1}},\"OnPremiseStatus\":2,\"Resource\":{\"ID\":%@,\"Type\":1}}],\"SignalSources\":[{\"LastSignal\":0,\"Source\":{\"ID\":0,\"Type\":0}}]}", backgroundAnnouncementText, backgroundAnnouncementRevision, backgroundOfferDescription, backgroundOfferRevision, backgroundOfferName, backgroundOfferPrice, [[NSUserDefaults standardUserDefaults]valueForKey:@"PlaceID"], [[NSUserDefaults standardUserDefaults]valueForKey:@"UserID"], [[NSUserDefaults standardUserDefaults]valueForKey:@"UserID"]];
        NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

        //setup the request
        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
        [request setHTTPMethod:@"POST"];
        [request setValue:[NSString stringWithFormat:@"%d", [jsonString length]] forHTTPHeaderField:@"Content-Length"];
        [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
        [request setHTTPBody:jsonData];
        NSURLConnection *requestConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

        [requestConnection start];

    }
    else{
    }
}

-(void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    NSLog(@"Location Manager failed with error %@", error);
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    currentLocation = [locations lastObject];
    NSLog(@"Manager did update location");
}

-(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager{
    NSLog(@"Location Manager Paused");
}

-(void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager{
    NSLog(@"Location Manager Resumed");
}

@end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-08 04:05:48

你不应该指望无限期地跑。如果您是一个位置应用程序,那么当设备移动时,您应该会被调用。但是如果设备不动,操作系统就没有理由打电话给你,也不会。

您需要设计您的应用程序,以便它使用最小的电池,以实现用户希望的行为。为此,如果您有一个您关心的边界,您应该设置一个位置区域,当设备移动到或离开该区域时,您就会被唤醒。这比经常看GPS要便宜得多。

如果用户希望您记录每一个小的移动,那么您可以设置您拥有的位置管理器(使用kCLLocationAccuracyBest),但您仍然将被调用时,设备移动。因为这将导致最大的电池损耗,确保这是实现用户目标的唯一途径。

根据设计,没有办法要求“不确定的背景时间”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21639770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档