定位框一闪而过 iOS Swift

需求:获取经纬度。

方案:我自定义了一个类模块CLLocationModule.swift

备注以下代码里 

let IS_IOS8 = (UIDevice.currentDevice().systemVersion as NSString).doubleValue >= 8.0

最开始的代码

import UIKit

import CoreLocation

class CLLocationModule: NSObject ,CLLocationManagerDelegate{

    var latitude:Double?

    var longitude:Double?

    var city:NSString?

 

    func GetLatitudeLongitudeAndCity(){

        if CLLocationManager.locationServicesEnabled() == false {

            print("此设备不能定位")

            return

        }

        var locManager = CLLocationManager()        

        locManager.delegate = self

        locManager.desiredAccuracy = kCLLocationAccuracyBest        

        locManager.distanceFilter = 1000.0        

        //设置定位权限仅ios8有意义

        if IS_IOS8 {

            locManager.requestWhenInUseAuthorization()// 前台定位

            locManager.requestAlwaysAuthorization()

        }       

        locManager.startUpdatingLocation()

    }

    

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

        for location in locations {

            print("纬度:%g",location.coordinate.latitude);            

            print("经度:%g",location.coordinate.longitude);

            latitude = location.coordinate.latitude

            longitude = location.coordinate.longitude            

            self.saveLatitude(latitude!.description)

            self.saveLongitude(longitude!.description)            

            let geocoder: CLGeocoder = CLGeocoder()

            geocoder.reverseGeocodeLocation(location) { (placemarks, error) in

                if error != nil {

                    print("reverse geodcode fail: (error!.localizedDescription)")

                    return

                }

                let pm = placemarks! as [CLPlacemark]

                if (pm.count > 0){

                    for placemark :CLPlacemark in placemarks! {                        

                        let placemarkDict = placemark.addressDictionary

                        let placemarkStr = placemarkDict!["State"]

                        self.city = placemarkStr?.substringToIndex((placemarkStr?.length)!-1)

                        self.saveCity(self.city!)

                    }

                }else{

                    print("No Placemarks!")

                }

            }

        }        

        manager.stopUpdatingLocation()

    }

   

    func locationManager(manager:CLLocationManager, didFailWithError error:NSError) {

        print("locationManager error");        

    }

    

    func saveLatitude(latitude: NSString) {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        defaults.setObject(latitude, forKey: "latitude")

        defaults.synchronize()

    }

    

    func readLatitude() -> NSString {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        let latitude = defaults.objectForKey("latitude") as! NSString

        return latitude;

    }

    

    func saveLongitude(longitude: NSString) {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        defaults.setObject(longitude, forKey: "longitude")

        defaults.synchronize()

    }

    

    func readLongitude() -> NSString {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        let longitude = defaults.objectForKey("longitude") as! NSString

        return longitude;

    }

    

    func saveCity(city: NSString) {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        defaults.setObject(city, forKey: "city")

        defaults.synchronize()

    }

    

    func readCity() -> NSString {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        let city = defaults.objectForKey("city") as! NSString

        return city;

    }

}

 

外部调用是:

CLLocationModule().GetLatitudeLongitudeAndCity()

结果:定位框一闪而过 (允许 不允许那个弹出框) 导致不走代理方法didUpdateLocations 最后查阅网页 知道  

 

(a)locManager没定义为全局变量 

(b)自定义的CLLocationModule.swift这个类 由于ARC的缘故 自动释放了

针对以上(a)问题的解决办法为自定义类CLLocationModule.swift中将var locManager = CLLocationManager() 改为全局变量

var locManager: CLLocationManager!

locManager = CLLocationManager()

针对以上(b)问题的解决方案有两种

(1)外部调用时改为:(改为强引用)

var aCLLocationModule = CLLocationModule()

self.aCLLocationModule.GetLatitudeLongitudeAndCity()

(2)自定义的类CLLocationModule.swift改为单例

    //单例

    private static let aSharedInstance: CLLocationModule = CLLocationModule()

    private override init() {}

    class func sharedInstance() -> CLLocationModule {

        return aSharedInstance

    }

外部调用时改为:

CLLocationModule.sharedInstance().GetLatitudeLongitudeAndCity()

成功的代码附上两份

(1)单例

import UIKit

import CoreLocation

class CLLocationModule: NSObject ,CLLocationManagerDelegate{

     //单例

    private static let aSharedInstance: CLLocationModule = CLLocationModule()

    private override init() {}

    class func sharedInstance() -> CLLocationModule {

        return aSharedInstance

    }

    

    var locManager: CLLocationManager! 

    var latitude:Double?

    var longitude:Double?

    var city:NSString?

    

    func GetLatitudeLongitudeAndCity(){        

        if CLLocationManager.locationServicesEnabled() == false {

            print("此设备不能定位")

            return

        }

        locManager = CLLocationManager()       

        locManager.delegate = self       

        locManager.desiredAccuracy = kCLLocationAccuracyBest        

        locManager.distanceFilter = 1000.0

        //设置定位权限仅ios8有意义

        if IS_IOS8 {

            locManager.requestWhenInUseAuthorization()// 前台定位

            locManager.requestAlwaysAuthorization()

        }        

        locManager.startUpdatingLocation()

    }

    

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

