Reachability iOS 10.1 with IPv6 network

Our app has been rejected 4 times cause we show an alert saying "Hey, you don't have an internet connection" when instaed the device is connected to a IPv6 network.

The problem is that we don't have any reachability problem during tests. We've also followed Technical Q&A QA1764 but everything works.

It couldn't be a server-side problem cause at this point we' not made any http request yet.


We’ve replaced our Reachability pod with the Reachbility files written in Obj C we’ve found in Apple’s documentation and this is our code


Do you see some mistakes?


AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?
  var internetCheck: Reachability?

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
       // MARK: - Reachability
       NotificationCenter.default.addObserver(self, selector: #selector(AppDelegate.reachabilityChanged(notification:)), name: NSNotification.Name.reachabilityChanged, object: nil)
       internetCheck = Reachability.forInternetConnection()
       internetCheck!.startNotifier()
       statusChangedWithReachability(currentReachabilityStatus: internetCheck!)
  }

  func applicationDidEnterBackground(_ application: UIApplication) {
        internetCheck!.stopNotifier()
    }

  func applicationWillTerminate(_ application: UIApplication) {
       NotificationCenter.default.removeObserver(self, name: NSNotification.Name.reachabilityChanged, object: nil)
  }

  //- - -
  // MARK: - Reachability
  //- - -

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

  func statusChangedWithReachability(currentReachabilityStatus: Reachability) {
     let networkStatus: NetworkStatus = currentReachabilityStatus.currentReachabilityStatus()

     switch networkStatus.rawValue {
     case NotReachable.rawValue:


     // MARK: - START Reachibility Pop-Up Alert
         reachabilityStatus = NOACCESS
         if let vc = UIApplication.shared.keyWindow?.topController() {
             print("- - - AppDelegate.reachability.whenUnreachable: VC - - -")
             AlertManager.noInternetConnection(viewController: vc)
         } else {
             print("- - - AppDelegate.reachability.whenUnreachable: NIL - - -")
             AlertManager.noInternetConnection(viewController: nil)
         }
     // MARK: - END Reachibility Pop-Up Alert

     case ReachableViaWiFi.rawValue: reachabilityStatus = WIFI
     case ReachableViaWWAN.rawValue: reachabilityStatus = WWAN
     default: return
     }

     NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ReachStatusChanged"), object: nil)
  }
}

Replies

I don’t know what’s causing your specific problem but you seem to have the wrong end of the reachability stick here. In general you shouldn’t use reachability to ‘preflight’ requests. Rather, you should make the request and then, if something goes wrong, use reachability to help the user recover (guiding the user as to what went wrong, triggering automatic retries when reachability changes, and so on). This has a couple of important consequences:

  • It’s rare to ever need

    Reachability.forInternetConnection()
    because, if a request has failed, you know the destination of that request, and thus can create a specific reachability query with that destination.
  • You don’t ever post error alerts based solely on a reachability query. Rather, you post the alert based on a specific network failure and then supplement that with information from reachability.

Share and Enjoy

Quinn “The Eskimo!”
Apple Developer Relations, Developer Technical Support, Core OS/Hardware

let myEmail = "eskimo" + "1" + "@apple.com"