【问题标题】:CoreLocation is null and app crashes on launchCoreLocation 为空,应用程序在启动时崩溃
【发布时间】:2023-12-09 20:08:02
【问题描述】:

这是我从Crashlytics得到的崩溃日志

Crashed: com.apple.main-thread
0                          0x10015e794 specialized AppDelegate.updateloc(String, long : String) -> () (AppDelegate.swift:350)
1                          0x10015e900 specialized AppDelegate.locationManager(CLLocationManager, didUpdateLocations : [CLLocation]) -> () (AppDelegate.swift:281)
2                          0x10015c058 @objc AppDelegate.locationManager(CLLocationManager, didUpdateLocations : [CLLocation]) -> () (AppDelegate.swift)
3  CoreLocation                   0x18961c8b8 (null) + 21836
4  CoreLocation                   0x189618aac (null) + 5952
5  CoreLocation                   0x189612e48 (null) + 880
6  CoreFoundation                 0x18288900c __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 20
7  CoreFoundation                 0x182888944 __CFRunLoopDoBlocks + 308
8  CoreFoundation                 0x182886d8c __CFRunLoopRun + 1960
9  CoreFoundation                 0x1827b0d10 CFRunLoopRunSpecific + 384
10 GraphicsServices               0x184098088 GSEventRunModal + 180
11 UIKit                          0x187a85f70 UIApplicationMain + 204
12                         0x10015c5a0 main (AppDelegate.swift:25)
13 libdispatch.dylib              0x18234e8b8 (Missing)

我在AppDelegate 中使用CLLocationmanager 以便在应用唤醒以进行位置更新时获取用户的位置。

  import UIKit
import FBSDKCoreKit
import FBSDKLoginKit
import Quickblox
import Fabric
import Crashlytics
import CoreLocation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {

    var window: UIWindow?
    var locationManager: CLLocationManager!

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {


            if var options = launchOptions {

                if var _: NSNumber = options[UIApplicationLaunchOptionsLocationKey] as? NSNumber {

                    locationManager.startUpdatingLocation()

                }
            }

        initLocationManager()


        return true
    }

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

            if  let lat = manager.location?.coordinate.latitude,
                let long = manager.location?.coordinate.longitude {

                 //sends to server to update
                updateloc(String(lat), long: String(long))
            }

        }


    func initLocationManager() {
            if (nil == locationManager) {
                locationManager = CLLocationManager()
            }
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            if #available(iOS 9.0, *) {
                locationManager.allowsBackgroundLocationUpdates = true
            }

            let status = CLLocationManager.authorizationStatus()
            if (status == CLAuthorizationStatus.AuthorizedAlways ||  status == CLAuthorizationStatus.AuthorizedWhenInUse) {
                locationManager.startUpdatingLocation()
            }

        }

能帮我一个忙吗?

谢谢。

【问题讨论】:

    标签: ios swift core-location cllocationmanager


    【解决方案1】:

    您需要先调用initLocationManager(),然后才能在locationManager.startUpdatingLocation() 中使用它。 试试

    if var options = launchOptions {
        if options[UIApplicationLaunchOptionsLocationKey] != nil {
            initLocationManager()
            locationManager.startUpdatingLocation()
        }
    }
    

    【讨论】:

    • 您可能还想像我在帖子中所做的那样改进您的UIApplicationLaunchOptionsLocationKey 检查。
    【解决方案2】:

    对于基本的CLLocationManager 集成,您可以通过以下code 进行检查。从你的code 我发现你没有问permission,所以你得到了nil 的价值。

    试试下面的code 可能对你有帮助。

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            // Override point for customization after application launch.
    
    
            self.initLocationManager()
    
            /*
            if var options = launchOptions {
    
                if var _: NSNumber = options[UIApplicationLaunchOptionsLocationKey] as? NSNumber {
                    locationManager.startUpdatingLocation()
                }
            }
            */
    
            return true
        }
    
    
        func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    
            if  let lat = manager.location?.coordinate.latitude,
                let long = manager.location?.coordinate.longitude {
    
                    //sends to server to update
    //                updateloc(String(lat), long: String(long))
            }
    
        }
    
    
        func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    
            if status == CLAuthorizationStatus.AuthorizedAlways {
                locationManager.startUpdatingLocation()
            }
        }
    
    
        func initLocationManager() {
    
            if (nil == locationManager) {
                locationManager = CLLocationManager()
            }
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
    
            if #available(iOS 9.0, *) {
                locationManager.allowsBackgroundLocationUpdates = true
            }
    
            let status = CLLocationManager.authorizationStatus()
    
            if status == CLAuthorizationStatus.NotDetermined {
    
                locationManager.requestAlwaysAuthorization()
    
            }else if (status == CLAuthorizationStatus.AuthorizedAlways ||  status == CLAuthorizationStatus.AuthorizedWhenInUse) {
                locationManager.startUpdatingLocation()
            }
    
        }
    

    【讨论】:

      最近更新 更多