Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 计划的NSNotification(而不是UILocalNotification)。。。快速解决方案?_Ios_Swift_Nstimer_Uilocalnotification_Nsnotification - Fatal编程技术网

Ios 计划的NSNotification(而不是UILocalNotification)。。。快速解决方案?

Ios 计划的NSNotification(而不是UILocalNotification)。。。快速解决方案?,ios,swift,nstimer,uilocalnotification,nsnotification,Ios,Swift,Nstimer,Uilocalnotification,Nsnotification,我的应用程序(前缀“AAS”)基本上是一个游戏,用户每天不玩就会丢分。我使用UILocalNotifications来提醒用户他们丢了分数,并邀请他们重回赛场。我的一个视图控制器在点发生更改时显示,并且在应用程序打开时触发UILocalNotification时发送NSNotification非常简单) 当应用程序处于非活动状态后重新打开时,其中一个类会计算丢失的点数。伟大的防弹,除非用户不允许我的应用程序使用NotificationCenter,否则如果应用程序在应该发出通知时打开,则不会更新

我的应用程序(前缀“AAS”)基本上是一个游戏,用户每天不玩就会丢分。我使用UILocalNotifications来提醒用户他们丢了分数,并邀请他们重回赛场。我的一个视图控制器在点发生更改时显示,并且在应用程序打开时触发UILocalNotification时发送NSNotification非常简单)

当应用程序处于非活动状态后重新打开时,其中一个类会计算丢失的点数。伟大的防弹,除非用户不允许我的应用程序使用NotificationCenter,否则如果应用程序在应该发出通知时打开,则不会更新。对于本例,我编写了自己的定时通知队列实现,在我的应用程序打开时,在一定程度上模拟UILocalNotification。但我想,一定有人以前有过这个问题,也许有一个椰子荚可以解决这个问题

所以我要问社区的问题是,有人知道有一个库可以发送定时通知吗?还是用不同的方法来解决这个问题

我想使用一个由专业人士编写的、经过良好测试且功能丰富的软件。(我知道该请求与SO无关。)

编辑:
我希望能够在任意日期将任意数量的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来说,对非网站资源的推荐,如库推荐,是离题的。)因此,应用程序不会被唤醒去做任何额外的工作。我的实现基本上就是您描述的。哎呀!我不是有意要发表一些离题的东西。