繁体   English   中英

如何判断用户是否为我的应用关闭了蜂窝数据?

[英]How to tell if the user turned off cellular data for my app?

尽管我的应用无需连接互联网即可使用,但它可能会与网络服务器交换数据(以显示一些用户统计信息)。 因此,我将该应用程序广告宣传为“不需要互联网连接”。 随后,一些用户为我的应用关闭了蜂窝数据,这应该是完全可以的。 但是,当我的应用程序尝试交换数据时,这些用户会迷惑于“ [应用程序名称]的蜂窝数据已关闭”。 对话。

这让他们很烦恼,我想防止出现这些对话框,而只是跳过整个数据交换。

Apple的可达性示例代码

但是,尽管我关闭了整个设备的WiFi和该应用程序的蜂窝数据,但Reachability确认了良好的互联网连接。 更具体地说,它报告

Reachability Flag Status: WR t------ networkStatusForFlags

无论我是否激活了蜂窝数据。 当然,当蜂窝数据关闭时,实际上没有Internet连接可用,因此数据交换失败。 但是无论如何都会向用户显示蜂窝数据对话框。

考虑到特定应用程序的蜂窝数据设置,是否有任何方法可以检测iOS 7和iOS 8上的互联网连接-无需每次都通过蜂窝数据对话框再次困扰用户?

我的应用当前没有任何设置面板,因此,我想避免设置一个“第二个应用内”开关“不要使用移动数据”。 另外,我不想将数据交换限制为WiFi连接,因为每个会话仅2 KB的数据,对于大多数用户而言,这并不是一件大事。

我认为iOS8中唯一受支持的方法是将Ping发送到已知的服务器,并用警报面板几次对用户进行调试。 在iOS8上,Apple仅显示两次该面板,然后即使重新启动该应用程序也会跳过该面板,也许一天后它会再次出现。 (对于广告支持的应用程序,这确实是个坏消息。)

苹果说( https://devforums.apple.com/message/1059332#1059332 ):

另一个开发人员写信给DTS,因此我有机会对此进行了深入研究。 遗憾的是,消息出乎我的意料:没有支持的方法来检测您的应用程序处于这种状态。 也没有办法建立“无用户交互”的网络连接,即请求连接失败,而不是像这样显示用户界面。

以下文章建议使用ping的方法:

http://www.splinter.com.au/how-to-ping-a-server-in-objective-c-iphone/

http://elbsolutions.com/projects/reachability-with-simpleping-wrapper/

尝试使用此git项目。

如何安装,您可以在git的自述文件中看到。 我还使用dispatch_once来确保可到达性仅被初始化一次。 这种dispatch类型有时非常有用!

在类中定义变量

BOOL _online = NO;

初始化变量

static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        Reachability *reach = 
          [Reachability reachabilityWithHostname:gameApiHost];
        reach.reachableBlock = ^(Reachability*reach) {
            NSLog(@"REACHABLE!"); _online = YES; 
        };
        reach.unreachableBlock = ^(Reachability*reach) { 
            NSLog(@"UNREACHABLE!"); _online = NO; 
        };
        [reach startNotifier];
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM