我试图使用本地通知,但有些东西无效。
我有一个类通知,处理与通知相关的所有代码。 它显然在起作用。什么是无效的是我试图触发我的通知的方式。
当用户点击主页按钮时,我会调用启动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)"没什么......
你知道为什么吗?
答案 0 :(得分:0)
正如保罗在评论中所说,你的应用只会在暂停前花费很短的时间。暂停意味着您的代码不再运行,因此计时器停止。
模拟器并不总是遵循相同的规则。当它的行为与设备的行为不同时,请忽略它。它就在。
如果您希望有更多时间在后台工作,可以使用beginBackgroundTaskWithExpirationHandler
方法提出要求。使用applicationDidEnterBackground
方法拨打电话。
通过测试,我发现这给你3分钟的额外时间。之后,您的到期处理程序块将被执行,然后您将被暂停。
Apple不希望您的应用无限期地从后台运行。它耗尽了电池。
我发现有可能撒谎并告诉系统你是一个从后台播放声音的应用程序,然后编写你的到期处理程序以播放一个简短的“沉默声”,然后要求另一个后台任务使用beginBackgroundTaskWithExpirationHandler
。但是,这样做会让你从应用程序商店中被拒绝。