        for location in locations {

            print("纬度:%g",location.coordinate.latitude);            

            print("经度:%g",location.coordinate.longitude);

            latitude = location.coordinate.latitude

            longitude = location.coordinate.longitude           

            self.saveLatitude(latitude!.description)

            self.saveLongitude(longitude!.description)         

            let geocoder: CLGeocoder = CLGeocoder()

            geocoder.reverseGeocodeLocation(location) { (placemarks, error) in

                if error != nil {

                    print("reverse geodcode fail: (error!.localizedDescription)")

                    return

                }

                let pm = placemarks! as [CLPlacemark]

                if (pm.count > 0){

                    for placemark :CLPlacemark in placemarks! {

                        let placemarkDict = placemark.addressDictionary

                        let placemarkStr = placemarkDict!["State"]

                        self.city = placemarkStr?.substringToIndex((placemarkStr?.length)!-1)                        

                        self.saveCity(self.city!)

                    }

                }else{

                    print("No Placemarks!")

                }

            }

        }      

        manager.stopUpdatingLocation()

    }

   

    func locationManager(manager:CLLocationManager, didFailWithError error:NSError) {

        print("locationManager error");       

    }

    

    func saveLatitude(latitude: NSString) {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        defaults.setObject(latitude, forKey: "latitude")

        defaults.synchronize()

    }

    

    func readLatitude() -> NSString {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        let latitude = defaults.objectForKey("latitude") as! NSString

        return latitude;

    }

    

    func saveLongitude(longitude: NSString) {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        defaults.setObject(longitude, forKey: "longitude")

        defaults.synchronize()

    }

    

    func readLongitude() -> NSString {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        let longitude = defaults.objectForKey("longitude") as! NSString

        return longitude;

    }

    

    func saveCity(city: NSString) {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        defaults.setObject(city, forKey: "city")

        defaults.synchronize()

    }

    

    func readCity() -> NSString {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        let city = defaults.objectForKey("city") as! NSString

        return city;

    }

}

外部调用:

CLLocationModule.sharedInstance().GetLatitudeLongitudeAndCity()

(2)强引用

import UIKit

import CoreLocation

class CLLocationModule: NSObject ,CLLocationManagerDelegate{

    var locManager: CLLocationManager!   

    var latitude:Double?

    var longitude:Double?

    var city:NSString?

    

    func GetLatitudeLongitudeAndCity(){        

        if CLLocationManager.locationServicesEnabled() == false {

            print("此设备不能定位")

            return

        }

        locManager = CLLocationManager()        

        locManager.delegate = self        

        locManager.desiredAccuracy = kCLLocationAccuracyBest        

        locManager.distanceFilter = 1000.0       

        //设置定位权限仅ios8有意义

        if IS_IOS8 {

            locManager.requestWhenInUseAuthorization()// 前台定位

            locManager.requestAlwaysAuthorization()

        }      

        locManager.startUpdatingLocation()

    }

    

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

        for location in locations {

            print("纬度:%g",location.coordinate.latitude);            

            print("经度:%g",location.coordinate.longitude);

            latitude = location.coordinate.latitude

            longitude = location.coordinate.longitude            

            self.saveLatitude(latitude!.description)

            self.saveLongitude(longitude!.description)            

            let geocoder: CLGeocoder = CLGeocoder()

            geocoder.reverseGeocodeLocation(location) { (placemarks, error) in

                if error != nil {

                    print("reverse geodcode fail: (error!.localizedDescription)")

                    return

                }

                let pm = placemarks! as [CLPlacemark]

                if (pm.count > 0){

                    for placemark :CLPlacemark in placemarks! {                        

                        let placemarkDict = placemark.addressDictionary

                        let placemarkStr = placemarkDict!["State"]

                        self.city = placemarkStr?.substringToIndex((placemarkStr?.length)!-1)                       

                        self.saveCity(self.city!)

                    }

                }else{

                    print("No Placemarks!")

                }

            }

        }        

        manager.stopUpdatingLocation()

    }

    

    func locationManager(manager:CLLocationManager, didFailWithError error:NSError) {        

        print("locationManager error");        

    }

    

    func saveLatitude(latitude: NSString) {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        defaults.setObject(latitude, forKey: "latitude")

        defaults.synchronize()

    }

    

    func readLatitude() -> NSString {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        let latitude = defaults.objectForKey("latitude") as! NSString

        return latitude;

    }

    

    func saveLongitude(longitude: NSString) {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        defaults.setObject(longitude, forKey: "longitude")

        defaults.synchronize()

    }

    

    func readLongitude() -> NSString {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        let longitude = defaults.objectForKey("longitude") as! NSString

        return longitude;

    }

    

    func saveCity(city: NSString) {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        defaults.setObject(city, forKey: "city")

        defaults.synchronize()

    }

    

    func readCity() -> NSString {

        let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()

        let city = defaults.objectForKey("city") as! NSString

        return city;

    } 

}

外部调用:

var aCLLocationModule = CLLocationModule()

self.aCLLocationModule.GetLatitudeLongitudeAndCity()

 

 

原文地址:https://www.cnblogs.com/huangzs/p/5334130.html