線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4924
推到 Plurk!
推到 Facebook!

GCM 的認知 與執行

答題得分者是:aftcast
boy330077
一般會員


發表:39
回覆:59
積分:19
註冊:2009-10-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-01-28 13:17:21 IP:211.20.xxx.xxx 訂閱
 
出處
: http://nkeegamedev.blogspot.tw/2013/01/gcm.html

我看過很多篇 覺得這篇 這張圖讓我覺得很清楚,但我卻不知道正不正確?

我的認知:
APP 會跟 GCM Server 要一個ID
然後再把 ID給我自己的server

當我的server 要發送訊息給 APP時
把我要傳的訊息 上 ID 給 GCM Server再靠這個ID 找到手機

--------------------------------------------------------------問題
我理解的程度 是
GCM Server 才能知道 要傳給哪支手機
自己的server 是否無法完全取到掉 GCM 無法直接由server推出訊息給 手機

那問題來了 ANDROID IOS 打死不勾結的兩大陣營 同一支APP 需要推播 不就同時要傳給 APNS 也要傳給 GCM?
如果這麼麻煩 像 LINE 那麼多種平台 不就每種平台都要寫一次 與個平台專用的 MessageServer 溝通? 然後再傳去給手機?

換個角度想 如果 不是透過這樣的方式 難道他們有方法 可以直接與 向註冊的手機溝通?

不知道有沒有前輩能幫忙解惑

編輯記錄
boy330077 重新編輯於 2015-01-28 13:18:22, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-01-28 16:39:31 IP:114.32.xxx.xxx 訂閱
簡答:  是的,不同平台分開寫。

平台要說多,也不多。目前主要的就android,ios,win phone。其他再小的…我想line應該也沒實作…


詳答的話… 就分成 android 上其實是可以自己實作,但想delphi/cb 我想…難上難難。因為java寫都難了。不要去想。另,ios 理當是不讓你在背景裡搞service來處理push。一切的關鍵都在 「當app在非running的情形下」"誰"有能力叫(通知)app起來? 「誰」就是 gcm,apn。是系統本身的實作。

註: 我也是自己開發不同平台中…但我主要用的是 swif/objc 與 java 來寫的app。
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
JamesJuan
中階會員


發表:2
回覆:76
積分:80
註冊:2003-04-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-01-28 17:32:48 IP:59.127.xxx.xxx 未訂閱
我們公司為了節省人力,是用 Delphi 開發 app for Android & iOS

前端 App 的部分,用 class 把 GCM、APN 接收端的部分封裝起來,這樣 App 在開發的時候只要使用就好,不需要知道實做原理

後端 Server 發送給 GCM Server、APN Server 的部分,透過統一制訂資料庫格式,撰寫一支通用的 Service(use FireDAC),也可以提供給不同的產品(App 後端)作為發送訊息使用,不需要重複撰寫,發送的效能調校也只需要調整這支 Service 就好

利用這樣的作法,我們已經完成了 6 支 App 的開發 for Enterprise


boy330077
一般會員


發表:39
回覆:59
積分:19
註冊:2009-10-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-01-29 21:26:53 IP:114.46.xxx.xxx 訂閱
先感謝兩位前輩指導

---------------------------
回蕭大

上了line的官網
mobile 的部分有 android iphone blackberry windowsPhone NokiaAshs FirefoxOS


雖然只有6個 不算多 但我的意思是 多了一個系統 就要重新再來過,沒辦法直接與手機做溝通就是了?

--------------------------
回 JJ 大

才疏學淺的我,聽起來像是這樣:

1. 把與 GCM 、 APN 溝通的部分 謝成類似原件的東西 只管使用 裡面不管怎麼搞
2. Serviec 在紀錄 手機的id 時 必須記錄 他是重 gcm來的 還是apn來的 這樣我在傳送訊息時 才知道傳給誰的意思?

--------------------------
重新整理問題:

1. 只要關於推播,必定經過 那個平台的 官方推播伺服器, 我們沒有能力直接靠ID找到手機 ?
2. 大陸鎖FB 、 VPN 、 甚至聽說鎖 GOOGLE 不知道 推播 是否會受到影響?
3. 推播 我已經實作, 有發現 跟GCM 索取的ID 似乎一樣,不需每次開啟程式都去索取 並告知我的伺服器?




編輯記錄
boy330077 重新編輯於 2015-02-02 08:46:19, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2015-02-06 18:42:21 IP:36.229.xxx.xxx 訂閱
關於你的問題,我想你是希望能夠自己做 "手機上" 的push server 嗎?  換句話說,就是不想用 gcm ,也不想用 apn,想要自己搞個server 掛在 手機上(而且是不管什麼手機上)。 

