В моем стремительном приложении 3 у меня есть 2 iBeacons, которые должны выполнять разные задачи. Один из них должен открыть и воспроизвести видеофайл, а другой должен отправить уведомление пользователям. Все отлично работает, когда я закрываю свой iPhone для маяка, который воспроизводит аудиофайл, но когда я тестирую другой маяк, который отправляет уведомления, приложение отправляет только одно уведомление и внезапно перестает работать. Я предполагаю, что я пытаюсь отобразить одно и то же уведомление неограниченное количество раз, но я не знаю, как исправить эту проблему. Это ошибка, я получаю:Как показать уведомление пользователям после обнаружения iBeacon, пока приложение запущено и пока оно закрыто?
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present modally an active controller <Audio.DEViewController: 0x149f05190>.'
Пожалуйста, посмотрите на мой код внизу:
var captureSession: AVCaptureSession?
var videoPreviewLayer: AVCaptureVideoPreviewLayer?
var avPlayerViewController = AVPlayerViewController()
var avPlayer:AVPlayer?
let locationManager = CLLocationManager()
let region = CLBeaconRegion(proximityUUID: UUID(uuidString: "8492E75F-4FD6-469D-B132-043FE94921D8")!, identifier: "Estimotes")
let videos = [
19987: NSURL (string: "http://techslides.com/demos/sample-videos/small.mp4"),
3542: UIAlertController(title:"Permission Required", message:"Location services permission is required.", preferredStyle:.alert)
]
func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
let knownBeacons = beacons.filter{ $0.proximity != CLProximity.unknown }
if (knownBeacons.count > 0) {
let closestBeacon = knownBeacons[0] as CLBeacon
if let url = self.videos[closestBeacon.minor.intValue] {
let ok = UIAlertAction(title: "OK", style: .default) { (action) -> Void in
}
url.addAction(ok)
self.present(url as UIViewController, animated:true){}
// only execute this code once, if avPlayer not created yet
if self.avPlayer == nil {
self.avPlayer = AVPlayer(url: url as! URL)
self.avPlayerViewController.player = self.avPlayer
self.present(self.avPlayerViewController,animated: true) {() -> Void in
self.avPlayerViewController.player?.play()
}
}
}
}
Кроме того, как я сп дают возможность отправки уведомления, даже если пользователь закрыл приложение. Я добавил
Privacy - Location Always Usage Description
в моем
info.plist
Но до сих пор, когда я закрыть приложение и попытаться отобразить уведомление, ничего не происходит.
if let url = self.colors[closestBeacon.minor.intValue] {
if (NSDate.timeIntervalSinceReferenceDate - self.lastNotificationTime > 10) {
self.lastNotificationTime = NSDate.timeIntervalSinceReferenceDate
let ok = UIAlertAction(title: "OK", style: .default) { (action) -> Void in
}
url.addAction(ok)
self.present(url as UIViewController, animated:true){}
}
Можете ли вы показать свой код, на котором вы установили уведомление, и отправить его пользователю? – davidgyoung
Несомненно, посмотрите последний абзац – Dakata