Apple действительно упростила то, как вы можете получать оповещения на основе местоположения в iOS 10, однако я обнаружил, что при срабатывании уведомления и вызове методов делегатов UNUserNotificationCenterDelegate
, объекты области, которые спускаются, имеют основные и второстепенные значения, всегда равные нулю. Поэтому, когда метод делегата для получения уведомления, когда приложение находится на переднем плане, этот метод вызывается:iOS 10 Beacon Location Based Notifications Не предоставление основных и второстепенных значений
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
// When the app is in the foreground
if let trigger = notification.request.trigger as? UNLocationNotificationTrigger,
let region = trigger.region as? CLBeaconRegion {
// When you examine the region variable here, its major and minor
// values are null
}
completionHandler([.alert, .sound])
}
крупных и мелких NSNumber
переменных CLBeaconRegion
объекта всегда нуль. Я говорю CLLocationManager
для диапазона для маяков, которые должны обеспечивать эти значения, не так ли? Любая идея, что здесь отсутствует? Или это по дизайну? Я получаю тот же результат независимо от того, является ли он фактическим маяком (например, частицей KST) или другим устройством iOS, вещающим по Bluetooth, с использованием CBPeripheralManager
.
Вот мой уведомление регистрационный код:
let locationManager = CLLocationManager()
func createLocationNotification() {
self.locationManager.requestWhenInUseAuthorization()
let region = CLBeaconRegion(proximityUUID: UUID(uuidString: "UUID-STRING")!, identifier: "com.company.identifier")
region.notifyOnEntry = true
region.notifyOnExit = false
let content = UNMutableNotificationContent()
content.title = "New Checkin Received"
content.body = "Swipe or tap this message to see who's here"
let trigger = UNLocationNotificationTrigger(region: region, repeats: true)
let request = UNNotificationRequest.init(identifier: "BeaconNotificationIdentifier", content: content, trigger: trigger)
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().add(request, withCompletionHandler: { (error) in
})
self.locationManager.startRangingBeacons(in: region)
}
Я бы хотел, чтобы CLBeaconRegion, переданный делегату, был тем же регионом, который вы зарегистрировали в UNLocationNotificationTrigger. Поскольку у этого не было основного или несовершеннолетнего, у вас нет большого или второстепенного в делегате. Вы должны начать оценивать маяки в методе делегирования уведомлений, а затем работать с 'didRangeBeacon' основным и второстепенным. – Paulw11