Ios 计划的NSNotification(而不是UILocalNotification)。。。快速解决方案?
我的应用程序(前缀“AAS”)基本上是一个游戏,用户每天不玩就会丢分。我使用UILocalNotifications来提醒用户他们丢了分数,并邀请他们重回赛场。我的一个视图控制器在点发生更改时显示,并且在应用程序打开时触发UILocalNotification时发送NSNotification非常简单) 当应用程序处于非活动状态后重新打开时,其中一个类会计算丢失的点数。伟大的防弹,除非用户不允许我的应用程序使用NotificationCenter,否则如果应用程序在应该发出通知时打开,则不会更新。对于本例,我编写了自己的定时通知队列实现,在我的应用程序打开时,在一定程度上模拟UILocalNotification。但我想,一定有人以前有过这个问题,也许有一个椰子荚可以解决这个问题 所以我要问社区的问题是,有人知道有一个库可以发送定时通知吗?还是用不同的方法来解决这个问题 我想使用一个由专业人士编写的、经过良好测试且功能丰富的软件。(我知道该请求与SO无关。) 编辑:Ios 计划的NSNotification(而不是UILocalNotification)。。。快速解决方案?,ios,swift,nstimer,uilocalnotification,nsnotification,Ios,Swift,Nstimer,Uilocalnotification,Nsnotification,我的应用程序(前缀“AAS”)基本上是一个游戏,用户每天不玩就会丢分。我使用UILocalNotifications来提醒用户他们丢了分数,并邀请他们重回赛场。我的一个视图控制器在点发生更改时显示,并且在应用程序打开时触发UILocalNotification时发送NSNotification非常简单) 当应用程序处于非活动状态后重新打开时,其中一个类会计算丢失的点数。伟大的防弹,除非用户不允许我的应用程序使用NotificationCenter,否则如果应用程序在应该发出通知时打开,则不会更新
我希望能够在任意日期将任意数量的NSN通知排入队列。显然,NSN通知只能在我的应用程序打开时接收,这很好。我不知道为每个NSNotification使用一个NSTimer的费用(可能是运行循环中的数百个NSTimer),因此我的解决方案一次只使用一个NSTimer。我希望能够像处理UINotification一样安排和取消NSNotification。您可以尝试
NSTimer
()。在AppDelegate
中,您可以创建一个类似于didReceiveLocalNotification
方法的方法,以便在触发计时器时执行。另外,创建一个NSUserDefault
,以存储下次需要触发计时器的时间。最后,在要开始倒计时的点,获取从当前时间到要触发事件的时间的时间间隔,并设置计时器
因此,在AppDelegate中,注册默认值并实现notifyPlayer
:
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
let userDefaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.registerDefaults(["alertTime": NSDate()]) //initial value
return true
}
func notifyPlayer() {
// Calculate points and notify relevant viewcontroller to alert player.
let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
let lastNotificationTime = defaults.objectForKey("alertTime") as! NSDate
let nextNotificationTime = lastNotificationTime.dateByAddingTimeInterval(86400)
defaults.setObject(nextNotificationTime, forKey: "alertTime")
}
}
现在,在任何有意义的地方设置计时器,可能是在应用程序的初始视图控制器中
class InitialVewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
let savedTime = defaults.objectForKey("alertTime") as! NSDate
let countDownTime = savedTime.timeIntervalSinceNow
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
NSTimer.scheduledTimerWithTimeInterval(countDownTime,
target: appDelegate,
selector: #selector(AppDelegate.notifyPlayer()),
userInfo: nil,
repeats: false)
}
}
它并不完美,因为我还没有测试过它,但我认为这个概念会对你有用
编辑:澄清一下,这将解决用户在使用应用程序时提醒用户的问题,但在应用程序未使用时不会做任何事情。我不知道在未授予权限时如何向用户发送通知中心通知。您可以尝试
NSTimer
()。在AppDelegate
中,您可以创建一个类似于didReceiveLocalNotification
方法的方法,以便在触发计时器时执行。另外,创建一个NSUserDefault
,以存储下次需要触发计时器的时间。最后,在要开始倒计时的点,获取从当前时间到要触发事件的时间的时间间隔,并设置计时器
因此,在AppDelegate中,注册默认值并实现notifyPlayer
:
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
let userDefaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.registerDefaults(["alertTime": NSDate()]) //initial value
return true
}
func notifyPlayer() {
// Calculate points and notify relevant viewcontroller to alert player.
let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
let lastNotificationTime = defaults.objectForKey("alertTime") as! NSDate
let nextNotificationTime = lastNotificationTime.dateByAddingTimeInterval(86400)
defaults.setObject(nextNotificationTime, forKey: "alertTime")
}
}
现在,在任何有意义的地方设置计时器,可能是在应用程序的初始视图控制器中
class InitialVewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
let savedTime = defaults.objectForKey("alertTime") as! NSDate
let countDownTime = savedTime.timeIntervalSinceNow
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
NSTimer.scheduledTimerWithTimeInterval(countDownTime,
target: appDelegate,
selector: #selector(AppDelegate.notifyPlayer()),
userInfo: nil,
repeats: false)
}
}
它并不完美,因为我还没有测试过它,但我认为这个概念会对你有用
编辑:澄清一下,这将解决用户在使用应用程序时提醒用户的问题,但在应用程序未使用时不会做任何事情。我不知道在未授予权限的情况下,如何向用户发送通知中心通知。在用户打开应用程序时,简单地检查他们最后一次玩游戏的时间并扣减必要的分数,这样做不行吗,我还想介绍一下当应用程序打开时扣分的情况。这会有什么变化?运行时,设置计时器(或使用
UIApplicationsSignificantTimeChangeNotification
)。当你从后台回来或被启动时,检查你离开多久了。毫无疑问,没有理由浪费时间和电池寿命来启动你的应用程序只是为了标记“什么都没做”。(请注意,对于StackOverflow来说,对非网站资源的推荐,如库推荐,是离题的。)因此,应用程序不会被唤醒去做任何额外的工作。我的实现基本上就是您描述的。哎呀!我并不是想发布一些离题的东西。在他们打开应用程序时,简单地检查他们上次玩的时间并扣减必要的分数难道不起作用吗?我这样做了,我还想涵盖在应用程序打开时扣减分数的情况。这会改变什么?运行时,设置计时器(或使用UIApplicationsSignificantTimeChangeNotification
)。当你从后台回来或被启动时,检查你离开多久了。毫无疑问,没有理由浪费时间和电池寿命来启动你的应用程序只是为了标记“什么都没做”。(请注意,对于StackOverflow来说,对非网站资源的推荐,如库推荐,是离题的。)因此,应用程序不会被唤醒去做任何额外的工作。我的实现基本上就是您描述的。哎呀!我不是有意要发表一些离题的东西。