KSReachability 1.4.1

KSReachability 1.4.1

测试已测试
Lang语言 Obj-CObjective C
许可协议 MIT
发布上次发布2015年5月

James BillinghamKarl Stenerud 维护。



  • 作者
  • Karl Stenerud

作者:Karl Stenerud

现代时代的更好可达性。

简介

很久以前,在一个遥远的Xcode里,苹果提供了“Reachability”,一个示例Objective-C包装器,用于演示SystemConfiguration Reachability API。总的来说,它运行得很好,但还可以更好!

KSReachability 将可达性提升到了新的水平。

功能

  • 可到达网络、主机或IPV4或IPV6地址。
  • 通过NSNotification、blocks和KVO进行通知/callbacks。
  • 获取状态值不会阻塞。
  • callbacks和KVO始终在主线程上发生,因此是UI安全的。
  • KSReachableOperation:当可达性建立时执行的单次操作。
  • 支持iOS和Mac OS X。
  • 可以用或不用ARC构建,用CLANG或GCC编译。

用法

导入

#import "KSReachability.h"

创建一个KSReachability对象

self.reachability = [KSReachability reachabilityToHost:hostname];

使用blocks

self.reachability.onReachabilityChanged = ^(KSReachability* reachability)
{
    NSLog(@"Reachability changed to %d (blocks)", reachability.reachable);
};

或使用NSNotifications

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(onReachabilityChanged:)
                                             name:kDefaultNetworkReachabilityChangedNotification
                                           object:nil];
...

self.reachability.notificationName = kDefaultNetworkReachabilityChangedNotification;
...

- (void) onReachabilityChanged:(NSNotification*) notification
{
    KSReachability* reachability = (KSReachability*)notification.object;
    NSLog(@"Reachability changed to %d (NSNotification)", reachability.reachable);
}

或使用KVO

[self.reachability addObserver:self
                    forKeyPath:@"reachable"
                       options:NSKeyValueObservingOptionNew
                       context:NULL];
...

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{
    KSReachability* reachability = (KSReachability*)object;
    NSLog(@"Reachability changed to %d (KVO)", reachability.reachable);
}

添加可达性操作

// Create a one-shot operation that gets fired once the host is reachable.
self.reachableOperation = [KSReachableOperation operationWithHost:hostname
                                                        allowWWAN:NO
                                           onReachabilityAchieved:^
                           {
                               [self showAlertWithTitle:@"One-time message"
                                                message:@"Host is reachable!"];
                           }];

注意事项

可达性的含义

根据苹果的SCNetworkReachability文档,当数据包地址为该远程主机时,被认为是可以到达的,只要该数据包可以离开本地设备(即理论上可以到达主机)。它并不能保证数据实际上会被接收或主机会对连接请求做出响应!例如,如果主机有一个DNS记录,但主机自身已经关闭,它仍然被认为是可到达的。

DNS查询导致的延迟

KSReachability必须进行DNS查询以确定通过名称访问主机是否可达。由于这种查询在某些极端情况下可能需要10秒以上,因此它在后台执行。因此,新创建的KSReachability对象在没有完成此查询之前,其状态始终设置为不可达。如果您需要主机真实可达性,必须等待“initialized”属性变为YES(它支持KVO)。作为替代,您可以设置回调“onInitializationComplete”。

完整示例

我已经在这个仓库中包含了一个完整的项目示例。

中,请参阅ViewController.h ViewController.m以获取详细信息。

MacReachability中,请参阅AppDelegate.hAppDelegate.m以获取详细信息。

许可证

版权所有 (C) 2012 Karl Stenerud。保留所有权利。

特此授予任何获得此软件及其相关文档副本(以下简称“软件”)的人免费使用权,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许提供软件的人员为此目的使用软件,前提是遵守以下条件:

上述版权声明和许可声明应保留在源代码中。

软件按“现状”提供,不提供任何形式的保证,无论是明示的、暗示的还是特定的,包括但不限于适销性、适用于特定目的和不侵犯权利的保证。在任何情况下,作者或版权持有者不对任何索赔、损害或其他责任承担责任,无论是否由于违反合同、侵权或其他方式引起的,无论是否与软件相关或与使用软件相关或与软件的使用或其他交易相关。