2016-04-16 12 views
0

Setup:Probleme bekommen device/Benutzerort mit IOS App, Swift

  1. Xcode 7,3 (7D175)
  2. Swift 2
  3. Gerät ist ein iPad mit IOS 9.3.1

Ich habe eine Swift-Klasse namens LocationUtility, ich benutze es so in einem ViewController:

let locationUtil = LocationUtility() 
locationUtil.initLocationManager() 

Die initLocationManager() Funktion setzt die CLLocationManager.delegate meine LocationUtility Klasse:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])

Ich habe NSLocationAlwaysUsageDescription string in meinem Info.plist

gesetzt:

func initLocationManager() { 
    seenError = false 
    locationFixAchieved = false 
    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 

    locationManager.requestAlwaysAuthorization() 

    if CLLocationManager.locationServicesEnabled() { 
     locationManager.startUpdatingLocation() 
    } 
} 

Die folgend Delegierten func aufgerufen wird nie werden Auf meinem iPad ist Datenschutz -> Standortdienste aktiviert.

Meine LocationUtility-Klasse ist etwas, zusammen mit Code aus anderen stackoverflow Fragen und Antworten über Standortfunktionen in Swift und iOS 8 und darüber hinaus. Aus meiner Sicht habe ich alle richtigen Einstellungen in meiner App und auf meinem Gerät, um Standortinformationen zu erhalten.

Hier ist meine komplette LocationUtility Klasse Quellcode:

import UIKit 
import Foundation 
import CoreLocation 

class LocationUtility: UIViewController, CLLocationManagerDelegate { 
    var locationStatus : NSString = "Not Started" 
    var locationManager: CLLocationManager! 
    var seenError : Bool = false 
    var locationFixAchieved : Bool = false 
    var currentLocation:CLLocation? = nil 

    func initLocationManager() { 
     seenError = false 
     locationFixAchieved = false 
     locationManager = CLLocationManager() 
     locationManager.delegate = self 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 

     locationManager.requestAlwaysAuthorization() 

     if CLLocationManager.locationServicesEnabled() { 
      //locationManager.delegate = self 
      //locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters 
      locationManager.startUpdatingLocation() 
     } 

    } 

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 
     print("LocationUtility -> didFailWithError()") 
     locationManager.stopUpdatingLocation() 
     if (seenError == false) { 
      seenError = true 
      print(error) 
     } 

    } 

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     print("LocationUtility -> didUpdateLocations()") 
     if (locationFixAchieved == false) { 
      locationFixAchieved = true 
      //var locationArray = locations as NSArray 
      currentLocation = locations.last! as CLLocation 
      let coord = currentLocation!.coordinate 

      print("user current location") 
      print(coord.latitude) 
      print(coord.longitude) 
     } 
    } 

    // authorization status 
    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
      print("LocationUtility -> didChangeAuthorizationStatus()!") 

      var shouldIAllow = false 

      switch status { 
      case CLAuthorizationStatus.Restricted: 
       locationStatus = "Restricted Access to location" 
      case CLAuthorizationStatus.Denied: 
       locationStatus = "User denied access to location" 
      case CLAuthorizationStatus.NotDetermined: 
       locationStatus = "Status not determined" 
      default: 
       locationStatus = "Allowed to location Access" 
       shouldIAllow = true 
      } 

      if (shouldIAllow == true) { 
       NSLog("Location to Allowed") 
       // Start location services 
       locationManager.startUpdatingLocation() 
      } else { 
       NSLog("Denied access: \(locationStatus)") 
      } 
    } 

} 
+1

Nein, es geht nicht. – Roee84

+0

Danke @ Roee84 Ich habe meine Frage "title" geändert und meine Frage dann bearbeitet, damit ich über meine Delegiertenfrage hinaus weiterhelfen konnte, danke für Ihr Feedback. –

+1

Wird die Methode 'didChangeAuthorizationStatus' jemals aufgerufen? Wenn ja, mit welchem ​​Wert für "Status"? –

Antwort

1

Die Symptome, die Sie stark beschreiben lassen vermuten, dass Ihre LocationUtility Instanz aufgehoben zu werden, die die CLLocationManager freigibt und stoppt den gesamten Prozess. Es ist nicht klar, wo Sie LocationUtility instanziieren, aber Sie müssen sicherstellen, dass es ein Ort ist, an dem die Instanz "live" im Speicher bleibt, während CLLocationManager seine Sachen macht. Wenn zum Beispiel der View-Controller freigegeben wird, werden seine Instanzvariablen aufgehoben, was so aussieht, als ob er wahrscheinlich Ihren Standortmanager enthält.

Ihre Frage wurde zunächst gestellt, ob der Standortmanager im App-Delegaten sein musste. Es ist natürlich nicht, aber es muss irgendwo sein, die verhindern kann, dass es freigegeben wird, während Standortaktualisierungen in Bearbeitung sind.

Wenn Sie sich nicht sicher sind, wann die LocationManager Freigabe aufgehoben wird, versuchen Sie, deinit darauf zu implementieren und einen Haltepunkt für diese Methode festzulegen.

+0

Yup Ich denke etwas in diese Richtung, aber machte die Annahme, dass mein ViewController nicht freigegeben wurde, während ich auf meinem Mapping-Bildschirm in der App blieb, aber ich werde deinit hier testen und zurück zu Ihnen, danke für den Rat –