2016-04-16 5 views
0

Мое приложение (префикс «AAS») - это в основном игра, в которой пользователи теряют очки каждый день, когда они не играют. Я использую UILocalNotifications, чтобы предупредить пользователя о том, что они потеряли очки, и пригласить их вернуться к игре. Один из моих диспетчеров отображает, когда точки изменились, и довольно просто отправить NSNotification, когда UILocalNotification запущена, когда приложение открыто).Запланированная NSNotification (вместо UILocalNotification) ... Быстрые решения?

func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) { 
    if notification.userInfo != nil { 
     if let notificationName = notification.userInfo![AASNotification.ActionKey] as? String { 
      NSNotificationCenter.defaultCenter().postNotificationName(notificationName, object: nil, userInfo: nil) 
     } 
    } 
} 

Когда приложение будет вновь открыт после того, как неактивный, один из классов вычисляет, сколько точек теряются. Отлично. Пуленепробиваемый, за исключением случаев, когда пользователь запрещает моему приложению использовать NotificationCenter, приложение не будет обновляться, если оно открыто, когда уведомление должно срабатывать. В этом случае я написал собственную реализацию очереди времени ожидания, которая в некоторой степени имитирует UILocalNotification, пока мое приложение открыто. Но я подумал, что у кого-то должна была быть эта проблема раньше, и, возможно, для нее есть кокоапод.

Итак, мой вопрос сообществу, знает ли кто-нибудь о библиотеке, которая отправляет временные NSNotifications? Или другой подход к этой проблеме? Here's my solution, which is barebones and works for the purpose I need:

https://github.com/JamesPerlman/JPScheduledNotificationCenter

Я хотел бы использовать тот, который был закодирован профессионалом и хорошо испытанный и богатые. (мне сообщили, что этот запрос отключен от темы для SO.)

Редактирование: Я хочу, чтобы у вас была возможность поставить в очередь любое количество NSNotifications, которое будет запущено в произвольные даты. Очевидно, что NSNotifications может быть получен только моим приложением, пока оно открыто, это нормально. Я не знаю расходов на использование одного NSTimer для каждой NSNotification (может быть сотни NSTimers все в цикле запуска), поэтому в моем решении используется только один NSTimer за раз. Я хочу иметь возможность планировать и отменять NSNotifications так же, как вы можете делать с помощью UINotifications.

+1

не будет работать, чтобы просто проверить последний раз, когда они играли, когда они открывают приложение и вычитают необходимые очки в это время? –

+0

Я делаю это, и я также хочу осветить случай, когда очки вычитаются, пока приложение открыто. – jperl

+0

Как это что-то меняет? Когда вы работаете, установите таймер (или используйте 'UIApplicationSignificantTimeChangeNotification').И когда вы вернетесь с фона или запустите, проверьте, как долго вы отсутствуете. Определенно нет причин тратить время и время автономной работы, запуская ваше приложение, чтобы отметить «ничего не сделал». (Обратите внимание, что рекомендации для ресурсов вне сайта, такие как рекомендации библиотеки, неактуальны для StackOverflow.) –

ответ

2

Вы можете попробовать NSTimer (NSTimer class reference). В вашем 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) 
    } 
} 

Это не идеальный вариант, поскольку я его не тестировал, но я думаю, что концепция будет работать на вас.

Редактировать: Чтобы уточнить, это решит вашу проблему оповещения пользователя во время использования приложения, но ничего не сделает, если приложение не используется. Я не знаю, как отправить уведомления о уведомлениях уведомлений пользователей, когда разрешение не было предоставлено.

 Смежные вопросы

  • Нет связанных вопросов^_^