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

时间:2014-10-14 10:00:40

标签: ios cocoa-touch foundation

虽然我的应用程序可以在没有任何互联网连接的情况下使用,但它可以与Web服务器交换数据(以显示一些用户统计信息)。所以我宣传应用程序为"不需要互联网连接"。一些用户随后关闭了我的应用程序的移动数据,这应该是完全正常的。但是,当我的应用程序尝试交换数据时,这些用户会被“#App名称”关闭。#34;关闭[移动数据库]。#34;对话框。

这对他们来说是一个烦恼,我想阻止这些对话,只是跳过整个数据交换的事情。

Apple's Reachability Sample Code

但是虽然我关闭了整个设备的WiFi和应用程序的移动数据,但Reachability确认了一个积极的互联网连接。更具体地说,它报告

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

无论我是否激活了细胞数据。当然,当蜂窝数据关闭时,实际上没有互联网连接可用,因此数据交换失败。但无论如何,用户都会看到蜂窝数据对话框。

有没有办法检测iOS 7和iOS 8上的互联网连接是否可用,考虑到特定应用程序的蜂窝数据设置 - 所有这些都不会在每次使用蜂窝数据对话框时再次窃听用户?

我的应用程序目前没有任何设置面板,所以我想避免设置(第二个应用内)交换机"不要使用移动数据"。此外,我不想将数据交换限制为WiFi连接,因为每个会话只需2 KB的数据,这对大多数用户来说并不是一件大事。

2 个答案:

答案 0 :(得分:2)

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

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

  

另一位开发人员写信给DTS,因此我有机会   深入研究这一点。唉,这个消息和我预期的一样:   没有支持的方法来检测您的应用是否处于此状态。   也没有办法进行“没有用户互动”#34;网络连接,   也就是说,请求连接失败而不是呈现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 :(得分:-1)

尝试使用此git project.

如何安装,您可以在git上的自述文件中查看。 我还使用了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];
    });