安卓和XMPP:目前可用的解决方案

168
哪个XMPP库现在对于Android开发来说是最好的选择?
  • 我一直在使用Smack 库的补丁版本,因为许多其他问题在这里都建议使用它。但是,那是两年前的Smack API的一个打了补丁的版本。虽然它通常工作良好,但我正在探索任何其他更近期的选项。

  • 我看过了官方的 Smack API,经过一番研究,它似乎现在可以很好地工作(尽管我还没有在实际应用中尝试过)。

  • 我还发现另外一个解决方案,Beem's aSMACK库。 Beem是一个相对较新的XMPP客户端, 从我所理解的来看,他们正在使用自己打了补丁的aSMACK版本。

  • 最后,还有aSMACK,但是根据该网站的信息,它也已经有一段时间没有更新了。

你有其他建议或者能够解释为什么我应该选择上述的其中一个而不是其他的吗?


2
你最终选择了什么?我正在尝试决定是否使用官方的 Smack 库? - Tom
86
我认为关闭这个问题是一个很大的错误。作为参与XMPP在Android上的人,我可以告诉你,在整个互联网上,“如何在Android上使用XMPP?”这个问题只有这个问题是可靠最新的资源。关闭它,你会从SO中丢失一个高质量的价值。这个问题开放了一年多没有任何问题,并且那些问过相同问题的被关闭并指向这个问题。我甚至不认为将它关闭为“不具建设性”有什么意义:它基于现实世界的问题,包含事实和参考资料。请参见赞数和收藏数。 - Flow
2
@casperOne,所以在stackoverflow上没有方法可以询问“如何在Android应用程序中使用XMPP”?抱歉,但这太荒谬了。这样想,就可以关闭stackoverflow上每个具有多个答案/可能解决方案的问题。这个问题已经开放了一年多,没有人注意到,而且是许多类似问题的目标,这些问题被关闭为确切的副本。很快我们将有一个新问题扮演这个角色。你真的愿意关闭所有那些问题吗? - Flow
4
@casperOne 感谢您的耐心解释。这有助于我理解stackoverflow存在的问题所在。也许我会在meta上提出这个问题,但似乎这是大多数人的意见,并且已经讨论过很多次了。这只是感觉不对,特别是它没有被投票关闭多年。 - Flow
4
除了我需要“如何在Android中使用XMPP”之外,“Flow”和“casperOne”之间的讨论更有趣。我在互联网上搜索XMPP,最终找到了这篇文章。即使两年过去了,它仍为我提供了有关可以用于XMPP的库的更具体信息,对于数百名聊天应用程序新手来说,这肯定是有益的。 “事件”比“规则”更能说明,“Flow”的观点在这个问题的关闭上是正确的。 - Pankaj
显示剩余11条评论
7个回答

108

Smack

Smack是一个开源的XMPP客户端库。自版本4.1起,它可以在Android上本地运行。要了解更多信息,请查看"Smack 4.3 Readme"和访问Ignite Realtime的Smack项目页面

注:XMPP是一种即时通讯协议,类似于QQ、微信等IM软件所使用的协议。

8
将Smack 3.2.0合并到asmack中。请在github上查看分支:) - Flow
你好,之前你提供了一些了解XMPP聊天的链接,但现在它们不可用了。你有没有关于能正常工作的XMPP聊天示例? - J_K
@Flow,我正在使用你的库来实现XMPP事务,但是我没有看到其中的BOSHConnection,我应该在哪里找到它? - Hunt
3
好的,我会尽力进行翻译。这是一个指向 GitHub 网站上名为 "SmackAndroidDemo" 的开源项目的链接。 - Alexey
有人可以帮我回答这个问题吗?https://dev59.com/kpDea4cB1Zd3GeqPeaVU - MHSaffari
显示剩余4条评论

6

我最近发现了另一个开源解决方案:jaxmpp2

