有一個(gè)這樣的需求狸棍,例如要求我們每天晚上12點(diǎn)的時(shí)候烦秩,刷新一次。
問(wèn)題就來(lái)了:
1刻获、怎樣定時(shí)刷新蜀涨?用本地通知?還是后臺(tái)給予消息蝎毡?
2厚柳、每一個(gè)國(guó)家的時(shí)間不同,是否要注意什么沐兵?
那我就帶著問(wèn)題去思考這個(gè)問(wèn)題别垮?
1、本地通知是可以很好的去實(shí)行扎谎,但是假如用戶把推送關(guān)掉了碳想,反正我一般的應(yīng)用都是關(guān)掉推送的烧董。所以這個(gè)并不能很好的解決這個(gè)問(wèn)題。
2移袍、后臺(tái)給予消息解藻,每天在同一個(gè)時(shí)間給出來(lái),也不太可能葡盗,并不是長(zhǎng)鏈接嘛
3螟左、我想此時(shí),我們應(yīng)該可以換一種思維觅够,每次啟動(dòng)后胶背,我們不都是刷新嘛,就算用戶在那個(gè)時(shí)間點(diǎn)喘先,我們簡(jiǎn)單的加一個(gè)時(shí)間判斷就好了钳吟,假如時(shí)間是在12:00,就異步執(zhí)行這個(gè)操作就好了窘拯。
4红且、至于每一個(gè)國(guó)家,時(shí)間是可以設(shè)置時(shí)區(qū)的涤姊。
根據(jù)以上的問(wèn)題回顧了下本地推送和定時(shí)操作暇番。
本地推送
// 注冊(cè)
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
}
//注冊(cè)本地化
// 初始化本地通知
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
// 通知觸發(fā)時(shí)間
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:3];
// 這邊可以設(shè)置很多屬性,alertBody userInfo
// userinfo 可以設(shè)置 key value
// 注冊(cè)本地通知
[[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取出來(lái)進(jìn)行對(duì)比
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è)問(wèn)題希俩,發(fā)現(xiàn)假如那個(gè)定時(shí)刷新的頁(yè)面,在我們需要的那個(gè)時(shí)間處于后臺(tái)诬留,而且沒(méi)有被殺死斜纪,用戶又馬上回來(lái)啦,此時(shí)立馬想到兩個(gè)問(wèn)題啦:
- 1文兑、此時(shí)這種情況是刷新不到的我們的任務(wù)的。
- 2腺劣、那個(gè)頁(yè)面總是在核對(duì)時(shí)間是有問(wèn)題的绿贞,肯定是有問(wèn)題的。
所以重新想橘原,有沒(méi)有更好的方法呢籍铁?繼續(xù)思考下涡上,一個(gè)雞賊的方法,每次進(jìn)入系統(tǒng)的時(shí)候拒名,判斷一下是不是當(dāng)天距離那個(gè)時(shí)間點(diǎn)之后的第一次進(jìn)入吩愧,如果是,則系統(tǒng)通知下增显,需要刷新的地方刷新雁佳,貌似問(wèn)題就這樣解決了。如有好的方法歡迎告知同云,哈哈糖权。
備注:
回顧通知這塊的知識(shí),看了下iOS開(kāi)發(fā)系列--通知與消息機(jī)制非常詳細(xì)炸站。