2 Replies
      Latest reply on Feb 7, 2020 9:44 AM by Malonicus
      mastersolutiondev Level 1 Level 1 (0 points)

        Hello Forum,

         

        I am developing an application for iPad - iOS 13, which should play videos over Airplay connected to an AppleTV depending on location.

         

        I encountered the problem that the CLLocationmanager stop calling update location with the error "location manager KCLErrorDomain  code=0 error" after 1 to 3 update of location when connected to the apple tv.

        If the app runs without mirroring the location update works fine.

        Did someone had similar problems or could give a hint to me?

         

        Implementation of the second screen to show AVPlayer in AppDelegate:

         

        func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        
                print(connectingSceneSession.role.rawValue)
        
                if "UIWindowSceneSessionRoleExternalDisplay" == connectingSceneSession.role.rawValue {
        
                    /*return UISceneConfiguration(name: "External Configuration", sessionRole: connectingSceneSession.role)*/
        
                    let scene = UIWindowScene(session: connectingSceneSession, connectionOptions: options)
        
                    let win = UIWindow(frame: scene.screen.bounds)
        
                    win.rootViewController = UIStoryboard(name: "External", bundle: nil).instantiateViewController(identifier: "external") as! ExternalViewController2
        
                    win.windowScene = scene
        
                    win.isHidden = false
        
                    secondWindow = win
        
                }
        
                // Called when a new scene session is being created.
        
                // Use this method to select a configuration to create the new scene with.
        
               return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
        
            }

         

         

        Viecontroller with CLLocationManager to control the video playback:

        import UIKit
        
        import CoreLocation
        
        import MobileCoreServices
        
        
        class routeDisplayViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UINavigationControllerDelegate, CLLocationManagerDelegate {
        
        
            @IBOutlet weak var stageTable: UITableView!
        
            @IBOutlet weak var routeName: UILabel!
        
            var currentRoute : route?
        
            let fileManger = FileManager.default
        
            var videoURL: NSURL? = nil
        
            var locMan : CLLocationManager? = nil
        
            var currentRow : Int = 0
        
            var secondWindow : UIWindow?
        
            var sScreeView : UIView?
        
            var extVC :  ExternalViewController?
        
            override func viewDidLoad() {
        
                super.viewDidLoad()
        
                currentRoute = (UIApplication.shared.delegate as! AppDelegate).tramRoutes[(UIApplication.shared.delegate as! AppDelegate).routeInd]
        
                locMan = CLLocationManager()
        
                locMan!.requestAlwaysAuthorization()
        
                locMan!.requestWhenInUseAuthorization()
        
                locMan?.pausesLocationUpdatesAutomatically = false
        
                locMan?.delegate = self
        
                stageTable.delegate = self
        
                stageTable.dataSource = self
        
                if UIScreen.screens.count > 1 {
        
                    extVC = ((UIApplication.shared.delegate as! AppDelegate).secondWindow?.rootViewController as? ExternalViewController2)?.externPlayerController
        
                }
        
            }
        
            func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
                return (currentRoute?.stages.count)!
        
            }
        
            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
                let cell = stageTable.dequeueReusableCell(withIdentifier: "stageCell", for: indexPath)
        
                cell.textLabel?.text = currentRoute?.stages[indexPath.row].spotName
        
                return cell
        
            }
        
            func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
                currentRow = indexPath.row
        
            }
        
            func moveTableToCell (rowIndex: IndexPath) {
        
                stageTable.scrollToRow(at: rowIndex, at: .middle, animated: true)
        
            }
        
        
            func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        
                let stage = currentRoute?.stages[currentRow]
        
                let spot = (UIApplication.shared.delegate as! AppDelegate).routeSpots[stage!.spotName]
        
                let target = CLLocation(latitude: Double(exactly: spot!.latitude)!, longitude: Double(exactly:spot!.longitude)!)
        
                guard let locValue: CLLocation = manager.location else {return}
        
                print(locValue)
        
                routeName.text = "\(locValue.coordinate.latitude) \(locValue.coordinate.longitude)"
        
                let dis = locValue.distance(from: target)
        
                if dis < Double(exactly:stage!.distance)! {
        
                    if !(extVC!.isPlaying!) {
        
                    extVC?.playVid(vidName: stage!.vidFileName, preventFromPlaying: true)
        
                    }
        
                    stageTable.selectRow(at: IndexPath(row: currentRow, section: 0), animated: true, scrollPosition: .middle)
        
                    if currentRow+1 < stageTable.numberOfRows(inSection: 0) {
        
                        currentRow+=1
        
                    }
        
                }
        
            }
        
            func startLocationDetection() {
        
                if CLLocationManager.locationServicesEnabled() {
        
                    locMan!.delegate = self
        
                    //locMan!.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        
                    locMan!.startUpdatingLocation()
        
                }
        
            }
        
            func locationManagerDidPauseLocationUpdates(_ manager: CLLocationManager) {
        
                print("ex pause")
        
            }
        
            func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        
                print("ex error: \(error)")
        
            }
        
            func locationManager(_ manager: CLLocationManager, didFinishDeferredUpdatesWithError error: Error?) {
        
                print("deffered ex error: \(String(describing: error))")
        
            }
        
            func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        
                print("loc stat: \(status)")
        
            }
        
            //MARK: BtnActions
        
            @IBAction func back(_ sender: UIButton) {
        
                performSegue(withIdentifier: "backStartView", sender: nil)
        
            }
        
            @IBAction func startRoute(_ sender: UIButton) {
        
                startLocationDetection()
        
                extVC?.playVid(vidName: currentRoute!.startVideo, preventFromPlaying: true)
        
            }
        
            @IBAction func playWaitVid(_ sender: Any) {
        
                /*extVC?.playVid(vidName: currentRoute!.waitVideo, preventFromPlaying: false)*/
        
            }
        
          }