在星巴克这样的强制门户网站上使用Safari时,iOS设备会启动一个特殊的模态webview来通过门户网站进行身份验证.我已经看到第三方应用触发了这个,所以它可以在Safari之外做,但我不知道如何.它似乎只是通过使用Reachability或发出网络请求而免费提供.
编辑:我能说的最好的是我接受的答案.这可能是正确的答案,但我不知道为什么它不一致.在启动强制网络门户之前,可能需要多次网络尝试.
我已将Apple Reachability文件添加到我的项目中,我已经收到错误.我甚至没有将这些文件添加到我的任何类中,只是将它们添加到我的项目中.我怎么可能已经收到此错误?
编译时我收到以下错误:
ld: duplicate symbol _OBJC_IVAR_$_Reachability.localWiFiRef in /Users/webmaster/Dropbox/iPhone-Development/Official-Projects/PUC/build/PUC.build/Debug-iphonesimulator/PUC.build/Objects-normal/i386/Reachability-B40F6D608A62C635.o and /Users/webmaster/Dropbox/iPhone-Development/Official-Projects/PUC/build/PUC.build/Debug-iphonesimulator/PUC.build/Objects-normal/i386/Reachability-823B59DA9A9B0D23.o
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1
Run Code Online (Sandbox Code Playgroud)
注意:我正在使用Three20项目,所以我不确定它是否会以某种方式发生冲突?
有谁知道Apple的iOS'Reachability'示例代码的2.2版(最新版)是否可以在iOS 3.0上运行?我想支持iOS 3.0,Reachability.h和.m是我在我的应用程序中使用的第一个非框架代码.在我自己的代码中,我通常会阅读我使用的所有方法的文档,并使用respondsToSelector:来实现不能在3.0上运行的方法.当人们使用第三方代码时,他们如何确认它支持哪个iOS而无需针对文档单独检查每个方法?
或者,有谁知道我如何能够获得旧版本的示例代码?(可达性2.1版本可能有所帮助.)
我在代码中使用Reachability很困难.我想通过在启动时启动观察者然后只是接收更改通知来保持它非常简单.在以下代码中,永远不会调用reachabilityChanged方法.我尝试了很多迭代,但这是最简单的版本.它编译并运行.请帮忙...
**** AppDelegate.h代码****
#import <UIKit/UIKit.h>
#ifdef PHONEGAP_FRAMEWORK
#import <PhoneGap/PGViewController.h>
#import <PhoneGap/PGURLProtocol.h>
#import <PhoneGap/Reachability.h>
#else
#import "PGViewController.h"
#import "PGURLProtocol.h"
#import "Reachability.h"
#endif
@interface AppDelegate : NSObject < UIApplicationDelegate, UIWebViewDelegate, PGCommandDelegate> {
NSString* invokeString;
}
@property (nonatomic, copy) NSString* invokeString;
@property (nonatomic, strong) IBOutlet UIWindow* window;
@property (nonatomic, strong) IBOutlet PGViewController* viewController;
@end
Run Code Online (Sandbox Code Playgroud)
**** AppDelegate.m代码段****
#import "AppDelegate.h"
#import "MainViewController.h"
#ifdef PHONEGAP_FRAMEWORK
#import <PhoneGap/PGPlugin.h>
#import <PhoneGap/PGURLProtocol.h>
#import <PhoneGap/Reachability.h>
#else
#import "PGPlugin.h"
#import "PGURLProtocol.h" …Run Code Online (Sandbox Code Playgroud) 我在非弧项目中使用了苹果的Reachabiliry课程.当我使用仪器运行以查找内存泄漏时,它会引用Reachability方法.这是问题所在:
+ (instancetype)reachabilityWithAddress:(const struct sockaddr_in *)hostAddress;
{
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)hostAddress);
WReachability* returnValue = NULL;
if (reachability != NULL)
{
returnValue = [[self alloc] init];
if (returnValue != NULL)
{
returnValue->reachabilityRef = reachability;
returnValue->localWiFiRef = NO;
}
}
return returnValue;
}
Run Code Online (Sandbox Code Playgroud)
泄漏的对象是可达性和returnValue.我知道SCNetworkReachabilityCreateWithAddress创建了一个新实例,我必须CFRelease它,但它发生在dealloc!
- (void)dealloc
{
[self stopNotifier];
if (reachabilityRef != NULL)
{
CFRelease(reachabilityRef);
}
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
那么我该怎么做才能避免内存泄漏呢?
UPD:可能问题在于如何调用可达性?我用这个方法:
+ (instancetype)reachabilityForInternetConnection;
{
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
return [self reachabilityWithAddress:&zeroAddress]; …Run Code Online (Sandbox Code Playgroud) 我有互联网连接,可以浏览器浏览.
这里是我的代码检查Reachability用AFNetworking.
- (BOOL)connected {
return [AFNetworkReachabilityManager sharedManager].reachable;
}
Run Code Online (Sandbox Code Playgroud)
并在ViewDidLoad中
BOOL isOnline = [self connected];
if(isOnline == YES)
{
NSLog(@"YES");
}
else
{
NSLog(@"NO");
}
Run Code Online (Sandbox Code Playgroud)
它只显示NO,我不知道为什么会这样?
是否有检查最简单的方法Reachability有AFNetworking?
我测试了不同的框架,例如
我想知道主机是否可以访问.在我的iPhone上,我将iMac设置为代理(Charles)并阻止或不阻止连接,但可达性始终为YES.仅当我设置不存在的主机时,它才返回NO.但是如果主机存在但我阻止了它的连接,我总是得到isReachable.有没有办法检查主机是否真的可以访问?
如果我尝试使用KSReachability,我会做以下事情:
self.reachability = [KSReachability reachabilityToHost:@"www.stackoverflow.com"];
self.reachability.notificationName = kDefaultNetworkReachabilityChangedNotification;
self.reachability.onReachabilityChanged = ^(KSReachability *reachability) {
NSLog(@"isReachable: %i", reachability.reachable);
};
Run Code Online (Sandbox Code Playgroud)
我总是通过isReachable: 1以下配置到达那里:
当我尝试在Safari中访问www.stackoverflow.com时,无法打开页面(按预期方式).isReachable: 0在这种情况下,我希望可达性为false().
编辑 所以对我来说最重要的问题是 - 如何实现我期待的行为?即应用程序不断检查给定的主机是否真的可以访问?
在我的应用程序中,我希望能够检测特定应用程序是否启用了蜂窝数据,并根据检查行为的结果进行了适当的检测.
有没有办法执行此程序化检查?
我正在使用Apple的Reachability类来检测对我的应用程序功能有影响的网络事件.它是一个使用setKeepAliveTimeout的voip应用程序,因此每隔~10分钟唤醒会读取网络状态并决定是否应刷新连接.
BOOL res = [app setKeepAliveTimeout:600 handler:^{
[[WIFI instance] isWifiConnected];
[[AClass an_instance] refresh];
}
}];
Run Code Online (Sandbox Code Playgroud)
因此,每隔10分钟调用一次isWifiConnected,应用程序再次读取网络状态.
- (BOOL) isWifiConnected {
self.wifiReach = [Reachability reachabilityForLocalWiFi];
NetworkStatus wifiStatus = [self.wifiReach currentReachabilityStatus];
switch (wifiStatus) {
case NotReachable: {
m_wifiConnected = NO;
LOG(@"NetStatus:NotReachable");
break;
}
case ReachableViaWiFi: {
m_wifiConnected = YES;
m_wwanConnected = NO;
LOG(@"NetStatus:ReachableViaWiFi");
break;
}
}
return m_wifiConnected;
}
Run Code Online (Sandbox Code Playgroud)
虽然设备中有WiFi,但呼叫返回false,即没有WiFi,而且网络状态为NotReachable.
然而,在很短的时间间隔之后,再次调用可达性回调并且似乎连接了wifi.但是我已经因为错误值而触发了一个事件,并且app关闭了与服务器的连接,认为没有wi-fi.
我做了一些研究,我在Reachability.m文件的自述文件中找到了这个(由Apple提供)
默认情况下,应用程序将www.apple.com用于其远程主机.您可以通过修改-viewDidLoad中remoteHostName变量的值来更改它在APLViewController.m中使用的主机.
重要信息:可访问性必须使用DNS来解析主机名,然后才能确定该主机的可访问性,这可能需要一些网络连接的时间.因此,在名称解析完成之前,API将返回NotReachable.在某些网络的接口中可能会看到此延迟
.
这可能是问题吗?dns查找的延迟?或者我是否还需要增强我的代码?
当我初始化应用程序时,我称之为
self.hostReach = [Reachability reachabilityWithHostName: @"www.apple.com"];
Run Code Online (Sandbox Code Playgroud)
如果我使用这样的IP地址是正确的吗?
self.hostReach = [Reachability reachabilityWithHostName: @"1.2.3.4"];
Run Code Online (Sandbox Code Playgroud)
使用公共IP是否安全?例如,"17.178.96.59"是针对apple.com的nslookup的结果
在Reachability类中有一种似乎可以从Apple的演示中使用的方法. …
如果无法访问互联网,是否可以通过编程方式区分以下权限案例?
我想阅读那些无线数据权限,以区分上述情况以获得更友好的错误消息(即在一种情况下我建议验证权限,在另一种情况下我建议检查飞行模式)
基于如何在Swift中使用SCNetworkReachability,我所能找到的就是获得互联网可达性,但它不知道实际的权限:
import SystemConfiguration
@available(iOS 9.0, macOS 10.11, *)
static func internetConnectionIsReachable() -> Bool {
var zeroAddress = sockaddr_in6()
zeroAddress.sin6_len = UInt8(MemoryLayout<sockaddr_in6>.size)
zeroAddress.sin6_family = sa_family_t(AF_INET6)
guard let reachability = withUnsafePointer(to: &zeroAddress, {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
SCNetworkReachabilityCreateWithAddress(nil, $0)
}
}) else {
return false
}
var flags: SCNetworkReachabilityFlags = []
guard SCNetworkReachabilityGetFlags(reachability, &flags) else {
return false
}
return flags.contains(.reachable)
}
Run Code Online (Sandbox Code Playgroud) reachability ×10
ios ×8
iphone ×3
objective-c ×3
app-store ×1
cocoa-touch ×1
ios3.0 ×1
ios7 ×1
memory-leaks ×1
networking ×1
xcode ×1