我怎么知道我的iOS应用程序的蜂窝访问是否被禁用?

时间:2014-03-21 15:56:41

标签: ios networking cellular-network

我有一个iOS应用程序,可以在应用程序启动(资源更新等)上发出一些小的网络请求。如果用户在iOS设置中关闭应用程序的蜂窝访问权限,则每次启动时都会从iOS获得有关网络使用情况的提示。有没有办法以编程方式知道此应用程序的蜂窝数据已被禁用,以便我可以在启动时禁用请求?

6 个答案:

答案 0 :(得分:13)

所以我在苹果工程师(https://devforums.apple.com/message/1059332#1059332)的苹果开发论坛上找到了这个。

  

另一位开发人员写信给DTS,因此我有机会   深入研究这一点。唉,这个消息和我预期的一样:   没有支持的方法来检测您的应用是否处于此状态。   也没有办法建立“无用户互动”的网络连接,   也就是说,请求连接失败而不是呈现UI   这个。如果这些限制导致您的应用出现问题,我   鼓励您提交描述您具体要求的错误   https://developer.apple.com/bug-reporting/

所以看起来无法检测您的应用的细胞数据是否已关闭。

修改

我为此提交了一份雷达,要求将其添加。我刚刚在雷达上收到了这个通知

  

我们认为此问题已在最新的iOS 9测试版中得到解决。

我查看了API差异,但到目前为止我找不到新的API。

答案 1 :(得分:7)

从iOS9开始,可以使用Apple的CTCellularData类检查设置以启用/禁用应用程序的蜂窝数据(Settings / Cellular / AppName)。以下代码将在最初运行时设置cellularDataRestrictedState,然后设置它并在其发生更改时进行记录:

{{1}}

不幸的是(从iOS11开始)这似乎只检查应用程序切换的状态 - 如果您的应用程序的开关设置为启用并且用户将蜂窝数据主开关切换为禁用,则此API将返回应用程序的状态为“没有限制”。

答案 2 :(得分:3)

只是想为未来的旅行者添加上述Swift代码的Objective C版本。

- (void)monitorCanUseCellularData {
    if (GCIsiOS9) {
        CTCellularData *cellularData = [[CTCellularData alloc] init];
        NSLog(@"%ld", cellularData.restrictedState);
        // 0, kCTCellularDataRestrictedStateUnknown
        [cellularData setCellularDataRestrictionDidUpdateNotifier:^(CTCellularDataRestrictedState state) {
            NSLog(@"%ld", state);
            self.canUseCellularData = cellularData.restrictedState ==2?true:false;
        }];
    }
}

答案 3 :(得分:1)

我发现CTCellularData类需要一些时间才能获得正确的值。在我的实现中,我在didUpdateNotifier之后很早就调用appDidFinishLaunching。到我的网络电话返回错误时,我肯定对受限状态有了正确的值。

class CellularRestriction: NSObject {
    private static var cellularData = CTCellularData()
    private static var currentState = CTCellularDataRestrictedState.restrictedStateUnknown

    static var isRestricted: Bool {
        currentState = cellularData.restrictedState
        return currentState == .restricted
    }

    static func prepare() {
        if currentState == .restrictedStateUnknown {
            cellularData.cellularDataRestrictionDidUpdateNotifier = { state in
                currentState = cellularData.restrictedState // This value may be inconsistent, however the next read of isRestricted should be correct.
            }
        }
    }
}

答案 4 :(得分:-1)

添加到dirkgroten的答案,您可以使用Apple Reachability类,可在此处找到:

https://developer.apple.com/Library/ios/samplecode/Reachability/Introduction/Intro.html

它使用SCNetworkReachability,并且非常直接使用,它将通过Cell和WiFi检测连接,因为您需要在启动时检查两者。

答案 5 :(得分:-2)

有很多框架可以为您提供网络连接的状态,当然您也可以自己动手。我发现AFNetworking是最好的之一。它有一个名为AFNetworkReachabilityManager的单例类,可以为您提取一些复杂性。具体来说,您将要查看两个布尔属性:

reachableViaWWAN
reachableViaWiFi 

您还可以设置可更改性状态块:

– setReachabilityStatusChangeBlock:

AFNetworking Github

AFNetworkReachabilityManager