Android có hỗ trợ thông báo đẩy gần thời gian thực không?


343

Gần đây tôi đã biết về khả năng ứng dụng iPhone nhận được thông báo gần như tức thời cho các thông báo ứng dụng cho ứng dụng .

Điều này được cung cấp dưới dạng thông báo đẩy, giao thức bespoke luôn kết nối dữ liệu với iPhone và gửi các gói nhị phân đến ứng dụng, bật lên cảnh báo cực kỳ nhanh chóng, trong khoảng 0,5 - 5 giây từ ứng dụng máy chủ gửi đến ứng dụng điện thoại thời gian đáp ứng. Điều này được gửi dưới dạng dữ liệu - chứ không phải SMS - trong các gói rất nhỏ được tính như một phần của gói dữ liệu không phải là tin nhắn đến.

Tôi muốn biết nếu sử dụng Android, có một cơ sở tương tự hay không, liệu có thể thực hiện một cái gì đó gần với điều này bằng API Android hay không. Để làm rõ, tôi định nghĩa tương tự như:

  • Không phải tin nhắn SMS, nhưng một số giải pháp điều khiển dữ liệu
  • Thời gian thực nhất có thể
  • Có khả năng mở rộng, tức là, là một phần máy chủ của ứng dụng di động, tôi có thể thông báo cho hàng ngàn trường hợp ứng dụng trong vài giây

Tôi đánh giá cao ứng dụng có thể dựa trên kiểu kéo yêu cầu / phản hồi HTTP, nhưng lý tưởng nhất là tôi không muốn bỏ phiếu mà chỉ để kiểm tra thông báo; ngoài ra nó giống như làm cạn kiệt kế hoạch dữ liệu.


3
Thông báo cho gmail và gchat thường nằm trong ngưỡng đó. Cần có một cách để tái tạo điều này trong ứng dụng của riêng bạn.
Dana the Sane

Có, có một thư viện Android giúp nhắn tin đẩy rất đơn giản ... chỉ cần bao gồm thư viện Thông báo Droid của Jigy trong ứng dụng của bạn và từ đó chỉ có khoảng 10 dòng mã ... hy vọng điều này sẽ giúp :)
Corey Harden

Kiểm tra Pushy ( pushy.me ) để biết cổng thông báo đẩy thời gian thực sử dụng MQTT dưới mui xe để cải thiện độ tin cậy. Tiết lộ đầy đủ - Tôi thành lập Pushy.
Elad Nava

Câu trả lời:


215

Câu hỏi thường gặp về Firebase Cloud Messaging FCM là phiên bản mới của GCM. Nó kế thừa cơ sở hạ tầng cốt lõi của GCM để gửi tin nhắn đáng tin cậy trên Android, iOS và Chrome. Tuy nhiên, họ sẽ tiếp tục hỗ trợ GCM vì nhiều nhà phát triển đang sử dụng SDK GCM ngày hôm nay để xử lý thông báo và việc nâng cấp ứng dụng khách mất nhiều thời gian.

Kể từ ngày 26 tháng 6 năm 2012, Google Cloud Messaging là cách gửi tin nhắn ưa thích đến các ứng dụng chạy trên thiết bị.

Trước đây (và bây giờ không dùng nữa), dịch vụ này được gọi là Cloud To Device Messaging .


14
Google cung cấp tài liệu chi tiết để triển khai ứng dụng này vào ứng dụng Android của bạn bằng Java tại code.google.com/android/c2dm nhưng mã mẫu của họ để liên lạc với khía cạnh phía máy chủ của C2DM là thiếu. Tôi đã viết một hướng dẫn cho khía cạnh đó ở đây: blog.boxedice.com/2010/10/07/ trên
DavidM

2
Có cách nào để cung cấp thông báo đẩy cho người dùng với Android 2.2, nhưng làm cho cùng một ứng dụng có thể chạy được trên các bản phân phối cũ hơn, mà không cần thông báo đẩy?
OneWorld

3
@OneWorld: có, giống như mọi kỹ thuật tương thích ngược khác của Android, sử dụng phản xạ để chọn chiến lược thay thế khi không có sẵn C2DM, để xem thêm: developer.android.com/resource/articles/
trộm

1
developer.android.com/ideo/index.html#v=PLM4LajwDVc Google I / O 2010 Trình bày về Thông báo đẩy
vokilam

