查看: 1288|回复: 6
|
如果我要寫一個text/messaging的 app
[复制链接]
|
|
hi,
我最近剛開始學寫ANDROID APP ,
看了一遍UDACITY的教學, 終於能寫一些東西出來。
然後 , 我想在我的APP裡面加入一些功能, 比如說text/messaging的功能(類似WHATSAPP/WECHAT)。
可是我暫時沒看到類似的教學。
想問一下
- 方法是將對話都存進MYSQL, 然後再讀取出來?
- 有沒有什麼open source 的library可以用?
- 有一些類似的教學嗎?
不知道有做過類似的APP的大大,能給我一些方向嗎 ?
|
|
|
|
|
|
|
|
发表于 3-5-2016 02:43 PM
|
显示全部楼层
哈哈, 看來不管到了什麽時代, messaging 的軟體還是很夯啊。
我是沒有寫android apps 的經驗啦, 但是在8~9年前, 那時MSN Messager(Line/WeChat 的老前輩)
還沒沒落時, 用 Web 寫聊天室其實還蠻熱的, 稍微對Coding有些興趣的人, 都會去嘗試一下。
具體技術的實現, 大致上就你第一點的那樣。
我打了一句話, 軟體就把我的話輸入進資料庫, 另一方在讀取出來。
這看似沒什麽問題, 但其實在現實世界并不可行,原因有兩個
- 對方要怎樣知道他有訊息?
- 所有的對話記錄都會被看光光。
關於問題一, 你試想看看, 今天如果我把訊息送出去, 對方要怎樣知道他有未讀訊息?
一般我們的做法就是設定一個timer, 然後固定每隔幾秒就讀資料庫一下, 然後這種做法也有很多現實上的問題存在, 例如最壞情況我寄出的訊息他要隔5秒才收到。
或者是, 你在答一句的時候, 下一秒你的畫面就會POP出2~3句話, 然後最下面才show你的東西。
然後更嚴重的是, 當你的聊天系統上綫時, 你會發現你的DB的loading很大, 因爲一對使用者在對話的過程中, 在1分鐘内可能會有10~20次的DB request. 然後使用者一定不會簡簡單單跟一個人對話, 他會開兩個以上的聊天室跟不同人對話。
也就是説, 你的一個使用者可能最嚴重會吃掉你5~10%的DB connection handle 都不爲過。
關於問題二,
假設你的使用者有一對情侶, 他們之間的甜言蜜語都記錄在DB裏面, 一天你的DB被黑客闖入, 所有的對話記錄都被竊走。
那你八成會死的很難看, 隱私權在國外是被重視的, 如果你有去看WeChat那些T & C, 裏面就有清楚注明對話内容會被保留做研究用途之類的。
至於用作什麽研究。。。
資料探勘 -> 廣告推銷
人工智慧 -> 機器人聊天等
就因爲在技術上的難題
Web Messager一直風靡不起來的主因。
其實比較正確的做法, 則是采取P2P的方式
就是一對使用者, 他們之間的對話衹有他們兩位看得到。
具體的做法大致上每個apps要分兩個部分, 一個是listen, 一個是push,
具體怎樣做。。。
很抱歉我不會 XD。
這篇大概是給你對messaging 的軟體有個 breif 的瞭解。
Apps上面的可用的工具很明顯比Web 的技術多了很多。你可以慢慢研究。
祝學習愉快。
|
|
|
|
|
|
|
|
楼主 |
发表于 3-5-2016 04:24 PM
|
显示全部楼层
我也是這樣想,全部存進資料庫,感覺不是很聰明,
1.對方要怎樣知道他有訊息?
我想這個可以用Websocket來做, 他能夠一直listen這些event, 比如有什麼新的message他就能push一個state過去。
2.所有的對話記錄都會被看光光。
剛你說P2P, 讓我想起了webrtc 應該蠻適合做CHATROOM的 . 不過,用Webrtc ,他的資料不會存起來也是一個問題,也許都存在手機 LOCAL端的sqlite DB就好.
感謝你
|
|
|
|
|
|
|
|
发表于 3-5-2016 09:00 PM
|
显示全部楼层
雷洛 发表于 3-5-2016 04:24 PM
我也是這樣想,全部存進資料庫,感覺不是很聰明,
1.對方要怎樣知道他有訊息?
我想這個可以用Websocket來做, 他能夠一直listen這些event, 比如有什麼新的message他就能push一個state過去。
2.所有的對話 ...
对P2P没有研究
不过用websocket之后就不需要有资料库了, 但是前提是双方都listen着channel
某些情况下...资料库还是扮演着重要角色,
1. 比如对方不在线上时, 另一方要send offline messages...
2. 一些messenger喜欢显示最后几句对话...
小弟前些时候也玩了一下websocket, idea也是messaging apps, 整个过程没有牵涉到资料库
大概就是:
1. 首先server有一个通用的online-status channel, 每个人online都会自动subscribe这个channel, 之后每个人上线下线都会broadcast给全部人
2. 再来就是每个用户上线之后都会subscribe自己的channel, 比如channel-user-[id]
如果user-01想要跟user-02对话, 就把message push到对方的channel, channel-user-02
user-02就会收到类似 { from: 01, message: 'xxxx' } 的message, 前端就自己handle显示方式
3. 小弟也做了group chat的feature, 具体情况忘记了, 应该只是keep着user id在application level,当有message时会broadcast到group里面的每个user, 所以users会收到类似{ type: 'group', group: [group-id], from: [user-id], message: 'xxxx' }
为什么会弄以上的东西, 纯粹是因为当时想学websocket & playframework, messaging只是闹着玩的, 实际情况应该考虑带更多东西
|
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 4-5-2016 10:08 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 7-5-2016 01:08 PM
|
显示全部楼层
本帖最后由 kingdom_manga 于 7-5-2016 01:10 PM 编辑
我想另外个方式是使用 Google cloud messaging https://developers.google.com/cloud-messaging/ 告诉手机有信息,前者是那手机和App的notification要开着和好像要有自己的server。 我忘了在那读过,有文章说到因为手机的电池有限,用websocket / timing 来运作的话会快速用完手机电池。 |
|
|
|
|
|
|
|
发表于 6-6-2016 01:45 PM
|
显示全部楼层
Android 里面本身就有一个东东来收push message了。。但是前提是user 电话里面需要有play store。
如果没有的话。。你的app就是废了的。
而且那个东东是real time的~ 你一送。它就能马上收到。但是如果哪个app已经被android给terminate在backend跑得话,就有机会可能收不到message。但是如果user在开回那个app就可以收到之前的message了。
那个东东叫GCM |
|
|
|
|
|
|
| |
本周最热论坛帖子
|