我正在使用 Reachability class从 Apple 检测对我的应用程序功能有影响的网络事件。这是一个使用 setKeepAliveTimeout 的 voip 应用程序,因此每约 10 分钟醒来读取网络状态并决定是否应刷新连接。
BOOL res = [app setKeepAliveTimeout:600 handler:^{
[[WIFI instance] isWifiConnected];
[[AClass an_instance] refresh];
}
}];
因此,每 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;
}
虽然我的设备中有 WiFi,但调用返回 false,即没有 WiFi,而且网络状态为 NotReachable。
然而,在很短的时间间隔之后,再次调用可达性回调,并且 wifi 似乎已连接。但是,由于错误值,我已经触发了一个事件,并且应用程序关闭了与服务器的连接,认为没有 wi-fi。
做一些研究,我在 Reachability.m 文件(由 Apple 提供)的自述文件中找到了这个
默认情况下,应用程序使用 www.apple.com 作为其远程主机。您可以通过修改 -viewDidLoad 中的 remoteHostName 变量的值来更改它在 APLViewController.m 中使用的主机。
IMPORTANT: Reachability must use DNS to resolve the host name before it can determine the Reachability of that host, and this may take time on certain network connections. Because of this, the API will return NotReachable until name resolution has completed. This delay may be visible in the interface on some networks
.
会不会是这个问题? dns 查找的延迟?或者我还需要增强我的代码吗?
当我初始化应用程序时,我调用它
self.hostReach = [Reachability reachabilityWithHostName: @"www.apple.com"];
如果我使用这样的 IP 地址是否正确?
self.hostReach = [Reachability reachabilityWithHostName: @"1.2.3.4"];
使用公网IP安全吗?例如“17.178.96.59”是 apple.com 的 nslookup 的结果
Reachability 类中有一个方法,好像是苹果的demo用的。
- (BOOL)connectionRequired
{
NSAssert(_reachabilityRef != NULL, @"connectionRequired called with NULL reachabilityRef");
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags))
{
return (flags & kSCNetworkReachabilityFlagsConnectionRequired);
}
return NO;
}
为什么需要 connectionRequired?可以用来解决问题吗?
最佳答案
为了节省电池电量,iOS 会在未使用时关闭网络硬件。这意味着关闭 WiFi 和蜂窝 radio 。在这种情况下,Reachability 将无法报告完整的结果,因为它无法在不重新打开所有内容的情况下检查情况。这就是 kSCNetworkReachabilityFlagsConnectionRequired 的用途——告诉您需要建立连接以唤醒硬件备份。
您看到的可能是手机解锁时某些东西被唤醒(您的应用程序或其他具有后台权限的应用程序),所以一切都被唤醒,您立即看到错误,但随后 WiFi 连接并且您再次连接。
您需要处理 Reachability,就好像它可以告诉您“绝对可达”或“绝对不可达”以及“情况未知”一样。你需要决定在未知情况下你要做什么。如果您立即建立网络连接,那么您将比平时更快地耗尽电池电量。另一种方法可能只是等待网络因其他原因被唤醒。这完全取决于您。
关于当 WiFi 处于事件状态时,iOS 可达性报告没有 WiFi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35629720/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur