¿Cómo configurar iBeacon para transmitir una notificación local solo una vez para un solo dispositivo?

Estoy presentando una notificación local cada vez que ingresamos o salimos de una región en

locationManager:didRangeBeacons:inRegion method of CLLocationManagerDelegate: 

algo como esto..

 //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; } 

Ahora, cuando el receptor detecta el transmisor y envía la notificación local, el receptor recibirá las notifications locales. Además, quiero configurar la notificación local por un día, es decir, el receptor debe recibir el post del transmisor solo una vez. Las valiosas sugerencias son muy apreciadas.

Nota: Uso el iPad mini como transmisor y iPhone 5 como receptor.

didRangeBeaconsInRegion realizar un seguimiento de las veces que se detectó cada baliza en su método didRangeBeaconsInRegion e ignorar ciertas balizas usando un filter de software si se han visto recientemente.

Aquí se muestra un ejemplo de cómo hacerlo . El núcleo de eso es:

  - (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]; } } } 

Sí, es posible. Pruebe el siguiente código:

 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 

Cuando detecta una baliza y notifica al usuario, puede almacenar la date actual en una tienda persistente, como NSUserDefaults . Luego, cuando vuelva a detectar esa baliza / región, puede verificar la date y, si es "hoy", no haga nada. Si no es "hoy", notifique nuevamente al usuario y actualice el valor almacenado