【问题标题】:Keep WiFi Connection active even iPad is going into sleep mode/locked in iOS 5即使 iPad 进入睡眠模式/锁定在 iOS 5 中,仍保持 WiFi 连接处于活动状态
【发布时间】:2012-08-01 12:57:51
【问题描述】:

我知道在 iOS 4 上,Wi-Fi 连接曾经是持久的,因此进入睡眠模式/锁定保持连接开启。

在下一个版本 iOS 5 中对此进行了修改,以延长电池寿命。

iOS 5 中,需要将设备插入电源才能获得持久的 Wi-Fi 连接。

iPad 进入睡眠模式/锁定后,Wi-Fi 连接会自动断开。

我的问题来了,我正在通过 WiFi 发送大量数据,这可能需要太多时间。所以用户必须等待交易完成。

iPad 可能会切换到睡眠模式/锁定,而发送过程需要更多时间,这将导致 WiFi 连接错误。

现在我在 info.plist 中将 UIRequiresPersistentWiFi 设置为 YES。但是同样的网络问题又发生了。

即使 iPad 进入睡眠模式/锁定在 iOS5,我也想保持/持久保持 WiFi 连接处于活动状态。那么有没有其他方法可以实现这一点。

谢谢。

【问题讨论】:

    标签: iphone objective-c ios5 connection wifi


    【解决方案1】:

    呼……终于我找到了idleTimerDisabled的解决方案。

    它是一个布尔值,用于控制是否为应用程序禁用空闲计时器。

    这是防止 iPad 在我的应用程序运行时休眠的方法。

    此属性的默认值为 NO。当大多数应用程序在短时间内没有用户输入触摸时,系统会将设备置于屏幕变暗的“sleep”状态。

    这样做是为了节省电量。但是,除了加速度计之外没有用户输入的应用程序(例如游戏)可以通过将此属性设置为 YES 来禁用“idle timer >”来避免系统休眠。

    我只是在通过 WiFi 发送大量数据时将值设置为 YES,并在处理过程中将值设置为 NO完成了。

    示例:[[UIApplication sharedApplication] setIdleTimerDisabled:YES];

    注意:当您的应用不需要防止屏幕锁定时,请务必将此属性重置为 NO。

    您可以查看更多详情here

    【讨论】:

    • 即使用户通过按iphone的电源按钮锁定屏幕,它是否会阻止设备进入睡眠状态?
    【解决方案2】:

    这是因为 iOS 处理 Wi-Fi 连接的方式。发生的事情是 iPad 进入睡眠模式(这发生在 5 分钟不活动后)。此模式旨在延长电池寿命。在 iOS 4 上,Wi-Fi 连接曾经是持久的,因此进入睡眠模式会保持连接打开(或切换到蜂窝数据)。这在下一个版本 iOS 5 中进行了修改,要求设备插入电源才能获得持久的 Wi-Fi 连接。

    【讨论】:

    • 是的..太棒了..任何替代解决方案。因为我需要通过 WiFi 发送大量数据。它可能需要太多时间。所以用户将等待交易完成。此时设备可能会锁定并且 iPad 将进入睡眠模式,否则用户会将应用最小化到后台。
    【解决方案3】:

    我刚看到这个问题,考虑到日期,我不知道这是否还有帮助,但是您是否尝试过使用UIApplicationbeginBackgroundTaskWithExpirationHandler:方法?

    您可以按照以下方式做一些事情:

    //#1 - Start a chunk of work as able to run in the "background"
    UIApplication *app = [UIApplication sharedApplication];
    
    bgTask_ = [app beginBackgroundTaskWithExpirationHandler:^{
        if (bgTask_ != UIBackgroundTaskInvalid) {
    
            //cancel the connection/load/chunk of work/operation
            [self cancelLoad];
    
            [[UIApplication sharedApplication] endBackgroundTask:bgTask_];
            bgTask_ = UIBackgroundTaskInvalid;
        }
    }];
    
    //#2 - Do work...
    
    //#3 - Once work is finished, Explicity finish the background task
    UIApplication *app = [UIApplication sharedApplication];
    
    if (bgTask_ != UIBackgroundTaskInvalid) {
        [app endBackgroundTask:bgTask_];
        bgTask_ = UIBackgroundTaskInvalid;
    }
    

    您也可以在另一个方法中调用 #3,因为您可能正在执行异步操作(在后台运行并异步调用消息)。您还可以查看the official docs 上的“beginBackgroundTaskWithExpirationHandler:”文档以获取详细信息。

    希望这会有所帮助! :)

    【讨论】:

      猜你喜欢
      • 2017-06-08
      • 2019-01-12
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 2015-03-02
      • 2012-01-03
      相关资源
      最近更新 更多