iOSスケジュールされたLocalNotificationをキャンセルする方法
-
28-10-2019 - |
質問
3つのカウントダウンタイマーがあるiPhoneアプリを作成しています。それぞれがユーザーによって開始されたときにローカル通知を設定します(ibaction)。
私の質問は、コードの他の場所に既存のローカル通知をどのように参照できるかということです。このように直接参照してみました。
[[UIApplication sharedApplication] cancelLocalNotification:myNotification];
通知をスケジュールしてユーザーに追加した後、このようにデフォルト:
In my scheduling method...
[myDefaults setObject:myNotification forKey:@"myNotification"];
...
And in my cancelling method...
NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];
[[UIApplication sharedApplication] cancelLocalNotification:[myDefaults objectForKey:@"myNotification"]];
[myDefaults synchronize];
私のアプリは、上記のCancellocalNotification行でSigaBRTエラーでクラッシュします。誰かが私がどこで間違っているのか教えてもらえますか?
前もって感謝します!
解決
わかりました、私は段階的にそれを考えた後、私の問題に対する実用的な解決策を見つけました。私は問題全体を完全に間違った方法で進んでいたことがわかりました!
基本的に、アプリがアクティブなときにローカル通知は必要ないことがわかりました(つまり、フォアグラウンドで)。したがって、タイマーの開始時にローカル通知を設定する代わりに、アプリが辞任しようとしているときに関連する通知を設定します。
私はこれらのオブザーバーを私のviewdidloadに入れました。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appWillResign) name:UIApplicationWillResignActiveNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appIsActive) name:UIApplicationDidBecomeActiveNotification
object:nil];
また、AppWillSignメソッドでは、アクティブなタイマーの通知を設定します。アプリが再開されたら、すべての通知をキャンセルするだけです。
[[UIApplication sharedApplication] cancelAllLocalNotifications];
要するに、コードの他の場所で通知を参照する必要はありません。それらが絶対に必要なときにのみセットアップします:アプリの背景があるとき!そのため、後で使用するためにどこにでも「保存」する必要はありません。
@Learnerの貢献に感謝します、あなたは私を正しい軌道に乗せるのを手伝ってくれました! :d
他のヒント
予測することは困難ですが、一般的にSigabrtは、NILまたはリリースされたオブジェクトにアクセスすると発生します。
だから [[UIApplication sharedApplication] cancelLocalNotification:myNotification];
`
それはゼロである「mynotification」である可能性があります。
または場合 [myDefaults objectForKey:@"myNotification"] returns nil
.
そのための可能性のあるresasonはそれである可能性があります NsUserDefaults
クラス参照の次の段落に記載されているように、少数のデータ型のみが保存されます。
デフォルトのオブジェクトは、プロパティリスト、つまり、NSDATA、NSSTRING、NSNUMBER、NSDATE、NSARRAY、またはNSDICTIONARYのインスタンス(またはコレクションのインスタンスのインスタンス)である必要があります。他の種類のオブジェクトを保存する場合は、通常、NSDATAのインスタンスを作成するためにアーカイブする必要があります。
私が予測できるのはそれです myNotification
保存されているのはタイプです UILocalNotification.
したがって、おそらくデータの保存は失敗しています。
コードをさらにデバッグして、上記のケースが機能していない場合は投稿してください。
修正は、と同期することです NSUserDefaults
. 。オブジェクトを設定しただけで、同期しなかったと思います。もしそうなら、オブジェクトは実際には保存されません NSUserDefaults
, 、むしろ地元の人だけです NSUserDefaults
物体。あなたがする必要があるのは電話です [defaults synchronize]
オブジェクトを設定した後。