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

Tom*_*ing 16 networking cellular-network ios

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

Ste*_*son 13

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

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

因此,看起来无法检测您的应用的移动数据是否已关闭.

编辑

我为此提出了一个雷达,要求将其添加.我刚收到这个通知

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

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

  • 苹果为iOS 9做的'修复'是将SCNetworkReachabilityFlags标志设置为未定义的值0而不是kSCNetworkReachabilityFlagsReachable (3认同)

Pau*_*ing 7

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

import CoreTelephony
var cellularDataRestrictedState = CTCellularDataRestrictedState.restrictedStateUnknown
let cellState = CTCellularData.init()
cellState.cellularDataRestrictionDidUpdateNotifier = { (dataRestrictedState) in
  if cellularDataRestrictedState != .restrictedStateUnknown { // State has changed - log to console
    print("cellularDataRestrictedState: " + "\(dataRestrictedState == .restrictedStateUnknown ? "unknown" : dataRestrictedState == .restricted ? "restricted" : "not restricted")")
  }
  cellularDataRestrictedState = dataRestrictedState
}
Run Code Online (Sandbox Code Playgroud)

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

  • 总是得到“restrictedStateUnknown”。 (2认同)

Guy*_*ood 5

只是想为未来的旅行者添加上述 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;
        }];
    }
}
Run Code Online (Sandbox Code Playgroud)