OSSReachabilityManager.m 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. //
  2. // OSSReachabilityManager.m
  3. //
  4. // Created by 亿刀 on 14-1-9.
  5. // Edited by junmo on 15-5-16
  6. // Edited by zhouzhuo on 2016/5/22
  7. // Copyright (c) 2014 Twitter. All rights reserved.
  8. //
  9. #import "OSSReachabilityManager.h"
  10. #import "OSSIPv6Adapter.h"
  11. #import "OSSLog.h"
  12. #import <arpa/inet.h>
  13. #import <CommonCrypto/CommonDigest.h>
  14. #import <CoreTelephony/CTCarrier.h>
  15. #import <CoreTelephony/CTTelephonyNetworkInfo.h>
  16. #import <ifaddrs.h>
  17. #import <netdb.h>
  18. #import <netinet/in.h>
  19. #import <netinet6/in6.h>
  20. #import <sys/socket.h>
  21. #import <SystemConfiguration/CaptiveNetwork.h>
  22. #import <SystemConfiguration/SystemConfiguration.h>
  23. static char *const OSSReachabilityQueueIdentifier = "com.alibaba.oss.network.ReachabilityQueue";
  24. static dispatch_queue_t reachabilityQueue;
  25. static NSString *const CHECK_HOSTNAME = @"www.taobao.com";
  26. @implementation OSSReachabilityManager {
  27. SCNetworkReachabilityRef _reachabilityRef;
  28. }
  29. + (OSSReachabilityManager *)shareInstance
  30. {
  31. static OSSReachabilityManager *s_SPDYNetworkStatusManager = nil;
  32. @synchronized([self class])
  33. {
  34. if (!s_SPDYNetworkStatusManager)
  35. {
  36. s_SPDYNetworkStatusManager = [[OSSReachabilityManager alloc] init];
  37. }
  38. }
  39. return s_SPDYNetworkStatusManager;
  40. }
  41. - (id)init
  42. {
  43. self = [super init];
  44. if (self)
  45. {
  46. _reachabilityRef = SCNetworkReachabilityCreateWithName(NULL, [CHECK_HOSTNAME UTF8String]);
  47. // Start network monitor
  48. [self _startNotifier];
  49. }
  50. return self;
  51. }
  52. - (BOOL)_startNotifier
  53. {
  54. if (!_reachabilityRef)
  55. {
  56. _reachabilityRef = SCNetworkReachabilityCreateWithName(NULL, [CHECK_HOSTNAME UTF8String]);
  57. }
  58. if (_reachabilityRef)
  59. {
  60. SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL};
  61. if(SCNetworkReachabilitySetCallback(_reachabilityRef, ReachabilityCallback, &context))
  62. {
  63. reachabilityQueue = dispatch_queue_create(OSSReachabilityQueueIdentifier, DISPATCH_QUEUE_SERIAL);
  64. SCNetworkReachabilitySetDispatchQueue(_reachabilityRef, reachabilityQueue);
  65. return YES;
  66. }
  67. }
  68. return NO;
  69. }
  70. // Callback of Network change
  71. static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info)
  72. {
  73. if ([[OSSIPv6Adapter getInstance] isIPv6OnlyNetwork]) {
  74. OSSLogDebug(@"[AlicloudReachabilityManager]: Network changed, Pre network status is IPv6-Only.");
  75. } else {
  76. OSSLogDebug(@"[AlicloudReachabilityManager]: Network changed, Pre network status is not IPv6-Only.");
  77. }
  78. [[OSSIPv6Adapter getInstance] reResolveIPv6OnlyStatus];
  79. }
  80. @end