有一個(gè)這樣的需求,例如要求我們每天晚上12點(diǎn)的時(shí)候,刷新一次。
問題就來了:
1、怎樣定時(shí)刷新?用本地通知?還是后臺給予消息?
2、每一個(gè)國家的時(shí)間不同,是否要注意什么?
那我就帶著問題去思考這個(gè)問題?
1、本地通知是可以很好的去實(shí)行,但是假如用戶把推送關(guān)掉了,反正我一般的應(yīng)用都是關(guān)掉推送的。所以這個(gè)并不能很好的解決這個(gè)問題。
2、后臺給予消息,每天在同一個(gè)時(shí)間給出來,也不太可能,并不是長鏈接嘛
3、我想此時(shí),我們應(yīng)該可以換一種思維,每次啟動(dòng)后,我們不都是刷新嘛,就算用戶在那個(gè)時(shí)間點(diǎn),我們簡單的加一個(gè)時(shí)間判斷就好了,假如時(shí)間是在12:00,就異步執(zhí)行這個(gè)操作就好了。
4、至于每一個(gè)國家,時(shí)間是可以設(shè)置時(shí)區(qū)的。
根據(jù)以上的問題回顧了下本地推送和定時(shí)操作。
本地推送
// 注冊
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
}
//注冊本地化
// 初始化本地通知
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
// 通知觸發(fā)時(shí)間
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:3];
// 這邊可以設(shè)置很多屬性,alertBody userInfo
// userinfo 可以設(shè)置 key value
// 注冊本地通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
//接收本地通知(APPDelegate)
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
// 接收后想做的事件
}
//1、移除本地通知
[[UIApplication sharedApplication] cancelAllLocalNotifications];
//2、注意移除 某個(gè)
// 取出全部本地通知
NSArray *notifications = [UIApplication sharedApplication].scheduledLocalNotifications;
// 設(shè)置要移除的通知id
NSString *notificationId = @"idOne";
// 遍歷進(jìn)行移除
for (UILocalNotification *localNotification in notifications) {
// 將每個(gè)通知的id取出來進(jìn)行對比
if ([[localNotification.userInfo objectForKey:@"id"] isEqualToString:notificationId])
{
// 移除我們指定的那個(gè)通知
[[UIApplication sharedApplication] cancelLocalNotification:localNotification];
}
}
注意 :一個(gè)App中,本地通知數(shù)量最多64個(gè),不用的通知要及時(shí)移除;記住添加了,就要及時(shí)移除的習(xí)慣。
定時(shí)的三種方法
// 3s后自動(dòng)調(diào)用self的doSomething方法
[self performSelector:@selector(doSomething) withObject:nil afterDelay:3];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 3s后自動(dòng)執(zhí)行這個(gè)block里面的代碼
});
// 3s 后自動(dòng)調(diào)用self的doSome方法
[NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(doSome) userInfo:nil repeats:NO];
// 還得經(jīng)常注意 滑動(dòng)的時(shí)候
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
此時(shí)接著想到了那個(gè)問題,發(fā)現(xiàn)假如那個(gè)定時(shí)刷新的頁面,在我們需要的那個(gè)時(shí)間處于后臺,而且沒有被殺死,用戶又馬上回來啦,此時(shí)立馬想到兩個(gè)問題啦:
- 1、此時(shí)這種情況是刷新不到的我們的任務(wù)的。
- 2、那個(gè)頁面總是在核對時(shí)間是有問題的,肯定是有問題的。
所以重新想,有沒有更好的方法呢?繼續(xù)思考下,一個(gè)雞賊的方法,每次進(jìn)入系統(tǒng)的時(shí)候,判斷一下是不是當(dāng)天距離那個(gè)時(shí)間點(diǎn)之后的第一次進(jìn)入,如果是,則系統(tǒng)通知下,需要刷新的地方刷新,貌似問題就這樣解決了。如有好的方法歡迎告知,哈哈。
備注:
回顧通知這塊的知識,看了下iOS開發(fā)系列--通知與消息機(jī)制非常詳細(xì)。