Я пытаюсь сохранить, когда пользователь входит и выходит из iBeacon Region. Мое приложение правильно проснулось от фона и вызывается метод делегата (он показывает LocalNotification). В этом методе я также пытаюсь сохранить объект в UserDefaults
.Сохранение значения в UserDefaults при пробуждении приложения из области iBeacon
На переднем плане он отлично работает. Но когда мое приложение отключено (из диспетчера задач), и пользователь входит или выходит из iBeacon Region, 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
такое же в фоновом режиме или переднем плане, нет?
EDIT: новый код
Каковы реализации методов удобства по умолчанию? –
К сожалению, у меня сейчас нет моего компьютера. Но я думаю, что это то, как я получаю и сохраняю свой массив. Я пытаюсь использовать другой способ и даю обратную связь. – Jonathan
Я отредактировал свой первый вопрос и добавил весь код, когда пользователь входит и выходит из iBeacon Region. Я многое изменил, чтобы получить и сохранить значение. Я не сохраняю объект Trip, но NSDictionary. К сожалению, он все еще не работает ... – Jonathan