問題は、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];
これまでのところ、これで問題はありません。うまくいけば、これは誰かを助けるでしょう。