【发布时间】:2015-02-13 07:51:40
【问题描述】:
当用户进入和退出 iBeacon 区域时,我尝试保存。我的应用程序从后台正确唤醒,并且调用了委托方法(它显示了 LocalNotification)。在这种方法中,我还尝试将对象保存到UserDefaults。
在前台它完美地工作。但是当我的应用程序关闭(从任务管理器)并且用户进入或退出 iBeacon 区域时,会发送 LocalNotification(因此调用该方法),但似乎没有任何内容保存到 UserDefaults 中。因为当应用程序再次打开(由用户)时,我会尝试从 UserDefaults 中取回我在后台保存的内容。
这是我的代码:
// When user enters iBeacon Region
- (void)startTrip {
// Check if a trip was already started
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *currentTrip = [userDefaults dictionaryForKey:kSTORECURRENTTRIP];
if (currentTrip != nil) {
// A trip is already running
return;
}
NSLog(@"entered beacon");
// Create new trip
currentTrip = @{@"startDateTime": @([[NSDate date] timeIntervalSince1970])};
// Store it into UserDefaults
[userDefaults setObject:currentTrip forKey:kSTORECURRENTTRIP];
[userDefaults synchronize];
// Notification
[Tools sendLocalNotificationWithMessage:[NSString stringWithFormat:@"Trip started at %@", [currentTrip valueForKey:@"startDateTime"]]];
}
// When user exits iBeacon Region
- (void)stopTrip {
// Check if a trip was started
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *tmp = [userDefaults dictionaryForKey:kSTORECURRENTTRIP];
if (tmp == nil) {
// There is no current trip
return;
}
NSLog(@"exited beacon");
// Finish Trip (set values)
NSMutableDictionary *currentTrip = [NSMutableDictionary dictionaryWithDictionary:tmp];
[currentTrip setObject:@([[NSDate date] timeIntervalSince1970]) forKey:@"stopDateTime"];
// Add Trip to array of Trips to save
NSMutableArray *tripsToSave = [NSMutableArray arrayWithArray:[userDefaults arrayForKey:kTRIPSTOSAVE]];
if (tripsToSave == nil) {
tripsToSave = [NSMutableArray new];
}
[tripsToSave addObject:[NSDictionary dictionaryWithDictionary:currentTrip]];
[userDefaults setObject:[NSArray arrayWithArray:tripsToSave] forKey:kTRIPSTOSAVE];
// Reset stored current trip.
[userDefaults removeObjectForKey:kSTORECURRENTTRIP];
// Synchronize
[userDefaults synchronize];
// Notification
[Tools sendLocalNotificationWithMessage:[NSString stringWithFormat:@"Trip finished at %@", [currentTrip valueForKey:@"stopDateTime"]]];
}
我的问题是:
当应用程序在后台时,我可以执行多长时间的代码?有没有更好的方法(比如异步块?)
是否允许保存到
UserDefaults,是否可以取回保存到的值?UserDefaults在后台或前台模式下是一样的,不是吗?
编辑:新代码
【问题讨论】:
-
你的默认便利方法的实现是什么?
-
很遗憾我现在没有电脑。但我认为这就是我获取和存储数组的方式。我尝试使用另一种方式并在这里提供反馈。
-
我已经编辑了我的第一个问题,并在用户进入和退出 iBeacon 区域时添加了所有代码。关于获取和存储价值,我已经改变了很多。我不保存 Trip 对象,而是保存 NSDictionary。不幸的是它仍然不起作用......
标签: ios objective-c cllocationmanager ibeacon