Posts

Post not yet marked as solved
2 Replies
637 Views
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)*/ } }
Posted Last updated
.