關(guān)于站內(nèi)消息的頁(yè)面
這個(gè)頁(yè)面的功能,從代碼角度上來(lái)看历恐,并沒有完成。
- 上圖上部4個(gè)按鈕的操作代碼并沒有實(shí)現(xiàn)专筷。
- (IBAction)topButtonClick:(id)sender
{
if (sender) {
if (sender == _btn_tiezi || [sender tag] == 1001) {
//帖子消息
}
else if (sender == _btn_tanyou || [sender tag] == 1002) {
//壇友互動(dòng)
}
else if (sender == _btn_tanyou || [sender tag] == 1003) {
//系統(tǒng)提醒
}
else if (sender == _btn_gonggong || [sender tag] == 1004) {
//公共消息
}
}
}
相關(guān)的實(shí)現(xiàn)是空的弱贼。
- badge的變化也沒有實(shí)現(xiàn)。
另外有一個(gè)名為DialogListViewController的VC磷蛹,有一部分相關(guān)的站內(nèi)信息的相關(guān)操作哮洽,包括數(shù)據(jù)查詢以及badge的更新。但這個(gè)VC沒有任何地方調(diào)用弦聂。
因?yàn)橐院笮枰肑Push來(lái)實(shí)現(xiàn)消息的推送鸟辅。所以這一部分需要更多的設(shè)計(jì)與考慮。
暫時(shí)就調(diào)查這些莺葫。
6.03 更新
來(lái)看看網(wǎng)頁(yè)版的消息界面匪凉,有消息,我的帖子捺檬,壇友互動(dòng)再层,以及系統(tǒng)提醒。
現(xiàn)在的狀態(tài)是:
手機(jī)iOS上的四個(gè)按鈕:
帖子消息:應(yīng)該對(duì)應(yīng)我的帖子
壇友互動(dòng):對(duì)應(yīng)壇友互動(dòng)
系統(tǒng)提醒:對(duì)應(yīng)系統(tǒng)提醒堡纬。
公共消息:暫時(shí)不知道對(duì)應(yīng)哪些聂受。
而手機(jī)上TableView顯示的消息對(duì)應(yīng)的是論壇的消息。
現(xiàn)在iOS上部4個(gè)按鈕的功能都無(wú)法實(shí)現(xiàn)烤镐,原因如下:
- iOS部分沒有實(shí)現(xiàn)相關(guān)的API去得到這些信息蛋济。
- BigApp插件也沒有提供相應(yīng)的php api。
消息部分有相關(guān)的代碼
- BigApp插件提供了checknewpm.php API
- 對(duì)應(yīng)這個(gè)API炮叶,iOS實(shí)現(xiàn)中有checkNewMessageComeWithResultBlock函數(shù)去查詢碗旅。
該函數(shù)僅通知有幾個(gè)新用戶發(fā)送消息給你渡处,并不提供有幾條新消息發(fā)送給你。
需要知道有多少條新消息祟辟,需要調(diào)用request_DialogListWithResultBlock函數(shù)去調(diào)用mypm.php去得到所有的消息列表医瘫,然后再發(fā)現(xiàn)每一個(gè)用戶發(fā)給你的新消息個(gè)數(shù)。
現(xiàn)在消息更新的機(jī)制是這樣的
在MainViewController中旧困,定義了一個(gè)計(jì)時(shí)器醇份,每60秒會(huì)觸發(fā)一次,調(diào)用:
- (void)doCheckIfHasNewMessage
{
[[Clan_NetAPIManager sharedManager] checkNewMessageComeWithResultBlock:^(id data, NSError *error) {
if (!error) {
NSNumber *results = [data valueForKey:@"newpm"];
if (!isNull(results) && results.intValue >= 1) {
//有新消息
[[NSUserDefaults standardUserDefaults] setObject:results forKey:@"KNEWS_MESSAGE"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"KNEWS_MESSAGE_COME" object:nil];
} else {
//無(wú)新消息
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:0] forKey:@"KNEWS_MESSAGE"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"KNEWS_MESSAGE_COME" object:nil];
}
} else {
}
}];
}
消息個(gè)數(shù)會(huì)保存在@"KNEWS_MESSAGE"的鍵值中吼具。同是發(fā)送一個(gè)@"KNEWS_MESSAGE_COME"的通知僚纷。MainViewController會(huì)監(jiān)聽這個(gè)通知,并更新Tabbar的Badge標(biāo)記個(gè)數(shù)馍悟。
當(dāng)點(diǎn)擊用戶的消息之后畔濒,會(huì)彈出用戶的消息列表剩晴,此時(shí)锣咒,會(huì)更新Discuz數(shù)據(jù)庫(kù),告知該消息被閱讀(不知道這一步怎么實(shí)現(xiàn)的赞弥?)毅整,也就是說(shuō),下一次消息輪詢時(shí)绽左,消息的個(gè)數(shù)變0悼嫉。然后監(jiān)聽器處罰,然后更新Tabbar的Badge標(biāo)記個(gè)數(shù)拼窥。
新的方案:
取消定時(shí)器的消息輪詢戏蔑,當(dāng)接到推送時(shí),再去進(jìn)行消息查詢鲁纠。
因此需要在App打開狀態(tài)总棵,后臺(tái)狀態(tài)以及關(guān)閉狀態(tài)接到推送時(shí),進(jìn)行消息查詢改含。
通知及監(jiān)聽系統(tǒng)保留情龄,不過(guò)直接用直接用request_DialogListWithResultBlock獲取新消息個(gè)數(shù),Tabbar顯示新消息個(gè)數(shù)捍壤。
消息列表中骤视,每個(gè)Cell顯示當(dāng)前用戶的新消息個(gè)數(shù)。
當(dāng)點(diǎn)擊Cell是鹃觉,需要更新當(dāng)前Cell的新消息個(gè)數(shù)以及Tabbar的消息個(gè)數(shù)专酗。
關(guān)于JPush的Alias
使用uid作為JPush的Alias,每當(dāng)用戶登錄時(shí)盗扇,設(shè)置Alias笼裳,具體的在
+ (void)saveToLocal
{
NSData *date = [NSKeyedArchiver archivedDataWithRootObject:[UserModel currentUserInfo]];
[[NSUserDefaults standardUserDefaults] setObject:date forKey:kKEY_CURRENT_USER];
if ([UserModel currentUserInfo].logined &&
[UserModel currentUserInfo].uid != nil &&
[[UserModel currentUserInfo].uid isEqualToString:@""]) {
[JPUSHService setAlias:[UserModel currentUserInfo].uid callbackSelector:@selector(tagsAliasCallback:tags:alias:) object:self];
} else {
[JPUSHService setAlias:@"" callbackSelector:@selector(tagsAliasCallback:tags:alias:) object:self];
}
}
大概就是登錄狀態(tài)唯卖,設(shè)置uid為JPush的alias,否則把Alias設(shè)置為空字符串躬柬。
關(guān)于JPush的Badge
服務(wù)器端采用Badge+1策略拜轨。
目前涉及到消息和好友邀請(qǐng)兩種類型的推送,但JPush僅支持一個(gè)總數(shù)允青。因此App Badge顯示為兩個(gè)推送的總和橄碾。
站內(nèi)信Tabbar顯示消息的Badge
我的Tabbar顯示好友的Badge
當(dāng)這些消息被閱讀后,再重新設(shè)置對(duì)應(yīng)的Tabbar的Badge颠锉,App的Badge法牲,同是更新JPush的Badge值。
在具體實(shí)現(xiàn)的過(guò)程中的問(wèn)題:
Discuz編碼和插件編碼的問(wèn)題琼掠。一定要統(tǒng)一拒垃,我們最終確定用中文簡(jiǎn)體UTF8。如果混了瓷蛙,或者自己轉(zhuǎn)換過(guò)編碼悼瓮,有可能會(huì)像我一樣遇到各種莫名其妙的問(wèn)題。
Discuz針對(duì)消息艰猬,僅能獲得有多少個(gè)用戶向你發(fā)送了新消息横堡,而不能獲得某一個(gè)用戶發(fā)給你多少條新消息。因此冠桃,Badge的顯示是一個(gè)用戶顯示為一條新消息 (而不管他發(fā)給你多少條新消息)命贴。這就使的Badge+1的策略不能實(shí)行。
之前提到過(guò)的食听,好友邀請(qǐng)的Badge和消息的Badge分開胸蛛,而JPush僅有一個(gè)全局的。
內(nèi)部調(diào)用Http Request詢問(wèn)多少條新消息樱报,有時(shí)會(huì)失敗葬项。
因此這個(gè)Badge的顯示,有時(shí)候是不正確的肃弟。