From f2722851933d44355f676a2f330b1e440f6d5de5 Mon Sep 17 00:00:00 2001 From: Gerrit Linnemann Date: Wed, 30 Oct 2013 11:25:23 +0100 Subject: [PATCH] =?UTF-8?q?Netzwerk-Verf=C3=BCgbarkeit=20wird=20nun=20gete?= =?UTF-8?q?stet.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ipbc-Client.xcodeproj/project.pbxproj | 10 + .../UserInterfaceState.xcuserstate | Bin 17179 -> 20742 bytes .../WorkspaceSettings.xcsettings | 10 + ipbc-Client/ipbc-Client/Reachability.h | 109 ++++ ipbc-Client/ipbc-Client/Reachability.m | 527 ++++++++++++++++++ ipbc-Client/ipbc-Client/WebServiceConstants.h | 1 + ipbc-Client/ipbc-Client/WebServiceConstants.m | 1 + ipbc-Client/ipbc-Client/WebserviceClient.h | 2 + ipbc-Client/ipbc-Client/WebserviceClient.m | 31 +- 9 files changed, 689 insertions(+), 2 deletions(-) create mode 100644 ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcuserdata/gerrit.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 ipbc-Client/ipbc-Client/Reachability.h create mode 100644 ipbc-Client/ipbc-Client/Reachability.m diff --git a/ipbc-Client/ipbc-Client.xcodeproj/project.pbxproj b/ipbc-Client/ipbc-Client.xcodeproj/project.pbxproj index 2acc9ce..a736d7d 100644 --- a/ipbc-Client/ipbc-Client.xcodeproj/project.pbxproj +++ b/ipbc-Client/ipbc-Client.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + ECB32E3718210D1D00D3C886 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = ECB32E3618210D1D00D3C886 /* Reachability.m */; }; + ECB32E3918210F3A00D3C886 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ECB32E3818210F3A00D3C886 /* SystemConfiguration.framework */; }; ECE5811B181A77090066D073 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ECE5811A181A77090066D073 /* Cocoa.framework */; }; ECE58125181A77090066D073 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = ECE58123181A77090066D073 /* InfoPlist.strings */; }; ECE58127181A77090066D073 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ECE58126181A77090066D073 /* main.m */; }; @@ -33,6 +35,9 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + ECB32E3518210D1D00D3C886 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = ""; }; + ECB32E3618210D1D00D3C886 /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = ""; }; + ECB32E3818210F3A00D3C886 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; ECE58117181A77090066D073 /* ipbc-Client.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ipbc-Client.app"; sourceTree = BUILT_PRODUCTS_DIR; }; ECE5811A181A77090066D073 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; ECE5811D181A77090066D073 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; @@ -63,6 +68,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + ECB32E3918210F3A00D3C886 /* SystemConfiguration.framework in Frameworks */, ECE5811B181A77090066D073 /* Cocoa.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -101,6 +107,7 @@ ECE58119181A77090066D073 /* Frameworks */ = { isa = PBXGroup; children = ( + ECB32E3818210F3A00D3C886 /* SystemConfiguration.framework */, ECE5811A181A77090066D073 /* Cocoa.framework */, ECE58139181A77090066D073 /* XCTest.framework */, ECE5811C181A77090066D073 /* Other Frameworks */, @@ -168,6 +175,8 @@ ECE6FED5181E8AFD004F6C1F /* WebserviceClient.m */, ECE6FED8181E8BE4004F6C1F /* WebServiceConstants.h */, ECE6FED9181E8BE4004F6C1F /* WebServiceConstants.m */, + ECB32E3518210D1D00D3C886 /* Reachability.h */, + ECB32E3618210D1D00D3C886 /* Reachability.m */, ); name = WebService; sourceTree = ""; @@ -278,6 +287,7 @@ ECE5812E181A77090066D073 /* ipbcAppDelegate.m in Sources */, ECE58127181A77090066D073 /* main.m in Sources */, ECE6FED6181E8AFE004F6C1F /* WebserviceClient.m in Sources */, + ECB32E3718210D1D00D3C886 /* Reachability.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcuserdata/gerrit.xcuserdatad/UserInterfaceState.xcuserstate b/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcuserdata/gerrit.xcuserdatad/UserInterfaceState.xcuserstate index 1f6d2aa49a9934b7bb5308079662142a62162ae3..afe339d527f83606aba95b39e78b373aa87f7b29 100644 GIT binary patch delta 12179 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 KKO25CJO3Y4ZR|4u diff --git a/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcuserdata/gerrit.xcuserdatad/WorkspaceSettings.xcsettings b/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcuserdata/gerrit.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..659c876 --- /dev/null +++ b/ipbc-Client/ipbc-Client.xcodeproj/project.xcworkspace/xcuserdata/gerrit.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/ipbc-Client/ipbc-Client/Reachability.h b/ipbc-Client/ipbc-Client/Reachability.h new file mode 100644 index 0000000..5579169 --- /dev/null +++ b/ipbc-Client/ipbc-Client/Reachability.h @@ -0,0 +1,109 @@ +/* + Copyright (c) 2011, Tony Million. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#import +#import + +#import +#import +#import +#import +#import +#import + +/** + * Does ARC support GCD objects? + * It does if the minimum deployment target is iOS 6+ or Mac OS X 8+ + * + * @see http://opensource.apple.com/source/libdispatch/libdispatch-228.18/os/object.h + **/ +#if OS_OBJECT_USE_OBJC +#define NEEDS_DISPATCH_RETAIN_RELEASE 0 +#else +#define NEEDS_DISPATCH_RETAIN_RELEASE 1 +#endif + +/** + * Create NS_ENUM macro if it does not exist on the targeted version of iOS or OS X. + * + * @see http://nshipster.com/ns_enum-ns_options/ + **/ +#ifndef NS_ENUM +#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type +#endif + +extern NSString *const kReachabilityChangedNotification; + +typedef NS_ENUM(NSInteger, NetworkStatus) { + // Apple NetworkStatus Compatible Names. + NotReachable = 0, + ReachableViaWiFi = 2, + ReachableViaWWAN = 1 +}; + +@class Reachability; + +typedef void (^NetworkReachable)(Reachability * reachability); +typedef void (^NetworkUnreachable)(Reachability * reachability); + +@interface Reachability : NSObject + +@property (nonatomic, copy) NetworkReachable reachableBlock; +@property (nonatomic, copy) NetworkUnreachable unreachableBlock; + + +@property (nonatomic, assign) BOOL reachableOnWWAN; + ++(Reachability*)reachabilityWithHostname:(NSString*)hostname; ++(Reachability*)reachabilityForInternetConnection; ++(Reachability*)reachabilityWithAddress:(const struct sockaddr_in*)hostAddress; ++(Reachability*)reachabilityForLocalWiFi; + +-(Reachability *)initWithReachabilityRef:(SCNetworkReachabilityRef)ref; + +-(BOOL)startNotifier; +-(void)stopNotifier; + +-(BOOL)isReachable; +-(BOOL)isReachableViaWWAN; +-(BOOL)isReachableViaWiFi; + +// WWAN may be available, but not active until a connection has been established. +// WiFi may require a connection for VPN on Demand. +-(BOOL)isConnectionRequired; // Identical DDG variant. +-(BOOL)connectionRequired; // Apple's routine. +// Dynamic, on demand connection? +-(BOOL)isConnectionOnDemand; +// Is user intervention required? +-(BOOL)isInterventionRequired; + +-(NetworkStatus)currentReachabilityStatus; +-(SCNetworkReachabilityFlags)reachabilityFlags; +-(NSString*)currentReachabilityString; +-(NSString*)currentReachabilityFlags; + +@end diff --git a/ipbc-Client/ipbc-Client/Reachability.m b/ipbc-Client/ipbc-Client/Reachability.m new file mode 100644 index 0000000..de91694 --- /dev/null +++ b/ipbc-Client/ipbc-Client/Reachability.m @@ -0,0 +1,527 @@ +/* + Copyright (c) 2011, Tony Million. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + */ + +#import "Reachability.h" + + +NSString *const kReachabilityChangedNotification = @"kReachabilityChangedNotification"; + +@interface Reachability () + +@property (nonatomic, assign) SCNetworkReachabilityRef reachabilityRef; + + +#if NEEDS_DISPATCH_RETAIN_RELEASE +@property (nonatomic, assign) dispatch_queue_t reachabilitySerialQueue; +#else +@property (nonatomic, strong) dispatch_queue_t reachabilitySerialQueue; +#endif + + +@property (nonatomic, strong) id reachabilityObject; + +-(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags; +-(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags; + +@end + +static NSString *reachabilityFlags(SCNetworkReachabilityFlags flags) +{ + return [NSString stringWithFormat:@"%c%c %c%c%c%c%c%c%c", +#if TARGET_OS_IPHONE + (flags & kSCNetworkReachabilityFlagsIsWWAN) ? 'W' : '-', +#else + 'X', +#endif + (flags & kSCNetworkReachabilityFlagsReachable) ? 'R' : '-', + (flags & kSCNetworkReachabilityFlagsConnectionRequired) ? 'c' : '-', + (flags & kSCNetworkReachabilityFlagsTransientConnection) ? 't' : '-', + (flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-', + (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) ? 'C' : '-', + (flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ? 'D' : '-', + (flags & kSCNetworkReachabilityFlagsIsLocalAddress) ? 'l' : '-', + (flags & kSCNetworkReachabilityFlagsIsDirect) ? 'd' : '-']; +} + +// Start listening for reachability notifications on the current run loop +static void TMReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info) +{ +#pragma unused (target) +#if __has_feature(objc_arc) + Reachability *reachability = ((__bridge Reachability*)info); +#else + Reachability *reachability = ((Reachability*)info); +#endif + + // We probably don't need an autoreleasepool here, as GCD docs state each queue has its own autorelease pool, + // but what the heck eh? + @autoreleasepool + { + [reachability reachabilityChanged:flags]; + } +} + + +@implementation Reachability + +@synthesize reachabilityRef; +@synthesize reachabilitySerialQueue; + +@synthesize reachableOnWWAN; + +@synthesize reachableBlock; +@synthesize unreachableBlock; + +@synthesize reachabilityObject; + +#pragma mark - Class Constructor Methods + ++(Reachability*)reachabilityWithHostName:(NSString*)hostname +{ + return [Reachability reachabilityWithHostname:hostname]; +} + ++(Reachability*)reachabilityWithHostname:(NSString*)hostname +{ + SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(NULL, [hostname UTF8String]); + if (ref) + { + id reachability = [[self alloc] initWithReachabilityRef:ref]; + +#if __has_feature(objc_arc) + return reachability; +#else + return [reachability autorelease]; +#endif + + } + + return nil; +} + ++(Reachability *)reachabilityWithAddress:(const struct sockaddr_in *)hostAddress +{ + SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)hostAddress); + if (ref) + { + id reachability = [[self alloc] initWithReachabilityRef:ref]; + +#if __has_feature(objc_arc) + return reachability; +#else + return [reachability autorelease]; +#endif + } + + return nil; +} + ++(Reachability *)reachabilityForInternetConnection +{ + struct sockaddr_in zeroAddress; + bzero(&zeroAddress, sizeof(zeroAddress)); + zeroAddress.sin_len = sizeof(zeroAddress); + zeroAddress.sin_family = AF_INET; + + return [self reachabilityWithAddress:&zeroAddress]; +} + ++(Reachability*)reachabilityForLocalWiFi +{ + struct sockaddr_in localWifiAddress; + bzero(&localWifiAddress, sizeof(localWifiAddress)); + localWifiAddress.sin_len = sizeof(localWifiAddress); + localWifiAddress.sin_family = AF_INET; + // IN_LINKLOCALNETNUM is defined in as 169.254.0.0 + localWifiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM); + + return [self reachabilityWithAddress:&localWifiAddress]; +} + + +// Initialization methods + +-(Reachability *)initWithReachabilityRef:(SCNetworkReachabilityRef)ref +{ + self = [super init]; + if (self != nil) + { + self.reachableOnWWAN = YES; + self.reachabilityRef = ref; + } + + return self; +} + +-(void)dealloc +{ + [self stopNotifier]; + + if(self.reachabilityRef) + { + CFRelease(self.reachabilityRef); + self.reachabilityRef = nil; + } + + self.reachableBlock = nil; + self.unreachableBlock = nil; + +#if !(__has_feature(objc_arc)) + [super dealloc]; +#endif + + +} + +#pragma mark - Notifier Methods + +// Notifier +// NOTE: This uses GCD to trigger the blocks - they *WILL NOT* be called on THE MAIN THREAD +// - In other words DO NOT DO ANY UI UPDATES IN THE BLOCKS. +// INSTEAD USE dispatch_async(dispatch_get_main_queue(), ^{UISTUFF}) (or dispatch_sync if you want) + +-(BOOL)startNotifier +{ + SCNetworkReachabilityContext context = { 0, NULL, NULL, NULL, NULL }; + + // this should do a retain on ourself, so as long as we're in notifier mode we shouldn't disappear out from under ourselves + // woah + self.reachabilityObject = self; + + + + // First, we need to create a serial queue. + // We allocate this once for the lifetime of the notifier. + self.reachabilitySerialQueue = dispatch_queue_create("com.tonymillion.reachability", NULL); + if(!self.reachabilitySerialQueue) + { + return NO; + } + +#if __has_feature(objc_arc) + context.info = (__bridge void *)self; +#else + context.info = (void *)self; +#endif + + if (!SCNetworkReachabilitySetCallback(self.reachabilityRef, TMReachabilityCallback, &context)) + { +#ifdef DEBUG + NSLog(@"SCNetworkReachabilitySetCallback() failed: %s", SCErrorString(SCError())); +#endif + + // Clear out the dispatch queue + if(self.reachabilitySerialQueue) + { +#if NEEDS_DISPATCH_RETAIN_RELEASE + dispatch_release(self.reachabilitySerialQueue); +#endif + self.reachabilitySerialQueue = nil; + } + + self.reachabilityObject = nil; + + return NO; + } + + // Set it as our reachability queue, which will retain the queue + if(!SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, self.reachabilitySerialQueue)) + { +#ifdef DEBUG + NSLog(@"SCNetworkReachabilitySetDispatchQueue() failed: %s", SCErrorString(SCError())); +#endif + + // UH OH - FAILURE! + + // First stop, any callbacks! + SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL); + + // Then clear out the dispatch queue. + if(self.reachabilitySerialQueue) + { +#if NEEDS_DISPATCH_RETAIN_RELEASE + dispatch_release(self.reachabilitySerialQueue); +#endif + self.reachabilitySerialQueue = nil; + } + + self.reachabilityObject = nil; + + return NO; + } + + return YES; +} + +-(void)stopNotifier +{ + // First stop, any callbacks! + SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL); + + // Unregister target from the GCD serial dispatch queue. + SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, NULL); + + if(self.reachabilitySerialQueue) + { +#if NEEDS_DISPATCH_RETAIN_RELEASE + dispatch_release(self.reachabilitySerialQueue); +#endif + self.reachabilitySerialQueue = nil; + } + + self.reachabilityObject = nil; +} + +#pragma mark - reachability tests + +// This is for the case where you flick the airplane mode; +// you end up getting something like this: +//Reachability: WR ct----- +//Reachability: -- ------- +//Reachability: WR ct----- +//Reachability: -- ------- +// We treat this as 4 UNREACHABLE triggers - really apple should do better than this + +#define testcase (kSCNetworkReachabilityFlagsConnectionRequired | kSCNetworkReachabilityFlagsTransientConnection) + +-(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags +{ + BOOL connectionUP = YES; + + if(!(flags & kSCNetworkReachabilityFlagsReachable)) + connectionUP = NO; + + if( (flags & testcase) == testcase ) + connectionUP = NO; + +#if TARGET_OS_IPHONE + if(flags & kSCNetworkReachabilityFlagsIsWWAN) + { + // We're on 3G. + if(!self.reachableOnWWAN) + { + // We don't want to connect when on 3G. + connectionUP = NO; + } + } +#endif + + return connectionUP; +} + +-(BOOL)isReachable +{ + SCNetworkReachabilityFlags flags; + + if(!SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) + return NO; + + return [self isReachableWithFlags:flags]; +} + +-(BOOL)isReachableViaWWAN +{ +#if TARGET_OS_IPHONE + + SCNetworkReachabilityFlags flags = 0; + + if(SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) + { + // Check we're REACHABLE + if(flags & kSCNetworkReachabilityFlagsReachable) + { + // Now, check we're on WWAN + if(flags & kSCNetworkReachabilityFlagsIsWWAN) + { + return YES; + } + } + } +#endif + + return NO; +} + +-(BOOL)isReachableViaWiFi +{ + SCNetworkReachabilityFlags flags = 0; + + if(SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) + { + // Check we're reachable + if((flags & kSCNetworkReachabilityFlagsReachable)) + { +#if TARGET_OS_IPHONE + // Check we're NOT on WWAN + if((flags & kSCNetworkReachabilityFlagsIsWWAN)) + { + return NO; + } +#endif + return YES; + } + } + + return NO; +} + + +// WWAN may be available, but not active until a connection has been established. +// WiFi may require a connection for VPN on Demand. +-(BOOL)isConnectionRequired +{ + return [self connectionRequired]; +} + +-(BOOL)connectionRequired +{ + SCNetworkReachabilityFlags flags; + + if(SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) + { + return (flags & kSCNetworkReachabilityFlagsConnectionRequired); + } + + return NO; +} + +// Dynamic, on demand connection? +-(BOOL)isConnectionOnDemand +{ + SCNetworkReachabilityFlags flags; + + if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) + { + return ((flags & kSCNetworkReachabilityFlagsConnectionRequired) && + (flags & (kSCNetworkReachabilityFlagsConnectionOnTraffic | kSCNetworkReachabilityFlagsConnectionOnDemand))); + } + + return NO; +} + +// Is user intervention required? +-(BOOL)isInterventionRequired +{ + SCNetworkReachabilityFlags flags; + + if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) + { + return ((flags & kSCNetworkReachabilityFlagsConnectionRequired) && + (flags & kSCNetworkReachabilityFlagsInterventionRequired)); + } + + return NO; +} + + +#pragma mark - reachability status stuff + +-(NetworkStatus)currentReachabilityStatus +{ + if([self isReachable]) + { + if([self isReachableViaWiFi]) + return ReachableViaWiFi; + +#if TARGET_OS_IPHONE + return ReachableViaWWAN; +#endif + } + + return NotReachable; +} + +-(SCNetworkReachabilityFlags)reachabilityFlags +{ + SCNetworkReachabilityFlags flags = 0; + + if(SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) + { + return flags; + } + + return 0; +} + +-(NSString*)currentReachabilityString +{ + NetworkStatus temp = [self currentReachabilityStatus]; + + if(temp == reachableOnWWAN) + { + // Updated for the fact that we have CDMA phones now! + return NSLocalizedString(@"Cellular", @""); + } + if (temp == ReachableViaWiFi) + { + return NSLocalizedString(@"WiFi", @""); + } + + return NSLocalizedString(@"No Connection", @""); +} + +-(NSString*)currentReachabilityFlags +{ + return reachabilityFlags([self reachabilityFlags]); +} + +#pragma mark - Callback function calls this method + +-(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags +{ + if([self isReachableWithFlags:flags]) + { + if(self.reachableBlock) + { + self.reachableBlock(self); + } + } + else + { + if(self.unreachableBlock) + { + self.unreachableBlock(self); + } + } + + // this makes sure the change notification happens on the MAIN THREAD + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification + object:self]; + }); +} + +#pragma mark - Debug Description + +- (NSString *) description +{ + NSString *description = [NSString stringWithFormat:@"<%@: %#x>", + NSStringFromClass([self class]), (unsigned int) self]; + return description; +} + +@end diff --git a/ipbc-Client/ipbc-Client/WebServiceConstants.h b/ipbc-Client/ipbc-Client/WebServiceConstants.h index 613a706..637fe57 100644 --- a/ipbc-Client/ipbc-Client/WebServiceConstants.h +++ b/ipbc-Client/ipbc-Client/WebServiceConstants.h @@ -10,6 +10,7 @@ @interface WebServiceConstants : NSObject +extern NSString * const WS_BASE; extern NSString * const WS_RESOURCE; extern NSString * const WS_GET_USERS_IP_SERVICE; diff --git a/ipbc-Client/ipbc-Client/WebServiceConstants.m b/ipbc-Client/ipbc-Client/WebServiceConstants.m index c4c842c..76f1237 100644 --- a/ipbc-Client/ipbc-Client/WebServiceConstants.m +++ b/ipbc-Client/ipbc-Client/WebServiceConstants.m @@ -10,6 +10,7 @@ @implementation WebServiceConstants +NSString * const WS_BASE = @"www.ip-bc.org"; NSString * const WS_RESOURCE = @"http://www.ip-bc.org/ws/update/ip"; NSString * const WS_GET_USERS_IP_SERVICE = @"http://www.ip-bc.org/ws/info/ip"; diff --git a/ipbc-Client/ipbc-Client/WebserviceClient.h b/ipbc-Client/ipbc-Client/WebserviceClient.h index 54200a8..b54d2aa 100644 --- a/ipbc-Client/ipbc-Client/WebserviceClient.h +++ b/ipbc-Client/ipbc-Client/WebserviceClient.h @@ -12,8 +12,10 @@ NSTimer *updateTimer; NSString *usersIPv4; + BOOL isNetworkAvailable; } -(BOOL)updateDomain; +-(void)checkNetworkAvailability; @end diff --git a/ipbc-Client/ipbc-Client/WebserviceClient.m b/ipbc-Client/ipbc-Client/WebserviceClient.m index 95b883e..3cc6aa1 100644 --- a/ipbc-Client/ipbc-Client/WebserviceClient.m +++ b/ipbc-Client/ipbc-Client/WebserviceClient.m @@ -8,6 +8,7 @@ #import "WebserviceClient.h" #import "WebServiceConstants.h" +#import "Reachability.h" @implementation WebserviceClient @@ -17,10 +18,15 @@ selector: @selector(tick:) userInfo: nil repeats: YES]; + + isNetworkAvailable = NO; + [self checkNetworkAvailability]; } - (void)tick:(NSTimer *)theTimer { - [self updateDomain]; + if(isNetworkAvailable) { + [self updateDomain]; + } } -(BOOL)updateDomain { @@ -42,6 +48,27 @@ return updateResult; } +-(void)checkNetworkAvailability { + // Allocate a reachability object + Reachability* reach = [Reachability reachabilityWithHostname:WS_BASE]; + + // Set the blocks + reach.reachableBlock = ^(Reachability*reach) + { + NSLog(@"%@ REACHABLE", WS_BASE); + isNetworkAvailable = YES; + }; + + reach.unreachableBlock = ^(Reachability*reach) + { + NSLog(@"%@ UNREACHABLE", WS_BASE); + isNetworkAvailable = NO; + }; + + // Start the notifier, which will cause the reachability object to retain itself! + [reach startNotifier]; +} + -(BOOL)checkUpdateNeeded { NSString *storedIPv4 = [[NSUserDefaults standardUserDefaults] stringForKey:@"value.ip.ipv4"]; NSString *fetchedIPv4 = usersIPv4; @@ -53,7 +80,7 @@ NSLog(@"fetched IPv4 NULL"); return NO; } else { - //NSLog(@"compare stored %@ with %@", storedIPv4, fetchedIPv4); + NSLog(@"compare stored %@ with %@", storedIPv4, fetchedIPv4); BOOL changed = [storedIPv4 isEqualToString:fetchedIPv4]; if(changed) {