parent
dfca76905d
commit
170d3633f0
3 changed files with 1 additions and 138 deletions
@ -1,47 +0,0 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2016 gRPC authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
*/ |
||||
|
||||
#import <Foundation/Foundation.h> |
||||
#import <SystemConfiguration/SystemConfiguration.h> |
||||
|
||||
typedef NS_ENUM(NSInteger, GRPCConnectivityStatus) { |
||||
GRPCConnectivityUnknown = 0, |
||||
GRPCConnectivityNoNetwork = 1, |
||||
GRPCConnectivityCellular = 2, |
||||
GRPCConnectivityWiFi = 3, |
||||
}; |
||||
|
||||
extern NSString* _Nonnull kGRPCConnectivityNotification; |
||||
|
||||
// This interface monitors OS reachability interface for any network status
|
||||
// change. Parties interested in these events should register themselves as
|
||||
// observer.
|
||||
@interface GRPCConnectivityMonitor : NSObject |
||||
|
||||
- (nonnull instancetype)init NS_UNAVAILABLE; |
||||
|
||||
// Register an object as observer of network status change. \a observer
|
||||
// must have a notification method with one parameter of type
|
||||
// (NSNotification *) and should pass it to parameter \a selector. The
|
||||
// parameter of this notification method is not used for now.
|
||||
+ (void)registerObserver:(_Nonnull id)observer selector:(_Nonnull SEL)selector; |
||||
|
||||
// Ungegister an object from observers of network status change.
|
||||
+ (void)unregisterObserver:(_Nonnull id)observer; |
||||
|
||||
@end |
@ -1,90 +0,0 @@ |
||||
/* |
||||
* |
||||
* Copyright 2016 gRPC authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
* |
||||
*/ |
||||
|
||||
#import "GRPCConnectivityMonitor.h" |
||||
|
||||
#include <netinet/in.h> |
||||
|
||||
NSString *kGRPCConnectivityNotification = @"kGRPCConnectivityNotification"; |
||||
|
||||
static SCNetworkReachabilityRef reachability; |
||||
static GRPCConnectivityStatus currentStatus; |
||||
|
||||
// Aggregate information in flags into network status. |
||||
GRPCConnectivityStatus CalculateConnectivityStatus(SCNetworkReachabilityFlags flags) { |
||||
GRPCConnectivityStatus result = GRPCConnectivityUnknown; |
||||
if (((flags & kSCNetworkReachabilityFlagsReachable) == 0) || |
||||
((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0)) { |
||||
return GRPCConnectivityNoNetwork; |
||||
} |
||||
result = GRPCConnectivityWiFi; |
||||
#if TARGET_OS_IPHONE |
||||
if (flags & kSCNetworkReachabilityFlagsIsWWAN) { |
||||
return result = GRPCConnectivityCellular; |
||||
} |
||||
#endif |
||||
return result; |
||||
} |
||||
|
||||
static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, |
||||
void *info) { |
||||
GRPCConnectivityStatus newStatus = CalculateConnectivityStatus(flags); |
||||
|
||||
if (newStatus != currentStatus) { |
||||
[[NSNotificationCenter defaultCenter] postNotificationName:kGRPCConnectivityNotification |
||||
object:nil]; |
||||
currentStatus = newStatus; |
||||
} |
||||
} |
||||
|
||||
@implementation GRPCConnectivityMonitor |
||||
|
||||
+ (void)initialize { |
||||
if (self == [GRPCConnectivityMonitor self]) { |
||||
struct sockaddr_in addr = {0}; |
||||
addr.sin_len = sizeof(addr); |
||||
addr.sin_family = AF_INET; |
||||
reachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&addr); |
||||
currentStatus = GRPCConnectivityUnknown; |
||||
|
||||
SCNetworkConnectionFlags flags; |
||||
if (SCNetworkReachabilityGetFlags(reachability, &flags)) { |
||||
currentStatus = CalculateConnectivityStatus(flags); |
||||
} |
||||
|
||||
SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL}; |
||||
if (!SCNetworkReachabilitySetCallback(reachability, ReachabilityCallback, &context) || |
||||
!SCNetworkReachabilityScheduleWithRunLoop(reachability, CFRunLoopGetMain(), |
||||
kCFRunLoopCommonModes)) { |
||||
NSLog(@"gRPC connectivity monitor fail to set"); |
||||
} |
||||
} |
||||
} |
||||
|
||||
+ (void)registerObserver:(id)observer selector:(SEL)selector { |
||||
[[NSNotificationCenter defaultCenter] addObserver:observer |
||||
selector:selector |
||||
name:kGRPCConnectivityNotification |
||||
object:nil]; |
||||
} |
||||
|
||||
+ (void)unregisterObserver:(id)observer { |
||||
[[NSNotificationCenter defaultCenter] removeObserver:observer]; |
||||
} |
||||
|
||||
@end |
Loading…
Reference in new issue