6
C2DM đã chính thức bị từ chối kể từ ngày 26 tháng 6 năm 2012, sử dụng [Google Cloud Messaging cho Android] ( developer.android.com/guide/google/gcm/index.html thay vào đó
Mithun Sreedharan

47

XMPP là một giải pháp tốt. Tôi đã sử dụng nó cho một ứng dụng Android được kích hoạt, thời gian thực. XMPP mạnh mẽ, có khả năng mở rộng cao và dễ tích hợp và sử dụng.

Có rất nhiều máy chủ XMPP miễn phí (mặc dù không lịch sự, bạn không nên lạm dụng chúng) và có những máy chủ nguồn mở bạn có thể chạy trên một trong các hộp của riêng mình. OpenFire là một lựa chọn tuyệt vời.

Thư viện bạn muốn không phải là Smack như đã nói ở trên, đó là aSmack . Nhưng lưu ý, đây là một môi trường xây dựng - bạn sẽ phải xây dựng thư viện.

Đây là một tính toán tôi đã thực hiện về tác động tuổi thọ pin của giải pháp XMPP:

Máy khách Android phải duy trì kết nối TCP liên tục bằng cách thức dậy định kỳ để gửi nhịp tim đến máy chủ XMPP.
Điều này rõ ràng áp đặt một chi phí về việc sử dụng năng lượng. Ước tính chi phí này được cung cấp dưới đây:

  • Sử dụng pin 1400mAh (như được cung cấp trong Nexus One và HTC Desire)
  • Một thiết bị nhàn rỗi, được kết nối với mạng 3G, sử dụng khoảng 5mA
  • Thời gian thức dậy, nhịp tim, chu kỳ ngủ diễn ra cứ sau 5 phút, mất ba giây để hoàn thành và sử dụng 300mA
  • Do đó, chi phí sử dụng pin mỗi giờ là:
    • 36 giây 300mA = 3mAh gửi nhịp tim
    • 3600 giây 5mA = 5mAh khi không hoạt động
    • 4:95 + 3 = 7: 95mAh kết hợp
  • Pin 1400mAh kéo dài khoảng 11,6 ngày khi không sử dụng và 7,3 ngày khi chạy ứng dụng, điều này thể hiện thời lượng pin giảm khoảng 37%.
  • Tuy nhiên, việc giảm tuổi thọ pin là 37% đại diện cho trường hợp xấu nhất tuyệt đối trong thực tế do các thiết bị hiếm khi hoàn toàn không hoạt động.

2
Tuy nhiên, trong trường hợp điện thoại sẽ kéo dài 3 giờ khi các ứng dụng thực hiện việc này vì hàng trăm ý định chạy khi điện thoại thức dậy hoặc hiển thị bật hoặc thay đổi trạng thái mạng.
Monstieur

33

Gần đây tôi đã bắt đầu chơi với MQTT http://mqtt.org cho Android như một cách thực hiện những gì bạn đang yêu cầu (nghĩa là không phải SMS nhưng được điều khiển bằng dữ liệu, gửi tin nhắn gần như ngay lập tức, có thể mở rộng, không bỏ phiếu, v.v.)

Tôi có một bài đăng blog với thông tin cơ bản về vấn đề này trong trường hợp hữu ích http://dalelane.co.uk/blog/?p=938

(Lưu ý: MQTT là một công nghệ của IBM và tôi nên chỉ ra rằng tôi làm việc cho IBM.)


Làm thế nào là mqtt làm điều này? Phải có một số bỏ phiếu liên quan ở đâu đó? Ngay cả táo cũng phải thăm dò ý kiến ​​nhưng tôi nghĩ rằng họ chỉ thực hiện một kết nối tại một thời điểm do đó không làm cạn kiệt pin nhiều ...
Janusz

3
Nó thực hiện điều đó bằng cách mở kết nối TCP / IP và để nó mở. Nó không thăm dò ý kiến, mặc dù đôi khi phải gửi một tin nhắn ping nhỏ xuống kết nối để giữ cho nó tồn tại.
dalelane

MQTT chắc chắn là con đường để đi nếu việc gửi tin nhắn đẩy của bạn thông qua Google khiến bạn không thoải mái. Ngoài ra, chúng tôi có thỏa thuận không tiết lộ với khách hàng của chúng tôi về việc cấm sử dụng dịch vụ đám mây để trao đổi dữ liệu.
VH-NZZ



8

Nếu bạn có thể phụ thuộc vào các thư viện Google có mặt cho thị trường mục tiêu của mình, thì bạn có thể muốn cõng chức năng GTalk (đăng ký tài nguyên trên tên người dùng hiện tại - chặn tin nhắn khi họ gửi đến với BroadcastReceiver).

Nếu không, và tôi hy vọng bạn không thể , thì bạn sẽ kết hợp các phiên bản XMPP của riêng bạn . Đây là một nỗi đau, nhưng có thể được thực hiện dễ dàng hơn nếu XMPP được gói riêng như một thư viện độc lập.

Bạn cũng có thể xem xét PubSubHubub , nhưng tôi không biết việc sử dụng mạng của nó. Tôi tin rằng nó được xây dựng trên đỉnh XMPP.


Tôi nghĩ rằng số liệu thống kê bài viết rằng chức năng cõng sẽ luôn có sẵn miễn là các thư viện gtalk có trên thiết bị. Bạn có một số tài nguyên với các ví dụ làm thế nào để thực sự làm điều đó?
Janusz

GTalk bị xóa khỏi SDK kể từ 1.0 (iirc).
MrSnowflower

8

Tôi đã xem xét điều này và PubSubHubBub được đề xuất bởi jamesh không phải là một lựa chọn. PubSubHubBub dành cho giao tiếp từ máy chủ đến máy chủ

"Tôi đứng sau NAT. Tôi có thể đăng ký Hub không? Trung tâm không thể kết nối với tôi."

/Vô danh

Không, PSHB là giao thức từ máy chủ đến máy chủ. Nếu bạn đứng sau NAT, bạn không thực sự là một máy chủ. Mặc dù chúng tôi đã đưa ra các ý tưởng cho các tiện ích mở rộng PSHB tùy chọn để thực hiện treo ("bỏ phiếu dài") và / hoặc bỏ phiếu trong hộp thư cho các khách hàng đó, nhưng đó không phải là thông số kỹ thuật cốt lõi. Thông số kỹ thuật cốt lõi chỉ dành cho máy chủ.

/ Brad Fitzpatrick, San Francisco, CA

Nguồn: http://moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d (không thể liên kết trực tiếp)

Tôi đã đi đến kết luận rằng phương pháp đơn giản nhất là sử dụng đẩy Comet HTTP. Đây là cả một giải pháp đơn giản và được hiểu rõ nhưng nó cũng có thể được sử dụng lại cho các ứng dụng web.


8

Có một nỗ lực mã nguồn mở mới để phát triển thư viện Java cho các thông báo đẩy trên Android, sử dụng máy chủ sao chổi sao băng làm phụ trợ. Bạn có thể kiểm tra nó tại Blog Dự án Deacon . Chúng tôi cần các nhà phát triển, vì vậy xin vui lòng truyền bá!


7

Google gần đây (18 tháng 3 năm 2016) đã thông báo rằng Firebase hiện là nền tảng hợp nhất cho các nhà phát triển di động bao gồm các thông báo đẩy gần thời gian thực. Đây cũng là đa nền tảng:

Công ty hiện cung cấp cho tất cả người dùng Firebase thông báo miễn phí và không giới hạn với sự hỗ trợ cho iOS, Android và Web.

nguồn


6

Tôi không thể tìm thấy nơi tôi đọc nó, nhưng tôi tin rằng gmail sử dụng kết nối TCP mở để thực hiện việc đẩy e-mail.


Có một bài đăng blog tại joelapenna.com/blog/2009/07/android-f vội-and-push bởi một nhà phát triển ứng dụng Android dường như hỗ trợ điều này.
dalelane

Những điều này dường như với tôi, họ cũng đang bỏ phiếu. Thiết bị di động tạo kết nối đến máy chủ và thông báo cho máy chủ đang chờ cập nhật. Đẩy thực tế được khởi xướng bởi các máy chủ, đó là rất khó khăn cho các thiết bị di động, và hầu hết thời gian liên quan đến việc hỗ trợ cung cấp dịch vụ mạng (sms / wap push) ...
MrSnowflake

1
"C2DM cho phép các nhà phát triển bên thứ ba sử dụng cùng dịch vụ mà các ứng dụng Google thực hiện." từ Android Cloud đến tin nhắn thiết bị
colithium

6

Như GTalkđã ra khỏi SDK, có thể là một ý tưởng tốt để tạo ra một hệ thống nhắn tin đẩy 'tiêu chuẩn'. Theo cách đó, chỉ có một dịch vụ phải chạy, chỉ cần mở thêm một kết nối tcp. Các ứng dụng nên nói chuyện với dịch vụ này bằng cách sử dụngIntents và trước tiên nên yêu cầu quyền gửi và nhận thông báo từ dịch vụ. Sau đó, dịch vụ sẽ thông báo cho người dùng một ứng dụng mới muốn gửi và nhận tin nhắn. Người dùng sau đó sẽ cấp hoặc từ chối cấp phép, do đó anh ta sẽ kiểm soát. Sau đó, ứng dụng sẽ đăng ký một danh mục hành động + cho dịch vụ, vì vậy dịch vụ biết cách gửi thông điệp đẩy.

Một ý tưởng tốt hay không?


6

Tại sao bạn không thực hiện XMPP. ngay bây giờ có rất nhiều máy chủ công cộng có sẵn bao gồm gtalk, jabber, citadel, v.v ... Đối với Android, có một SDK cũng có sẵn được đặt tên là SMACK. Điều này chúng tôi không thể nói là thông báo đẩy nhưng sử dụng XMPP, bạn có thể giữ kết nối mở giữa máy khách và máy chủ, điều này sẽ cho phép giao tiếp hai chiều. Có nghĩa là cả máy khách và máy chủ Android đều có thể giao tiếp với nhau. Hiện tại điều này sẽ đáp ứng nhu cầu của Push trong Android. Tôi đã thực hiện một mã mẫu và nó thực sự hoạt động rất tốt


Muốn cung cấp một liên kết đến mã mẫu của bạn? Đã thực hiện bất kỳ thử nghiệm liên quan đến tuổi thọ pin?
Alex

Tôi đã thực hiện kiểm tra thời lượng pin - nhịp tim bạn cần gửi cứ sau sáu phút sẽ giảm 30% thời lượng pin trong trường hợp xấu nhất (ví dụ: thiết bị chỉ thức dậy để gửi nhịp tim). Trong trường hợp tốt nhất (người dùng đang sử dụng thiết bị để duyệt, gọi điện, v.v.), tác động đến tuổi thọ pin là không đáng kể.
thịt

6

Gần đây tôi đã phát triển http://pushdroid.org một ứng dụng duy nhất nên được cài đặt trên điện thoại giống như google đã triển khai nó trong 2.2, nó hoạt động từ 1.5 và được phát sóng thông qua ý định.


4

Vấn đề với GCM là có rất nhiều cấu hình liên quan đến quá trình:

  • Bạn phải thêm rất nhiều mẫu soạn sẵn cho ứng dụng Android
  • Bạn cần định cấu hình máy chủ bên ngoài để kết hợp với máy chủ GCM
  • Bạn sẽ phải viết bài kiểm tra

Nếu bạn thích những thứ đơn giản (như tôi), bạn nên thử UrbanAirship . Đó là (IMHO) cách dễ nhất để sử dụng GCM trong ứng dụng của bạn mà không cần thực hiện nhiều cấu hình. Nó cũng cung cấp cho bạn một GUI đẹp để kiểm tra xem các tin nhắn GCM của bạn có được gửi chính xác không.

  • Bạn có thể tìm thấy các tài liệu và bắt đầu hướng dẫn ở đây
  • Bạn có thể tìm thấy một ứng dụng mẫu ở đây

Lưu ý: Tôi không say mê UrbanAirship dưới bất kỳ hình thức nào



2

Họ có trình nghe của họ mà bạn phải sử dụng bằng cách sử dụng các lớp thư viện của họ trong mã của bạn. Bạn không cần phải bận tâm về việc đẩy. Bạn phải gửi tin nhắn đến máy chủ sẽ đẩy tin nhắn đến thiết bị. Họ sử dụng OAuth. Về Giao thức, có hai phương pháp sử dụng CCS và XMPP. CCS chỉ sử dụng XMPP làm lớp vận chuyển được xác thực, vì vậy bạn có thể sử dụng hầu hết các thư viện XMPP để quản lý kết nối. Để gửi thông báo đến thiết bị, bạn có thể viết mã trong ứng dụng Android để gửi cũng như mã máy chủ của mình. việc gửi tin nhắn sẽ chỉ được thực hiện bằng mã của bạn. Phần còn lại sẽ được Google Server chăm sóc trong trường hợp GCM. Bạn có thể kiểm tra chi tiết tại liên kết này

http://developer.android.com/google/gcm/server.html

Ngoài ra, đối với các vấn đề bảo mật

bảo mật tin nhắn trên đám mây của Google https://groups.google.com/forum/#!topic/android-gcm/M-EevBitbhQ

Trong trường hợp ứng dụng của bạn không chạy thì các thiết bị cũng có thể nhận được thông báo vì bạn phải viết mã cho người nghe phát sóng. Trong nền, nó sẽ lắng nghe máy chủ và bất cứ khi nào có gói tin nhắn nào ở đó, nó sẽ nhận được tin nhắn dưới dạng thông báo. Android có dịch vụ bạn cần không phải bận tâm về nó. Bạn chỉ phải sử dụng các tài nguyên đó bằng lớp thư viện giúp công việc của bạn dễ dàng hơn và để chúng viết nếu ứng dụng của bạn không chạy thì nó cũng nhận được thông báo. Rõ ràng, sẽ có một số người nghe làm cho ứng dụng nhận được. Kiểm tra phần "Nhận tin nhắn" trong liên kết này

http://developer.android.com/google/gcm/client.html

Nó cũng sẽ chấp nhận yêu cầu từ người dùng. Đối với GCM nó sẽ làm. Vui lòng kiểm tra "Gửi tin nhắn"

http://developer.android.com/google/gcm/client.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.