2016-04-16 4 views
0

私のアプリ(接頭辞「AAS」)は、基本的に、プレイしていない毎日ユーザーがポイントを失うゲームです。私はUILocalNotificationsを使用して、ユーザーにポイントを失ったことを知らせ、プレイバックに招待します。私のView Controllerの1つは、ポイントが変更されたときに表示され、アプリが開いている間にUILocalNotificationが起動されたときにNSNotificationを送信するのは簡単です。スケジュールされた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) 
     } 
    } 
} 

無効になった後にアプリケーションを再度開くと、クラスの1つが失われたポイントの数が計算されます。すばらしいです。 Bulletproofは、ユーザーが自分のアプリケーションでNotificationCenterを使用できないことを除いて、通知が発生したときにアプリが開いていれば更新されません。このケースでは、自分のアプリが開いている間にUILocalNotificationをある程度まで模倣する予定の通知キューを独自に実装しました。しかし、私は誰かが以前にこの問題を抱えていたに違いないと思っていました。おそらくそれのためのココアポッドがあります。

私のコミュニティへの質問は誰かがタイムドNSNotificationsを発送するライブラリを知っていますか?または、この問題に対する別のアプローチですか?

https://github.com/JamesPerlman/JPScheduledNotificationCenter

私はプロで符号化され、十分にテストされ、機能豊富なものを使用してみたいHere's my solution, which is barebones and works for the purpose I need:(私はこの要求がSOの話題ではないことに気付きました)

編集: 任意の日付に発射されるNSNotificationの任意の量をキューに入れたいと思っています。明らかに、NSNotificationsは開いている間だけ私のアプリケーションで受信することができます。それは問題ありません。私はNSNotificationごとに1つのNSTimer(実行ループ上の何百ものNSTimerになる可能性があります)を使用することの費用を知らないので、私のソリューションは一度に1つのNSTimerしか使用しません。 UINotificationsのようにNSNotificationをスケジュールしたり取り消したりできます。

+1

アプリを開いてその時点で必要なポイントを差し引いたときに最後にプレイした時間を確認するだけでは機能しませんか? –

+0

私はそれを行い、また、アプリが開いている間にポイントが差し引かれた場合についても説明したいと思います。 – jperl

+0

どのように変化しますか?あなたが走っている時は、タイマーをセットするか(または 'UIApplicationSignificantTimeChangeNotification'を使います)。あなたがバックグラウンドから戻ったり、立ち上げられたりしたら、どれくらい離れていたかを確認してください。 「何もしなかった」とマークするだけで、アプリを起動する時間と電池寿命を無駄にする理由はまったくありません。 (ライブラリの推奨事項などのオフサイトリソースの推奨事項は、StackOverflowの話題にはならないことに注意してください。) –

答えて

2

NSTimerNSTimer 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) 
    } 
} 

私はそれをテストしていないように、それは、完璧ではないのですが、私は概念があなたのために働くだろうと思います。

編集:明らかにするために、これはあなたがアプリを使っている間にユーザに警告するという問題を解決しますが、アプリが使用されていないときは何もしません。私は、許可が与えられていないときにユーザーに通知センターの通知を送信する方法について知らない。

関連する問題