2017-02-03 2 views
1

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) 
} 
+1

Я бы хотел, чтобы CLBeaconRegion, переданный делегату, был тем же регионом, который вы зарегистрировали в UNLocationNotificationTrigger. Поскольку у этого не было основного или несовершеннолетнего, у вас нет большого или второстепенного в делегате. Вы должны начать оценивать маяки в методе делегирования уведомлений, а затем работать с 'didRangeBeacon' основным и второстепенным. – Paulw11

ответ

1

UNLocationNotificationTrigger является удобство оберткой API для мониторинга маяка, не радиомаяка в пределах API. Контрольные API просто не сообщают об обнаруженных отдельных идентификаторах, только CLBeaconRegion используется в качестве фильтра шаблонов для настройки мониторинга. Вы не можете использовать мониторинг, чтобы определить обнаруженный точный идентификатор.

Это имеет смысл, если вы посмотрите, как работает API. UNLocationNotificationTrigger является собственностью области CLRegion. Он не имеет свойства CLBeacon, которое необходимо для обнаружения отдельных идентификаторов. Хотя возможно иметь CLBeaconRegion, который имеет заполненные идентификаторы, если iOS ведут себя так, как вам хотелось бы, ему пришлось бы построить новый экземпляр CLRegion, чтобы заполнить его поля определенными идентификаторами маякового радиосигнала.

К сожалению, альтернатива, поскольку @ Paulw11 предлагает в своем комментарии не использовать эту удобную оболочку и использовать маяк, чтобы запускать ваши уведомления вручную.

+0

Хорошо. Ну, я думаю, я больше не буду преследовать свой хвост. Спасибо за указатель. Было слишком хорошо, чтобы быть правдой, но тот факт, что «UNLocationNotificationTrigger» принимает «CLBeaconRegion», заставляет меня надеяться. Ну что ж. Еще раз спасибо. –

Смежные вопросы