0

私はこの問題を個人的に経験したことはありませんが、多くのユーザーにとって、一度に設定された通知が実際には 1 時間後にトリガーされているようです。

通知を生成するために使用するコードは次のとおりです。

UILocalNotification *notif = [[UILocalNotification alloc] init];
notif.fireDate = date;
notif.timeZone = [NSTimeZone defaultTimeZone];
notif.alertBody = @"Alert time!";
notif.alertAction = @"Wake me";

[[UIApplication sharedApplication] scheduleLocalNotification:notif];

かなり標準的。問題が発生したユーザーは、夏時間が設定されている英国時間です。これは何らかのiOSのバグなのだろうか?

4

1 に答える 1

1

問題は、timeZone のキャッシュを保存する iOS に関係していたと思います。3 つの異なる timeZones を使用できるため、この機能は少し混乱します (この半分で混乱しても心配しないでください)。

[NSTimeZone defaultTimeZone];

現在のアプリケーションのデフォルトのタイム ゾーンを返します。デフォルトのタイムゾーンが設定されていない場合、このメソッドは systemTimeZone を呼び出し、システムのタイムゾーンを返します。デフォルトのタイム ゾーンは、アプリケーションが実行されているタイム ゾーンであり、変更することができます (別のタイム ゾーンにいるかのようにアプリケーションを実行することができます)。

[NSTimeZone localTimeZone];

すべてのメッセージを現在のアプリケーションの既定のタイム ゾーンに転送するオブジェクトを返します。ローカル タイム ゾーンは、常にデフォルト タイム ゾーンの現在の状態を表します。ローカル タイム ゾーンは間接的なレベルを追加し、メソッドを呼び出すたびに現在のデフォルト タイム ゾーンであるかのように動作します。

[NSTimeZone systemTimeZone];

システムが現在使用しているタイムゾーンを返します。システム タイム ゾーンを取得すると、それはアプリケーションによってキャッシュされ、後でユーザーがシステム タイム ゾーンを変更しても変更されません。次に systemTimeZone を呼び出すと、最初に取得したのと同じタイム ゾーンが返されます。キャッシュされたオブジェクトをクリアするには、resetSystemTimeZone を呼び出す必要があります。

個人的には、このすべてが私を困惑させました。しかし、そのresetSystemTimeZone方法は興味深いようでした:

アプリケーションがシステム タイム ゾーンをキャッシュした場合、このメソッドはそのキャッシュされたオブジェクトをクリアします。その後 systemTimeZone を呼び出すと、NSTimeZone はシステムのタイム ゾーンを再決定しようとし、新しいオブジェクトが作成されてキャッシュされます。

ユーザーがタイムゾーン間を移動する可能性があり、サマータイムをサポートするタイムゾーンとそうでないタイムゾーンがあり、Apple自身がこれらすべてに進行中の問題を抱えていることを念頭に置いて、論理的な解決策は次のように思われましたこれを可能な限り壊れないようにします

壊れないということは、アプリ全体で systemTimeZone を使用resetSystemTimeZoneし、それについて言及する前に行で使用することを意味しました。

UILocalNotification *notif = [[UILocalNotification alloc] init];
notif.fireDate = date;
[NSTimeZone resetSystemTimeZone];
notif.timeZone = [NSTimeZone systemTimeZone];

これまでのところ、これで問題はありません。うまくいけば、これは誰かを助けるでしょう。

于 2013-12-14T20:35:36.927 に答える