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

8
虽然我的应用程序可以在没有任何互联网连接的情况下使用,但它可能会与Web服务器交换数据(以显示一些用户统计信息)。因此,我将该应用程序宣传为“不需要互联网连接”。随后,一些用户关闭了我的应用程序的移动数据,这完全没问题。但是当我的应用程序尝试交换数据时,这些用户会收到“已为[应用程序名称]关闭移动数据”的对话框,这对他们来说很烦人。
我想防止这些对话框的出现,并简单地跳过整个数据交换过程。
Apple's Reachability Sample Code
但是,尽管我关闭了整个设备的WiFi和应用程序的移动数据,可达性仍确认了正面的互联网连接。更具体地说,它报告:
Reachability Flag Status: WR t------ networkStatusForFlags

无论我是否开启蜂窝数据,都不能进行数据交换。当然,当关闭蜂窝数据时,实际上无法连接到互联网,因此数据交换失败。但是,用户仍会收到蜂窝数据对话框。

有没有办法在考虑特定应用程序的蜂窝数据设置的情况下,检测iOS 7和iOS 8上是否有可用的互联网连接 - 而无需每次都使用蜂窝数据对话框麻烦用户?

我的应用程序目前没有任何设置面板,因此我希望避免设置一个(第二个,在应用内的)开关“不使用蜂窝数据”。此外,我也不想将数据交换限制为WiFi连接,因为大多数用户只需要传输2 KB的数据,这并不是一个大问题。

2个回答

2
我认为在iOS8中唯一支持的方法是向已知服务器发送Ping,并使用警告面板几次来骚扰用户。在iOS8上,苹果公司仅显示两次该面板,然后即使重新启动应用程序也会跳过它,也许它会在一天后再次出现。(这对于广告支持的应用程序来说真是个坏消息。)
苹果公司表示(https://devforums.apple.com/message/1059332#1059332):
另一位开发人员写信给DTS,因此我有机会深入研究。不幸的是,新闻和我预期的一样:没有支持的方法可以检测到您的应用程序处于此状态。也没有办法进行“无用户交互”的网络连接,即要求连接失败而不呈现此类UI。
以下文章提供了使用ping的方法:

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

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


-1

试试使用这个git项目。

如何安装可以在git的Readme中看到。 我还使用了dispatch_once来确保Reachability只会被初始化一次。这种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];
    });

2
可达性不起作用,它错误地报告为“可达”。 - cat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接