Как настроить iBeacon для трансляции локального уведомления только один раз для одного устройства?
Я представляю локальное уведомление всякий раз, когда мы входим или покидаем регион в
locationManager:didRangeBeacons:inRegion method of CLLocationManagerDelegate:
что-то вроде этого..
//local notification sent from transmitter to receiver
switch (beacon.proximity)
{
case CLProximityNear:
message = @"You are near the ibeacon device";
bgColor = [UIColor blueColor];
break;
case CLProximityImmediate:
message = @"You are very closer to the device..";
bgColor = [UIColor colorWithRed:.0f green:.0f blue:230.0f alpha:1.0f];
break;
}
Теперь, когда получатель обнаружит передатчик и отправит локальное уведомление, получатель будет получать локальные уведомления. Кроме того, я хочу установить локальное уведомление на один день, т.е. получатель должен получать сообщение от передатчика только один раз. Ценные предложения высоко ценятся.
Примечание: я использую iPad mini в качестве передатчика и iPhone 5 в качестве приемника.
3 ответа
Вы должны отслеживать время, когда каждый маяк был обнаружен в вашем didRangeBeaconsInRegion
метод и игнорировать определенные маяки, используя программный фильтр, если они были замечены недавно.
Пример того, как это сделать, показан здесь. Ядром этого является:
- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLRegion *)region
{
for (CLBeacon *beacon in beacons) {
Boolean shouldSendNotification = NO;
NSDate *now = [NSDate date];
NSString *beaconKey = [NSString stringWithFormat:@"%@_%ld_%ld", [beacon.proximityUUID UUIDString], (long) beacon.major, (long) beacon.minor];
NSLog(@"Ranged UUID: %@ Major:%ld Minor:%ld RSSI:%ld", [beacon.proximityUUID UUIDString], (long)beacon.major, (long)beacon.minor, (long)beacon.rssi);
if ([beaconLastSeen objectForKey:beaconKey] == Nil) {
NSLog(@"This beacon has never been seen before");
shouldSendNotification = YES;
}
else {
NSDate *lastSeen = [beaconLastSeen objectForKey:beaconKey];
NSTimeInterval secondsSinceLastSeen = [now timeIntervalSinceDate:lastSeen];
NSLog(@"This beacon was last seen at %@, which was %.0f seconds ago", lastSeen, secondsSinceLastSeen);
if (secondsSinceLastSeen < 3600*24 /* one day in seconds */) {
shouldSendNotification = YES;
}
}
if (shouldSendNotification) {
[self sendLocalNotification];
}
}
}
Когда вы обнаружите маяк и уведомите пользователя, вы можете сохранить текущую дату в постоянном хранилище, например NSUserDefaults
, Затем, когда вы в следующий раз обнаружите этот маяк / регион, вы можете проверить дату и, если это "сегодня", ничего не делать. Если это не "сегодня", то уведомите пользователя снова и обновите сохраненное значение
Да, это возможно. Попробуйте следующий код:-
NSUserDefaults * userDefault = [NSUserDefaults standardUserDefaults];
BOOL alreadySent = [userDefault boolForKey:[NSString stringWithFormat:@"%@",region.identifier]];
if(!alreadySent){
//Already Send the notification for today
[userDefault setBool:YES forKey:[NSString stringWithFormat:@"%@",region.identifier]];
//Set the date for this region, you will need this date in order to set the BOOL to No later.
[userDefault setObject:[NSDate date] forKey:[NSString stringWithFormat:@"%@Date",region.identifier]];
//TODO: Send the Local Notification here
}
//TODO: Somewhere else, you will have to check if the date for that particular region.identifier
//if the date is already over 24 hours, set the Bool to NO