计时器无法在真正的iPhone上运行

时间:2015-09-24 22:37:53

标签: ios iphone swift uilocalnotification

我试图使用本地通知,但有些东西无效。

我有一个类通知,处理与通知相关的所有代码。 它显然在起作用。什么是无效的是我试图触发我的通知的方式。

当用户点击主页按钮时,我会调用启动NSTimer的通知类。它每秒重复一次,每10秒我就会调用一次网络服务。

我的模拟器上的一切都很棒,但它在我真正的iPhone上无效。

这里是代码:

//as a class variable
let notif = Notification()

func applicationDidEnterBackground(application: UIApplication) {

        notif.triggerTimer()

    }

通知类

class Notification: NSObject, WsOrderStatusProtocol, WsPinRequestProtocol {

    var timer = NSTimer()
    var time = 0
    var sendNotification:Bool = true

    var wsos = WsOrderStatus()
    var wsoc = PinRequest()

    override init() {
        super.init()
        self.wsos.delegate = self
        self.wsoc.delegate = self
    }

    func triggerTimer() {
        print("log INFO : class Notification, methode : triggerTimer")

        NSNotificationCenter.defaultCenter().addObserver(self, selector:"orderCoupon:", name: "actionOrderCouponPressed", object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector:"cancelTimer:", name: "actionCancelTimerPressed", object: nil)

        timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("launchNotification"), userInfo: nil, repeats: true)

    }

    func launchNotification() {
        print("log INFO : class Notification, methode : launchNotification")

        time += 1

        print("time \(time)")

        if time % 10 == 0 {
            print("modulo 10")
            wsos.getOrderStatus()
        }


    }    

}

在模拟器中,我看到日志和等于10等的日志,但是对于我的真实iphone,我只看到第一个日志" print(" log INFO:class Notification,methode: triggerTimer&#34)"没什么......

你知道为什么吗?

1 个答案:

答案 0 :(得分:0)

正如保罗在评论中所说,你的应用只会在暂停前花费很短的时间。暂停意味着您的代码不再运行,因此计时器停止。

模拟器并不总是遵循相同的规则。当它的行为与设备的行为不同时,请忽略它。它就在。

如果您希望有更多时间在后台工作,可以使用beginBackgroundTaskWithExpirationHandler方法提出要求。使用applicationDidEnterBackground方法拨打电话。

通过测试,我发现这给你3分钟的额外时间。之后,您的到期处理程序块将被执行,然后您将被暂停。

Apple不希望您的应用无限期地从后台运行。它耗尽了电池。

我发现有可能撒谎并告诉系统你是一个从后台播放声音的应用程序,然后编写你的到期处理程序以播放一个简短的“沉默声”,然后要求另一个后台任务使用beginBackgroundTaskWithExpirationHandler。但是,这样做会让你从应用程序商店中被拒绝。