jaxmpp2 也面向 Android(和 Java SE)。因为我没有在我的 Android/XMPP 项目中使用 jaxmpp2,所以我不能说太多。但是看起来它是 aSmack 的一种有效替代品。


1
你能否描述一下如何开始使用Smack库……这对我来说是全新的。请创建一个博客或一些库项目,以便普通人可以正确理解这个库。 - Tushar Pandey
我在http://developer.samsung.com/android/technical-docs/Building-a-Chat-Application#上找到了一个特别好的教程,请注意,由于兼容性原因,需要进行一些小的修改:https://dev59.com/z3_aa4cB1Zd3GeqP3G4h。 - realjin

3

使用qsmack进行安卓开发

https://code.google.com/p/qsmack/downloads/list

这是最新的安卓版本

我已经开发了一对一聊天、群聊、视频传输、音频传输、最后在线时间、更改注册号等等,几乎完全仿照了WhatsApp。我在Openfire上创建了许多插件。


@jaspreet ... 有没有任何库项目可以将qsamck集成到Android中? - Tushar Pandey
这都是中文,没有任何帮助可用。 - AZ_
https://www.dropbox.com/s/dnc9nule3hjh08f/qsmack.zip?dl=0 - Jaspreet Chhabra
如果你在其中遇到任何问题,请告诉我。 - Jaspreet Chhabra
@jaspreet,你能分享一些你创建的Openfire插件吗?实际上,我在Android上遇到了网络波动导致消息丢失的问题,正在尝试为此创建Openfire插件。你是否曾经为Openfire的消息丢失问题创建过插件?如果你能分享一些你的插件,那真的会帮助我很多。你可以通过ameer.androiddev@gmail.com与我联系。 - Ameer Faisal
显示剩余3条评论

3
我希望使用libstrophe和jni,目的是实现跨平台、易于使用和高性能。libstrophe是用C编写的,因此编写Android makefile很容易,因为它只依赖openssl和expat库。在我的情况下,我正在使用来自libjingle的openssl和expat库,这些库已经被移植到Android和iOS。(只需要将gyp文件移植到Android makefile或IOS项目即可)。
以下是我的Android makefile:


    LOCAL_PATH:= $(call my-dir)/../../libstrophe-0.8.7
