【问题标题】:IPV6 Swift ReachabilityIPV6 Swift 可达性
【发布时间】:2016-09-09 19:58:27
【问题描述】:

我是 swift 和 xcode 的新手,我的应用因 IPV6 而被拒绝:

性能 - 2.1

您的应用在连接到 IPv6 网络的 iPad 和运行 iOS 9.3.5 的 iPhone 上崩溃:

具体来说,当我们点击应用右下角的“更多”按钮时,它会崩溃。

我花了很多时间阅读 ipv6 并得出结论,这可能是我正在使用的可达性类。

我有几个问题,我将如何修改代码以包含 ipv6:

public class Reachability {

    class func isConnectedToNetwork() -> Bool {

        var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
        zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)

        let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
            SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, UnsafePointer($0))

        }

        var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
        if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
            return false
        }

        let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
        let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0        
        return isReachable && !needsConnection

    }
}

因为我使用的是 http 请求,所以我的服务器是否也必须配置为 ipv6?

任何帮助将不胜感激!

崩溃日志:

Incident Identifier: C86A011D-2913-4FFE-992A-0E359781CECD
CrashReporter Key:   ae6778b695dfd22e7ce7236f09740cb14847b427
Hardware Model:      xxx
Process:             Fibre [3135]
Path:                /private/var/containers/Bundle/Application/8F9AF4E2-D64C-4C0C-8BF0-2C8FE63580EA/***
Identifier:          ***
Version:             1 (4.1.5)
Code Type:           ARM-64 (Native)
Parent Process:      launchd [1]

Date/Time:           2016-09-08 17:51:55.55 -0700
Launch Time:         2016-09-08 17:51:52.52 -0700
OS Version:          iOS 9.3.5 (13G36)
Report Version:      105

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x0000000100032b54
Triggered by Thread:  5

Filtered syslog:
None found

Global Trace Buffer (reverse chronological seconds):
6148914686.196010 CFNetwork                 	0x0000000181b0a0a4 NSURLConnection finished with error - code -1003
6148914686.196214 CFNetwork                 	0x0000000181ad5d50 HTTP load failed (error code: -1003 [12:8])
6148914686.196214 CFNetwork                 	0x0000000181a596a8 _CFNetworkIsConnectedToInternet returning 1, flagsValid: 1, flags: 0x2
6148914686.196815 CFNetwork                 	0x0000000181abc184 TCP Conn 0x136fe5290 Failed : error 0:-65554 [-65554]
6148914686.196815 CFNetwork                 	0x0000000181abbe7c TCP Conn 0x136fe5290 complete. fd: -1, err: -65554
6148914686.196982 CFNetwork                 	0x0000000181abd3a8 TCP Conn 0x136fe5290 event 3. err: -65554
6148914686.198890 CFNetwork                 	0x0000000181abd480 TCP Conn 0x136fe5290 started
6148914686.200546 CFNetwork                 	0x0000000181b17e5c Creating default cookie storage with default identifier
6148914686.200546 CFNetwork                 	0x0000000181b17e28 Faulting in CFHTTPCookieStorage singleton
6148914686.200546 CFNetwork                 	0x0000000181b69e50 Faulting in NSHTTPCookieStorage singleton
6148914688.516532 AppleJPEG                 	0x0000000182e9626c [0x13808ee00] Created session



Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0:
0   libsystem_kernel.dylib        	0x0000000180fb4fd8 mach_msg_trap + 8
1   libsystem_kernel.dylib        	0x0000000180fb4e54 mach_msg + 72
2   CoreFoundation                	0x00000001813ecc60 __CFRunLoopServiceMachPort + 196
3   CoreFoundation                	0x00000001813ea964 __CFRunLoopRun + 1032
4   CoreFoundation                	0x0000000181314c50 CFRunLoopRunSpecific + 384
5   GraphicsServices              	0x0000000182bfc088 GSEventRunModal + 180
6   UIKit                         	0x00000001865fa088 UIApplicationMain + 204
7   Fibre                         	0x0000000100020b94 0x100004000 + 117652
8   libdyld.dylib                 	0x0000000180eb28b8 start + 4

Thread 1 name:  Dispatch queue: com.apple.NSURLSession-work
Thread 1:
0   libsystem_kernel.dylib        	0x0000000180fd14d8 kevent_qos + 8
1   libdispatch.dylib             	0x0000000180e944a8 _dispatch_kq_update + 152
2   libdispatch.dylib             	0x0000000180e94404 _dispatch_mgr_wakeup + 48
3   libdispatch.dylib             	0x0000000180e91a40 _dispatch_queue_wakeup_with_qos_slow + 40
4   libdispatch.dylib             	0x0000000180e8d694 _dispatch_queue_drain + 1332
5   libdispatch.dylib             	0x0000000180e84f80 _dispatch_queue_invoke + 464
6   libdispatch.dylib             	0x0000000180e8f390 _dispatch_root_queue_drain + 728
7   libdispatch.dylib             	0x0000000180e8f0b0 _dispatch_worker_thread3 + 112
8   libsystem_pthread.dylib       	0x0000000181099470 _pthread_wqthread + 1092
9   libsystem_pthread.dylib       	0x0000000181099020 start_wqthread + 4

Thread 2 name:  Dispatch queue: com.apple.libdispatch-manager
Thread 2:
0   libdispatch.dylib             	0x0000000180e96b84 _dispatch_source_kevent_unregister + 316
1   libdispatch.dylib             	0x0000000180e8390c _dispatch_source_invoke + 708
2   libdispatch.dylib             	0x0000000180e8390c _dispatch_source_invoke + 708
3   libdispatch.dylib             	0x0000000180e8d694 _dispatch_queue_drain + 1332
4   libdispatch.dylib             	0x0000000180e8dcd8 _dispatch_mgr_queue_drain + 44
5   libdispatch.dylib             	0x0000000180e94734 _dispatch_mgr_invoke + 68
6   libdispatch.dylib             	0x0000000180e83648 _dispatch_source_invoke + 0

Thread 3:
0   libsystem_kernel.dylib        	0x0000000180fd0b48 __workq_kernreturn + 8
1   libsystem_pthread.dylib       	0x0000000181099530 _pthread_wqthread + 1284
2   libsystem_pthread.dylib       	0x0000000181099020 start_wqthread + 4

Thread 4:
0   libsystem_kernel.dylib        	0x0000000180fd0b48 __workq_kernreturn + 8
1   libsystem_pthread.dylib       	0x0000000181099530 _pthread_wqthread + 1284
2   libsystem_pthread.dylib       	0x0000000181099020 start_wqthread + 4

Thread 5 name:  Dispatch queue: NSOperationQueue 0x136f35cc0 :: NSOperation 0x136fe3590 (QOS: LEGACY)
Thread 5 Crashed:
0   Fibre                         	0x0000000100032b54 0x100004000 + 191316
1   CFNetwork                     	0x0000000181a965ac __67+[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]_block_invoke_2 + 180
2   Foundation                    	0x0000000181df0540 __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 16
3   Foundation                    	0x0000000181d42870 -[NSBlockOperation main] + 96
4   Foundation                    	0x0000000181d32e48 -[__NSOperationInternal _start:] + 604
5   Foundation                    	0x0000000181df2934 __NSOQSchedule_f + 224
6   libdispatch.dylib             	0x0000000180e8147c _dispatch_client_callout + 16
7   libdispatch.dylib             	0x0000000180e8d4c0 _dispatch_queue_drain + 864
8   libdispatch.dylib             	0x0000000180e84f80 _dispatch_queue_invoke + 464
9   libdispatch.dylib             	0x0000000180e8f390 _dispatch_root_queue_drain + 728
10  libdispatch.dylib             	0x0000000180e8f0b0 _dispatch_worker_thread3 + 112
11  libsystem_pthread.dylib       	0x0000000181099470 _pthread_wqthread + 1092
12  libsystem_pthread.dylib       	0x0000000181099020 start_wqthread + 4

Thread 6:
0   libsystem_kernel.dylib        	0x0000000180fd0b48 __workq_kernreturn + 8
1   libsystem_pthread.dylib       	0x0000000181099530 _pthread_wqthread + 1284
2   libsystem_pthread.dylib       	0x0000000181099020 start_wqthread + 4

Thread 7:
0   libsystem_kernel.dylib        	0x0000000180fd0b48 __workq_kernreturn + 8
1   libsystem_pthread.dylib       	0x0000000181099530 _pthread_wqthread + 1284
2   libsystem_pthread.dylib       	0x0000000181099020 start_wqthread + 4

Thread 8:
0   libsystem_kernel.dylib        	0x0000000180fd0b48 __workq_kernreturn + 8
1   libsystem_pthread.dylib       	0x0000000181099530 _pthread_wqthread + 1284
2   libsystem_pthread.dylib       	0x0000000181099020 start_wqthread + 4

Thread 9 name:  com.apple.NSURLConnectionLoader
Thread 9:
0   libsystem_kernel.dylib        	0x0000000180fb4fd8 mach_msg_trap + 8
1   libsystem_kernel.dylib        	0x0000000180fb4e54 mach_msg + 72
2   CoreFoundation                	0x00000001813ecc60 __CFRunLoopServiceMachPort + 196
3   CoreFoundation                	0x00000001813ea964 __CFRunLoopRun + 1032
4   CoreFoundation                	0x0000000181314c50 CFRunLoopRunSpecific + 384
5   CFNetwork                     	0x0000000181a95bcc +[NSURLConnection(Loader) _resourceLoadLoop:] + 412
6   Foundation                    	0x0000000181e0be4c __NSThread__start__ + 1000
7   libsystem_pthread.dylib       	0x000000018109bb28 _pthread_body + 156
8   libsystem_pthread.dylib       	0x000000018109ba8c _pthread_body + 0
9   libsystem_pthread.dylib       	0x0000000181099028 thread_start + 4

Thread 5 crashed with ARM Thread State (64-bit):
    x0: 0x0000000000000000   x1: 0x0000000000000000   x2: 0x0000000136db3890   x3: 0x0000000136f6dda0
    x4: 0x0000000100039250   x5: 0x0000000000000001   x6: 0x0000000000000000   x7: 0x0000000000000a30
    x8: 0x0000000136fd58f8   x9: 0x0000000000000004  x10: 0x0000000000000000  x11: 0x0000000000000000
   x12: 0x0000000137091190  x13: 0x000005a1001e9247  x14: 0x00000000ffffffff  x15: 0x00000000ffffffff
   x16: 0x00000001003ec47c  x17: 0x0000000186e3db68  x18: 0x0000000000000000  x19: 0x0000000000000000
   x20: 0x0000000136db3890  x21: 0x0000000000000000  x22: 0x0000000136fe5b50  x23: 0x0000000136f6dda0
   x24: 0x8e00a063ef134017  x25: 0x00000000000000d8  x26: 0x0000000000020001  x27: 0x00000000240008ff
   x28: 0x0000000000010001  fp: 0x000000016e246a00   lr: 0x0000000181a965ac
    sp: 0x000000016e246980   pc: 0x0000000100032b54 cpsr: 0x20000000

Binary Images:
0x100004000 - 0x100193fff Fibre arm64  <a3baaae1e0f93363a87211e3e15a394e> /var/containers/Bundle/Application/8F9AF4E2-D64C-4C0C-8BF0-2C8FE63580EA/Fibre.app/Fibre
0x10021c000 - 0x10041bfff libswiftCore.dylib arm64  <39ceee8206bb32809dab8ecba2e05d8e> /var/containers/Bundle/Application/8F9AF4E2-D64C-4C0C-8BF0-2C8FE63580EA/Fibre.app/Frameworks/libswiftCore.dylib
   

【问题讨论】:

  • Apple 应该已经向您发送了崩溃日志。一旦符号化,您将知道导致崩溃的确切代码行。无需花一天时间做任何研究。苹果并没有说你的应用因为 IPv6 而被拒绝。它被拒绝了,因为它崩溃了。使用崩溃日志了解实际原因。
  • 你好,我已经添加了崩溃日志,如果你能看一下就好了:)
  • 你需要发布一个符号化的崩溃日志。

标签: ios swift ipv6


【解决方案1】:

从拒绝通知中可以看出,您的问题源于对纯 IPv6 和其他现代网络拓扑不再有效的假设。这里有两个步骤可以前进......

  1. 在建立连接之前不要使用可达性“预检”。来自 Apple 的guide to supporting modern networks

Reachability API(请参阅SCNetworkReachability Reference)用于识别连接问题后进行诊断。许多应用程序错误地使用这些 API 来主动检查 Internet 连接,方法是调用 SCNetworkReachabilityCreateWithAddress 方法并向其传递 IPv4 地址 0.0.0.0,这表明网络上有路由器。但是,存在路由器并不能保证存在 Internet 连接。一般来说,避免预检网络可达性。只需尝试建立连接并优雅地处理故障。如果您必须检查网络可用性,请避免调用SCNetworkReachabilityCreateWithAddress 方法。调用SCNetworkReachabilityCreateWithName 方法并改为传递一个主机名。

一些应用程序还会通过SCNetworkReachabilityCreateWithAddress 方法传递一个169.254.0.0 的IPv4 地址,一个自分配的本地链接地址,以检查活动的Wi-Fi 连接。要检查 Wi-Fi 或蜂窝网络连接,请查找网络可达性标志 kSCNetworkReachabilityFlagsIsWWAN

  1. 使用纯 IPv6 网络测试,然后再提交到 App Store。您可以set up a NAT64 gateway on your development Mac 创建一个纯 IPv6 网络供您的测试设备使用。

在上述链接和WWDC16 session 714, "Networking for the Modern Internet" 中有更多关于支持 IPv6 和现代网络的好建议。

【讨论】:

  • 没有证据表明 IPv6 与 OP 的问题有关。苹果表示,当点击“更多”按钮时,应用程序会崩溃。需要查看崩溃日志以了解实际原因。
  • 1.引用的拒绝通知说,当按下“更多”按钮连接到仅 IPv6 的网络时会出现崩溃。 2. 正如我引用/链接的文档中所述,使用可达性检查与0.0.0.0 的连接在 IPv6 网络上是有问题的,而这正是@mattblack 的代码正在做的事情。诚然,您可以通过更强大地使用 Reachability 来修复 crash,但可能不是 rejection,因为仍然有可能做错事(并且在IPv6 网络)而不会崩溃。
  • @rickster:这也是我的第一个想法,但根据developer.apple.com/library/ios/samplecode/Reachability/…:reachabilityForInternetConnection:“它监控地址0.0.0.0,可达性将其视为特殊令牌,使其实际监控设备的一般路由状态,包括 IPv4 和 IPv6。” – 但也许这在 IPv6 only 网络中不起作用,我目前无法测试它。
  • 很好,@MartinR — Apple 的开发人员消息在这里似乎不一致,至少在如何 使用可达性方面。 (这值得filing a bug。)但是,关于 when 使用 Reachability 的消息更加清晰:不要使用它来预检连接,这正是 OP 似乎正在做的事情。
  • @rickster:当然。 – 另一方面,应用程序可能希望显示一般的“连接”状态,独立于目标主机。
【解决方案2】:

几天前我得到了同样的拒绝原因,在这里查看了其他一些问题/答案后,其中一个答案解决了这个问题:将 AF_INET 的每个实例更新为 AF_INET6 ...在此之后,我的应用程序通过并且是可在 AppStore 中获得

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多