2016-12-20 3 views
0

В моем стремительном приложении 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){} 
      } 
+0

Можете ли вы показать свой код, на котором вы установили уведомление, и отправить его пользователю? – davidgyoung

+0

Несомненно, посмотрите последний абзац – Dakata

ответ

1

Проблема в том, что вы не можете представить контроллер вида несколько раз. Это та самая существенная проблема, на которую я ответил: How to play a video after iBeacon detection?

Чтобы уточнить, хотя в вопросе упоминается «уведомление», проблема действительно связана с диалогом предупреждения. (Уведомление о прошивке обычно имеет более конкретное значение, где оно относится к NSNotificaitonCenter элементу, который может показать на экране блокировки.)

Диалога экземпляр оповещения строится один раз при загрузке класса во время let videos инициализируется. Затем он представляется пользователю внутри метода unc locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion), который вызывается каждую секунду.

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

+0

Спасибо за помощь, я добавил таймер, вы можете проверить мой обновленный код, но проблема в том, что каждый раз, когда я получаю уведомление. Действие UIAlert «ОК» повторно представлено, и после каждого уведомления я получаю +1 ОК, и это ошибка, потому что в какой-то момент я получаю 1 уведомление с 10 действиями ОК. Как я могу это исправить? – Dakata

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