SSL_PROJECT_PATH := openssl/libs/android
include $(CLEAR_VARS)
LOCAL_MODULE := openssl
OPENSSL_LIB_NAME := lib$(LOCAL_MODULE).a
LOCAL_CFLAGS := -DL_ENDIAN \ -DOPENSSL_THREADS \ -DPURIFY \ -DTERMIO \ -D_REENTRANT \ -DOPENSSL_NO_HW \ -DOPENSSL_NO_GOST \ -DOPENSSL_NO_DTLS1 \ -DOPENSSL_NO_RDRAND \ -DOPENSSL_NO_RSAX \ -Wall -pipe -fno-exceptions -fno-rtti -fstrict-aliasing -mfpu=neon -mfloat-abi=softfp
OPENSSL_PATH := openssl/openssl OPENSSL_PATH_INC := $(LOCAL_PATH)/openssl/openssl
LOCAL_C_INCLUDES := \ $(OPENSSL_PATH_INC) \ $(OPENSSL_PATH_INC)/include \ $(OPENSSL_PATH_INC)/crypto \ $(OPENSSL_PATH_INC)/crypto/asn1 \ $(OPENSSL_PATH_INC)/crypto/evp \ $(OPENSSL_PATH_INC)/crypto/modes \ $(LOCAL_PATH)/openssl/config/android \ $(LOCAL_PATH)/openssl
LOCAL_ARM_MODE := arm LOCAL_CFLAGS += $(LOCAL_C_INCLUDES:%=-I%) -O3 -DANDROID_NDK
LOCAL_SRC_FILES := \ // 这里是在gyp中定义的openssl文件
LOCAL_SHORT_COMMANDS := true include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
STROPHE_PATH := $(LOCAL_PATH) EXPAT := expat-2.1.0 OPENSSL_PATH := openssl/openssl OPENSSL_PATH_INC := $(LOCAL_PATH)/openssl/openssl
EXPAT_SRC_FILES := \ $(EXPAT)/lib/xmlparse.c \ $(EXPAT)/lib/xmlrole.c \ $(EXPAT)/lib/xmltok.c
COMMON_CFLAGS := \ -Wall \ -Wmissing-prototypes -Wstrict-prototypes \ -Wno-unused-parameter -Wno-missing-field-initializers \ -fexceptions \ -DHAVE_EXPAT_CONFIG_H \ -DLOGGING -DANDROID \
COMMON_C_INCLUDES += \ $(LOCAL_PATH)/$(EXPAT)/lib \ $(STROPHE_PATH) \ $(STROPHE_PATH)/src \ $(OPENSSL_PATH_INC) \ $(OPENSSL_PATH_INC)/include \ $(OPENSSL_PATH_INC)/crypto \ $(OPENSSL_PATH_INC)/crypto/asn1 \ $(OPENSSL_PATH_INC)/crypto/evp \ $(OPENSSL_PATH_INC)/crypto/modes \ $(LOCAL_PATH)/openssl/config/android \ $(LOCAL_PATH)/openssl \ ../android/jni
STROPHE_SRC_FILES := src/auth.c \ src/conn.c \ src/ctx.c \ src/event.c \ src/handler.c \ src/hash.c \ src/jid.c \ src/md5.c \ src/sasl.c \ src/scram.c \ src/sha1.c \ src/snprintf.c \ src/sock.c \ src/stanza.c \ src/thread.c \ src/tls_openssl.c \ src/util.c \ src/parser_expat.c \ src/message.c \ src/presence.c \ src/roster.c
JNI_SRC_FILES := ../android/jni/strophe-jni.c
ifeq ($(TARGET_ARCH),arm) LOCAL_SDK_VERSION := 8 else LOCAL_SDK_VERSION := 9 endif
LOCAL_ARM_MODE := arm LOCAL_SHORT_COMMANDS := true LOCAL_SYSTEM_SHARED_LIBRARIES := libc LOCAL_SHARED_LIBRARIES := openssl
LOCAL_SRC_FILES := $(EXPAT_SRC_FILES) LOCAL_SRC_FILES += $(STROPHE_SRC_FILES) LOCAL_SRC_FILES += $(JNI_SRC_FILES)
LOCAL_CFLAGS += $(COMMON_CFLAGS) LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog LOCAL_CFLAGS += $(LOCAL_C_INCLUDES:%=-I%) -O3 -DANDROID_NDK LOCAL_C_INCLUDES += $(COMMON_C_INCLUDES)
LOCAL_MODULE:= libnativeclient LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)

1

这是付费的吗? - NehaK
它是免费且开源的。 - Wojtek

0

使用 Smack 4.1 自述文件和升级指南

使用 Android Studio 2.3,我最近以非常简单的方式实现了一个演示。

-> 只需将以下gradle依赖项添加到应用级别gradle中即可

compile "org.igniterealtime.smack:smack-tcp:4.1.0"

// Optional for XMPPTCPConnection

compile "org.igniterealtime.smack:smack-android-extensions:4.1.0"

-> 配置连接配置
注意:请在AsyncTask或其他后台线程中调用此方法

 XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                    .setUsernameAndPassword("Your Username here", "Your Password here")
                    .setHost("Host name here")
                    .setServiceName("Your service name here")
                    .setPort(Your port number here)
                    .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) //Disable or enable as per development mode
                    .setDebuggerEnabled(true) // to view what's happening in detail
                    .build();

-> 使用 isConnected()isAuthenticated()

-> 使用 ChatManager 添加 chatListener


有没有任何想法如何将它与 FCM XMPP 一起使用? - because_im_batman

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接