`
wangleyiang
  • 浏览: 221614 次
社区版块
存档分类
最新评论

扩展UIDevice来监测网络连接

阅读更多

The iPhone Developer's Cookbook

没什么好说的,直接上代码:

1、UIDevice+Reachability.h:

#import <UIKit/UIKit.h>
@interface UIDevice (Reachability)
+ (BOOL) networkAvailable;
+ (BOOL) activeWLAN;
+ (BOOL) activeWWAN;
@end

 2、UIDevice+Reachability.m:

#import <SystemConfiguration/SystemConfiguration.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <net/if.h>
#include <ifaddrs.h>
#import "UIDevice-Reachability.h"

@implementation UIDevice (Reachability)
SCNetworkConnectionFlags connectionFlags;

+ (NSString *) localWiFiIPAddress
{
	BOOL success;
	struct ifaddrs * addrs;
	const struct ifaddrs * cursor;
	
	success = getifaddrs(&addrs) == 0;
	if (success) {
		cursor = addrs;
		while (cursor != NULL) {
			// the second test keeps from picking up the loopback address
			if (cursor->ifa_addr->sa_family == AF_INET && (cursor->ifa_flags & IFF_LOOPBACK) == 0) 
			{
				NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];
				if ([name isEqualToString:@"en0"])  // Wi-Fi adapter
					return [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)];
			}
			cursor = cursor->ifa_next;
		}
		freeifaddrs(addrs);
	}
	return nil;
}

#pragma mark Checking Connections

+ (void) pingReachabilityInternal
{
	BOOL ignoresAdHocWiFi = NO;
	struct sockaddr_in ipAddress;
	bzero(&ipAddress, sizeof(ipAddress));
	ipAddress.sin_len = sizeof(ipAddress);
	ipAddress.sin_family = AF_INET;
	ipAddress.sin_addr.s_addr = htonl(ignoresAdHocWiFi ? INADDR_ANY : IN_LINKLOCALNETNUM);
    
    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (struct sockaddr *)&ipAddress);    
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &connectionFlags);
    CFRelease(defaultRouteReachability);
	if (!didRetrieveFlags) 
        printf("Error. Could not recover network reachability flags\n");
}

+ (BOOL) networkAvailable
{
	[self pingReachabilityInternal];
	BOOL isReachable = ((connectionFlags & kSCNetworkFlagsReachable) != 0);
    BOOL needsConnection = ((connectionFlags & kSCNetworkFlagsConnectionRequired) != 0);
    return (isReachable && !needsConnection) ? YES : NO;
}

+ (BOOL) activeWWAN
{
	if (![self networkAvailable]) return NO;
	return ((connectionFlags & kSCNetworkReachabilityFlagsIsWWAN) != 0);
}

+ (BOOL) activeWLAN
{
	return ([UIDevice localWiFiIPAddress] != nil);
}
@end

 

分享到:
评论

相关推荐

    UIDevice扩展

    ### UIDevice扩展知识点详解 #### 一、概述 在iOS开发过程中,经常需要获取设备的各种信息,例如系统版本、设备类型、电池状态等。通过扩展`UIDevice`类,可以方便地实现这些功能。这份文档提供了`UIDevice`类的...

    IOS应用源码——UIDevice2.rar

    4. **网络状态**:虽然`UIDevice`本身不直接提供网络状态的检查,但可以通过其扩展方法获取网络连接类型,例如是否连接到WiFi或者蜂窝数据。 5. **硬件加速功能**:`hasAccelerometer`和`hasGyro`属性可以判断设备...

    UIDevice获取IOS系统版本信息

    UIDevice类是一个单例,其唯一的实例( [UIDevice currentDevice] ) 代表了当前使用的设备。 通过这个实例,可以获得设备的相关信息(包括系统名称,版本号,...也可以使用使用该实例来监测设备的特征(比如物理方向)

    ios应用源码之获取当前硬件可用内存的例子uidevice 20181210

    UIDevice是苹果提供的一种系统服务接口,允许开发者获取设备的各种信息,包括硬件配置、电池状态、网络状态等。 首先,我们需要导入UIKit框架,因为UIDevice类就包含在这个框架中: ```swift import UIKit ``` ...

    UIDeviceComplete:填充缺失部分的UIDevice扩展

    UIDeviceComplete 填充缺失部分的UIDevice扩展。这个库是关于什么的? UIDeviceComplete是一个iOS库,旨在作为UIDevice扩展的集合,它提供UIDevice当前缺少的功能,例如确定您拥有哪个iOS设备(即iPhone X,iPhone 8...

    安卓UiAutomator/UiDevice/Instrumentation官方测试范例

    官方提供的UiAutomator、UiDevice和Instrumentation是三个非常重要的工具,用于进行UI层面的自动化测试。下面将详细介绍这三个工具及其应用。 首先,`UiAutomator`是Android SDK中的一个测试框架,主要用于测试跨...

    获取 ios 系统网络状况、电量

    `Reachability`是苹果官方提供的一个库,用于检测设备的网络连接状态,包括是否连接到互联网、网络类型(如WiFi或蜂窝数据)以及网络是否可用。通过集成`Reachability`,开发者可以及时了解用户的网络环境,从而做出...

    UIDevice 封装,更方便的获取设备信息,以及仿真设备.zip

    然而,原始的`UIDevice`类在使用时可能较为繁琐,需要多次调用不同的方法来获取完整的设备信息。针对这种情况,开发者们通常会进行封装,以简化代码并提高效率。`DeviceKit`就是这样一个开源项目,它是对`UIDevice`...

    IOS应用源码——获取当前硬件可用内存的例子UIDevice.zip

    这个"IOS应用源码——获取当前硬件可用内存的例子UIDevice.zip"提供了一个简单的示例,演示了如何利用Apple的UIKit框架中的UIDevice类来获取iOS设备的当前可用内存。下面将详细介绍这个知识点及其相关背景。 首先,...

    iOS App开发中通过UIDevice类获取设备信息的方法

    在iOS应用开发中,`UIDevice`类是获取设备相关信息...无论是获取设备基本信息,还是监测电池状态,甚至利用传感器数据,`UIDevice`都是实现这些功能的基石。理解并熟练运用这些方法,对于开发高质量的iOS应用至关重要。

    swift-DeviceKit是UIDevice的值类型替换

    在Swift编程语言中,`UIDevice`是Apple提供的一个核心框架类,用于获取关于设备的信息,如设备模型、系统版本等。然而,由于`UIDevice`是引用类型(即类),在某些场景下可能会带来一些问题,比如可能导致意外的副...

    IOS应用源码之获取当前硬件可用内存的例子UIDevice .zip

    这个压缩包"IOS应用源码之获取当前硬件可用内存的例子UIDevice .zip"提供了一个示例代码,用于演示如何利用苹果的UIKit框架中的UIDevice类来获取iOS设备的当前可用内存。这篇文章将深入探讨这个知识点,并详细解释其...

    IOS应用源码Demo-获取当前硬件可用内存的例子UIDevice-毕设学习.zip

    这个压缩包"IOS应用源码Demo-获取当前硬件可用内存的例子UIDevice-毕设学习.zip"提供了一个实例,教你如何利用`UIDevice`类来获取设备的可用内存信息,这对于进行性能优化和调试非常有用。下面将详细介绍这一知识点...

    UIDevice-DisplayName:返回任何iOS设备的友好名称

    UIDevice-DisplayName displayName()返回iOS设备的友好名称,其中不包括特定的类型信息(即“ iPhone X”) displayName(includeType: true)返回iOS设备的友好名称,其中还包括设备类型(例如“ iPhone X(GSM)”)...

    uidevice-extension

    在iOS开发中,`uidevice-extension`涉及到一个关键的话题,即如何获取移动设备的IMEI(国际移动设备识别码)地址。IMEI是每个手机独一无二的标识符,通常用于跟踪和识别设备。然而,苹果公司对隐私保护有着严格的...

    IOS助手设备连接源码

    这些信息可以通过苹果的Foundation框架中的类如UIDevice来获取。在iOS助手的源码中,可能有专门的模块用于处理这些信息的获取和解析。 为了实现这些功能,开发者需要掌握Objective-C或Swift编程语言,并熟悉Apple的...

    MGCopyAnswer-From-UIDevice:如何从 UIDevice 类 PRIVATE API 获取设备信息

    "MGCopyAnswer-From-UIDevice"项目就是针对这种情况,它展示了如何利用非公开的UIDevice方法来获取iPhone或iPad的私有设备信息。 首先,我们要明确的是,使用私有API是违反Apple的App Store审核指南的,这可能导致...

    ios 得到设备型号,如iphone 4s

    在iOS中,我们可以利用`UIDevice`类来获取这些信息。`UIDevice`是苹果提供的一个核心框架类,它提供了关于当前设备的基本信息。要获取设备型号,可以使用`model`属性,这个属性返回的是设备的本地化型号名称。例如,...

    iOS设备检测及iPhone数字键盘添加完成按钮工程代码

    通过扩展`UIDevice`,我们可以增加自定义的方法来识别设备类型,如iPhone、iPad、iPod touch等。这通常涉及到检查设备的模型标识符和屏幕尺寸。例如,可以创建一个名为 `isiPhone` 的分类方法,检查设备的型号是否...

Global site tag (gtag.js) - Google Analytics