ios 13 mirror & location manager

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)*/

    }

  }


Replies

For all who are looking for a solution to this problem. I got the answer from apple that this behaviour is intended. So their is no way to use this methods together. 😟

Did you receive a Feedback incident number?


-M