App crashes on Launch in Airplane Mode

1.3k Views Asked by At

I am currently using Ashley Mill's Reachability Class. If the application launches with network connectivity then I am able to toggle between connectivity availability without any issues and able to display a network connectivity Alert Controller properly. However if the application is launched when the app starts without internet connection/on airplane mode it abruptly crashes.

override func viewDidLoad()
{
    super.viewDidLoad()

    setUpReachability (nil)
}

func setUpReachability(hostName: String?)
{
    do
    {
        let  reachability = try hostName == nil ? Reachability.reachabilityForInternetConnection() : Reachability(hostname: hostName!)
        self.reachability = reachability
        try! self.reachability?.startNotifier()
    }
    catch ReachabilityError.FailedToCreateWithAddress(let address)
    {
        print("\(address)")
        return
    } catch {}

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.reachabilityChanged(_:)), name: ReachabilityChangedNotification, object: reachability)
}

func reachabilityChanged(notification: NSNotification)
{
    let reachability = notification.object as! Reachability

    if  reachability.isReachable()
    {
        if reachability.isReachableViaWiFi()
        {
            connected = true
        }
        else
        {
            connected = true
        }
    }
    else
    {
        let alert = UIAlertController( title: "No Network Connection Available", message:"Try Again", preferredStyle: .Alert)
        alert.addAction(UIAlertAction( title: "Will Do!"  , style: .Default) { _ in } )
        presentViewController        ( alert, animated: true               ) {}
        connected = false
    }
}

What can be done to allow the iPhone application to launch and display an alert saying there is no network connection rather than abruptly crash?

Error Message:

fatal error: unexpectedly found nil while unwrapping an Optional value

But I would think that reachability changed would catch this in the else statement and pop the error message up?

enter image description here

2

There are 2 best solutions below

1
On

Shouldn't the else in the reachability.isReachableViaWiFi() if statement be:connected = false ?

0
On

The error was that I was in fact trying to download data at the launch of the app instead of first allowing the initialization of the app to finish to then send a request to the server to access information.