我在iOS 7上的Objective C应用程序在后台获取startUpdatingsignificantLocationChanges或startUpdatingLocation委托的位置更新(哪一个取决于应用程序所处的模式,但我认为这不重要)。
在委托中,我收集位置信息,将其写入字典,然后将字典写入Firebase。
// this code is in the location update delegate routine
// the code that gathers the various elements that go into the dictionary
// are omitted for clarity, I don't think that they matter
// we may be running in the background on iOS 7 when we are called!
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
[[NSNumber numberWithFloat:newLocation.coordinate.latitude] stringValue], @"Latitude",
[[NSNumber numberWithFloat:newLocation.coordinate.longitude] stringValue], @"Longitude",
[[NSNumber numberWithFloat:newLocation.horizontalAccuracy] stringValue], @"Accuracy",
formattedDateString, @"TimeNow",
[dateFormatter stringFromDate:newLocation.timestamp], @"TimeStamp",
[[NSNumber numberWithDouble:interval] stringValue], @"Date",
self.mode, @"Mode",
nil];
// Write it once to CurrentLocation
[ref setValue:dictionary];
// yes, I know this is clumsy
fbTmp = [NSMutableString stringWithString: fbRoot];
[fbTmp appendString : @"/locationHistory"];
ref = [[Firebase alloc] initWithUrl:fbTmp];
// Now write it again to the locationHistory list
ref = [ref childByAutoId];
[ref setValue:dictionary];
有时它有效,有时它不起作用(即在应用程序的同一次运行中,有时会按预期成功地将位置写入Firebase,有时它不会。)没有'任何明显的押韵或理由,当它似乎工作,什么时候它没有。
我怀疑问题是Firebase写入未在后台模式下成功完成,但我不确定。我是iOS和Objective C和Firebase的新手。
我的应用程序在其功能中被标记为需要为位置更新和后台获取提供后台服务(后者我随机尝试解决此问题,前者我知道我需要)。
我怀疑我需要告诉操作系统我需要时间来完成使用backkgroundTask的写入,然后在firebase写入的完成块中终止后台任务 - 任何人都验证在运行时可以工作背景模式?
如果是这样,我是否只需要在第二次写入(假设它们是按顺序完成)或两者中都这样做(使用我在每次写入完成时倒计时的计数器)?
任何提示最受欢迎。
答案 0 :(得分:0)
是的,您需要在后台完成任务。它在Apple Documentation:
中这样说如果您的应用程序处于任务中间并且需要一点额外时间来完成该任务,它可以调用beginBackgroundTaskWithName:expirationHandler:或beginBackgroundTaskWithExpirationHandler:UIApplication对象的方法来请求一些额外的执行时间。调用这些方法中的任何一种都会暂时延迟暂停您的应用程序,从而为完成其工作提供一些额外的时间。完成该工作后,您的应用必须调用endBackgroundTask:方法让系统知道它已完成并可以暂停。
将代码放在后台任务中,给它最大时间(我想3分钟)。
阅读Apple app lifecycle,一切都应该清除,以供将来参考。