2016-12-15 5 views
1

私はiBeaconとSwiftの開発で新しく、アプリケーションにいくつか問題があります。次のコードでは、iBeaconを検出しようとしています。ビーコンのマイナー値を検出すると、再生したいリンクにアタッチします。この問題は、プログラムを起動するときに発生します。ビデオが1秒間再生を開始すると、次のエラーでアプリケーション全体が停止します。iBeacon検出後にビデオを再生する方法は?

キャッチされていない例外 'NSInvalidArgumentException'によってアプリケーションが終了しました。理由: 'アプリケーションがアクティブなコントローラをモーダルで表示しようとしました.libC++ abi.dylib :NSException型のキャッチされていない例外で終了します。

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"), 


       ] 



    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] { 


      self.avPlayer = AVPlayer(url: url as! URL) 
      self.avPlayerViewController.player = self.avPlayer 

     } 
     self.present(self.avPlayerViewController,animated: true) {() -> Void in 
      self.avPlayerViewController.player?.play() 
     } 
    } 
} 

このエラーを修正する方法を教えてください。

答えて

1

func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion)レンジングコールバックが毎秒呼び出されるという問題があります。ビデオプレーヤーを表示するためのコードは毎秒実行されます。これは初めて動作するかもしれませんが、2度目の場合は、self.present(...)への呼び出しがすでに提示したView Controllerを表示しようとしているため、エラーが発生します。 同じビューコントローラを繰り返し表示することはできません。

この解決方法は、これをどのように機能させるかによって異なります。このプレゼンテーションを一回だけしたいですか?もしそうなら、あなたはできる:

if (knownBeacons.count > 0) { 
    let closestBeacon = knownBeacons[0] as CLBeacon 

    if let url = self.videos[closestBeacon.minor.intValue] { 

     // 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() 
      } 
     } 
    } 
} 
+0

本当にありがとう、私の問題を本当に解決しました。私は次回にそのことを覚えておき、新しいことを本当に学びました。私から投票アップ: – Dakata

+0

ちょっとあなたは、アプリが閉じられたときにビデオを表示する方法を教えてくれませんか?私はプライバシー - 場所常に使用説明を追加しましたが、それでも動作しません – Dakata

関連する問題