2013-10-31 40 views
0

我沒有親身體驗過這個問題,但似乎對於我的許多用戶來說,一次設置的通知實際上是在一小時後觸發的。UILocalNotification延遲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的錯誤?

+0

你可以有存儲時間問題,因爲你是從另一個變量賦值'fireDate' ...也許你保持它在'CoreData'? – cojoj

+2

'date'等於什麼? –

回答

1

我認爲問題在於iOS存儲timeZone的緩存。此功能是一種誤解,因爲有3個不同的時區,你可以有(如果其中一半混淆你不用擔心):

[NSTimeZone defaultTimeZone];

返回默認的時區當前應用程序。如果沒有設置默認時區,則此方法調用systemTimeZone並返回系統時區。默認時區是應用程序正在運行的時區,您可以更改該時區(以便您可以使應用程序運行,就好像它在不同的時區中一樣)。

[NSTimeZone localTimeZone];

返回的所有郵件轉發到當前應用程序的默認時間區域內的物體。本地時區始終表示默認時區的當前狀態。本地時區添加了一個間接級別,每當您調用一個方法時,它就像是當前的默認時區一樣。

[NSTimeZone systemTimeZone];

返回當前系統所使用的時區。如果您獲得系統時區,它會被應用程序緩存,並且在用戶隨後更改系統時區時不會更改。下一次調用systemTimeZone時,您會返回最初獲得的相同時區。您必須調用resetSystemTimeZone來清除緩存的對象。

這整件事讓我感到困惑。但resetSystemTimeZone方法似乎很有趣:

如果應用程序已緩存系統時區,則此方法將清除該緩存對象。如果您隨後調用systemTimeZone,則NSTimeZone將嘗試重新確定系統時區,並創建並緩存新對象。

由於用戶在時區之間移動的可能性,以及某些時區支持夏令時而有些時區不支持,並且考慮到蘋果公司自己在所有這些方面都存在問題,像邏輯解決方案將儘可能不易破壞

不可破壞意味着我在整個應用程序中使用了systemTimeZone,並且在每次提及它之前都使用了resetSystemTimeZone

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

到目前爲止,我還沒有遇到過問題。希望這會幫助某人。