如果你是那樣想的,我真的只能和你說,至少 ios 上的,你就別期待了。android上或是別的系統,或許還有可行 ( 應該說android上是可行的,只是難,就如 parse 這家公司的api ,就是在android上run他自己的 push server)。但即使這些ios外的系統是可行的,但也是不容易的。因為你要考量它必需是一個service的程式,也就是說在背景下可以run的程式。進一步,當user關手機(真的關電源的那種關) 後,再度開手機,你也要確保你的service 會起來,不能期待user再去執行你的app。於是有非常多的工作要處理。再者,想用 delphi/cb 再 android上開發 service (是永久可run的service,不是暫時性的),我認為幾乎可以說不可能。因為我深入的了解過了。老外最有名的,blong,這朋友也沒辦法。我還可以比他再更好一點,即app關的時候可以run,但…依然沒辦法到 關了手機後,再開可以自動run。當然,我自己用java寫是可以的。

至於 大陸 上跑 gcm,的確有聽說會有擋的問題… 但你能怎麼辦? ? ? 我也不知道…

至於 james 上回說,"不需要重寫",我的理解是,基於 "程式架構上" 可以不用全部重寫。因為他把二種不同的架構給 interface化,或說 oo 化。但它依然要依照 gcm 的通訊協定寫一個 class, apn 的寫一個class,雖然這二個class應該是有同個父親或是interface,我不知道他如何寫,但感覺上是。而他註冊的table,應該也是共一個table,只是某欄位註著說這條記錄是ios或是android。 以上是我自己的寫法,我猜james可能與我類似吧?! 不過這段話都是我自己猜的而已。

手機去 gcm 那裡要的 id,不是總不會變的。只能說他 經常 是不會變的。詳細要讀 android上的說明。在某些情形下,id再次取得會變。不過,你應該會問…我怎麼知道他變了? gcm 在收到上次與這次有變的時候,他會在你送出訊自後的 response 格式中。


Canonical IDs

On the server side, as long as the application is behaving well, everything should work normally. However, if a bug in the application triggers multiple registrations for the same device, it can be hard to reconcile state and you might end up with duplicate messages.
GCM provides a facility called "canonical registration IDs" to easily recover from these situations. A canonical registration ID is defined to be the ID of the last registration requested by your application. This is the ID that the server should use when sending messages to the device.


關於你的第一個問題,就是我上面講的,除非你可以自己實作手機上的service (永久性的,無論開關機,且ios上目前不可能) ,這樣子你就可以開心的從你的 pc server 與你的 mobile 的service 做溝通。


===================引 用 boy330077 文 章===================


1. 只要關於推播,必定經過 那個平台的 官方推播伺服器, 我們沒有能力直接靠ID找到手機 ?
2. 大陸鎖FB 、 VPN 、 甚至聽說鎖 GOOGLE 不知道 推播 是否會受到影響?
3. 推播 我已經實作, 有發現 跟GCM 索取的ID 似乎一樣,不需每次開啟程式都去索取 並告知我的伺服器?





------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
boy330077
一般會員


發表:39
回覆:59
積分:19
註冊:2009-10-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-02-07 18:54:10 IP:111.82.xxx.xxx 訂閱
感謝指導

那我大概知道難度在哪裡了

-------------------------------------

假設真的要做一個server 在手機上 收訊息 似乎會太吃資源或是太吃網路流量?

所以透過 GCM 或是 APN 大概才能解決我的理想狀況

-------------------------------------

關於 GCM ID 會變的事情, 所以 手機 還是每次打開 需要重取 ID 再重新回傳給server?

您說的 會在 respons 裡面 是指說 我的 server 透過 GCM 推撥給手機時, 假設手機的 ID 有改 會回傳給我他的 ID 的意思??( 所以手機上 APP 不用重新給serever?)
編輯記錄
boy330077 重新編輯於 2015-02-07 18:54:47, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2015-02-07 23:38:17 IP:114.32.xxx.xxx 訂閱
是。我的實際經驗是,你可以透過下面的方式得到新id。

1/ 每次都去gcm要,然後每次都回給你的server(pc上的),然後去辦識是否有變化。但前題是你也要有一個 唯一的碼 才知道誰變了。
2/ 你並沒有總是去gcm要。但由於你在某次送訊息給某手機時,gcm回了你說… id 變了。這時候你在去修正你的db,以免下回再用"舊的"。照規範的說法是,舊的可以持續一陣子,但我沒實際去等到底多久會失效。
3/ 你 1 與 2 都處理。

看你想怎麼處理囉… 選1 或選2 或選3。



===================引 用 boy330077 文 章===================

關於 GCM ID 會變的事情, 所以 手機 還是每次打開 需要重取 ID 再重新回傳給server?

您說的 會在 respons 裡面 是指說 我的 server 透過 GCM 推撥給手機時, 假設手機的 ID 有改 會回傳給我他的 ID 的意思??( 所以手機上 APP 不用重新給serever?)
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2024-03-28 21:52:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!