- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试通过 SSL 将我的用户从我的 iOS XMPP 聊天客户端连接到 Openfire 服务器。
在我的 iOS 客户端中:
- (void)setupStream
{
...
// BOOL values for security settings
customCertEvaluation = NO;
allowSelfSignedCertificates = YES;
allowSSLHostNameMismatch = NO;
}
在我的 Openfire 服务器的 Security Settings> Client Connection Security 中,我设置了:
必需 - 客户端只能使用安全连接连接到服务器。
因此,将调用以下委托(delegate)方法:
- (void)xmppStream:(XMPPStream *)sender willSecureWithSettings:(NSMutableDictionary *)settings
{
NSString *expectedCertName = [xmppStream.myJID domain];
if (customCertEvaluation)
[settings setObject:@(YES) forKey:GCDAsyncSocketManuallyEvaluateTrust];
if (allowSelfSignedCertificates)
[settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];
if (allowSSLHostNameMismatch)
[settings setObject:[NSNull null] forKey:(NSString *)kCFStreamSSLPeerName];
else
if (expectedCertName)
[settings setObject:expectedCertName forKey:(NSString *)kCFStreamSSLPeerName];
}
我从这个线程尝试了这个解决方案:XMPPFramework TLS/SSL connection with Openfire
但是,当我运行我的应用程序并尝试连接到服务器时,我会收到此错误:
安全选项不可用 - kCFStreamSSLAllowsAnyRoot - 您必须使用手动信任评估
我查看了 GCDAsyncSocket
类并意识到 kCFStreamSSLAllowsAnyRoot
被声明为已弃用。实现了 NSAssert 以故意抛出错误。
接下来,我决定这样更改我的 BOOL 值:
- (void)setupStream
{
...
// BOOL values for security settings
// Manually evaluate trust
customCertEvaluation = YES;
allowSelfSignedCertificates = NO;
allowSSLHostNameMismatch = NO;
}
这次还是无法连接到服务器,但是没有提示错误。
如果我将客户端连接安全性更改回原始设置,我可以正常连接到 Openfire > 可选。但是,我不会通过客户端 session 中每个用户状态旁边的锁定图标指示的 SSL 进行连接。
我的 Android 客户端(使用 XMPP 的 Smack API)通过 SSL 连接到 Openfire 没有问题。所以我想知道是否有我必须使用 XMPPFramework 为我的 iOS 客户端实现的解决方法。
如果有任何建议,我将不胜感激。
最佳答案
在最新版本的 XMPP ( after April 22 ) 中,您可以不再对以下内容使用 allowSelfSignedCertificates = YES
:
if (allowSelfSignedCertificates)
[settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];`
这是因为 kCFStreamSSLAllowsAnyRoot
和 SSLSetAllowsAnyRoot
已被弃用。
/*
* ==== The following UNAVAILABLE KEYS are: (with throw an exception)
* - kCFStreamSSLAllowsAnyRoot (UNAVAILABLE)
* You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust).
* Corresponding deprecated method: SSLSetAllowsAnyRoot
*/
参见 XMPPFramework/GCDAsyncSocket.h & Deprecated Secure Transport Functions .
转到 Openfire 服务器 > 安全设置 > 客户端连接安全
检查:必需 - 客户端只能使用安全连接连接到服务器。
在 AppDelegate 中定义变量
BOOL customCertEvaluation;
在setupStream中设置变量
- (void)setupStream
{
...
customCertEvaluation = YES;
}
在 willSecureWithSettings 中设置安全设置
- (void)xmppStream:(XMPPStream *)sender willSecureWithSettings:(NSMutableDictionary *)settings
{
/*
* Properly secure your connection by setting kCFStreamSSLPeerName
* to your server domain name
*/
[settings setObject:xmppStream.myJID.domain forKey:(NSString *)kCFStreamSSLPeerName];
/*
* Use manual trust evaluation
* as stated in the XMPPFramework/GCDAsyncSocket code documentation
*/
if (customCertEvaluation)
[settings setObject:@(YES) forKey:GCDAsyncSocketManuallyEvaluateTrust];
}
手动验证节点
/*
* This is only called if the stream is secured with settings that include:
* - GCDAsyncSocketManuallyEvaluateTrust == YES
* That is, if a delegate implements xmppStream:willSecureWithSettings:, and plugs in that key/value pair.
*/
- (void)xmppStream:(XMPPStream *)sender didReceiveTrust:(SecTrustRef)trust completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler
{
/* Custom validation for your certificate on server should be performed */
completionHandler(YES); // After this line, SSL connection will be established
}
关于ios - XMPPFramework - 在 Openfire 上通过 SSL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24298917/
我正在使用 XMPPFramework在我的 iOS 应用程序中发送和接收客户端和服务器之间的命令消息。服务器会立即响应不同的命令消息。 有时候连接很慢,客户端发来的消息会长时间没有响应。所以我想知道
我正在为 iPhone 开发一款应用程序,其中功能之一是使用 XMPPFramework 的即时消息系统。现在,我正在使用 Google Talk 进行测试。委托(delegate)与管理用户界面的类
我正在 iPhone 上使用 xmppframework。我想知道如何检查我的特定域的所有可用用户? 谢谢 最佳答案 - (void)xmppStream:(XMPPStream *)sender d
问题:我正在使用XMPPFramework和Openfire服务器创建iOS聊天应用程序。但是,我无法连接到服务器。但是,我可以使用GTalk或Facebook帐户登录。此外,我可以使用另一个Jabb
我认为标题足够说明问题,但故事如下: 我是 XMPPFramework 的新手对于 iOS,我想将我的客户端设置为自动接受它收到的任何订阅请求。这样其他客户端可以在请求时看到该客户端的存在状态。 根据
需要帮助以获取有关好友的存在信息的信息。 我正在调用“fetchRoster”函数,但是我正在获取名册列表而不是存在信息。 我也尝试显式调用存在信息。但是在我的 iOS 应用程序中没有调用 didRe
我将openfire用作xmpp服务器,并希望通过Turnsocket传输文件。 openfire(本地)配置: xmpp.auth.anonymous true xmp
我有一个用于一对一聊天的应用程序。现在我需要实现群聊。我知道 XMPPFramework 是可能的,并且有一个名为 XMPPRoom 的类,我们可以使用它来创建房间或加入房间。但是我无法在我的项目中实
有什么方法可以让我查询例如 muc 房间的列表,但指定某些约束。 我已在每个房间的配置表单中的描述字段下附加了每个房间的位置。我想找出获得用户位置 500m 范围内所有房间的最佳方法是什么。 在后端,
如何使用 XMPPFramework 在 iPhone 中实现 GroupChat。我尝试了休闲代码,但未创建房间。我如何知道房间是否已创建。XMPPRoomDelegate 未被调用。当 Strea
我在 Openfire 服务器上创建了一个组和两个用户。我能够使用 XMPPFramework 对两个用户进行身份验证,但无法在他们之间交换消息。我可以看到两个用户都加入了 Openfire 服务器上
为了更改我的登录状态,我使用了以下代码: XMPPPresence *presence = [XMPPPresence presenceWithType:@"away"]; [[sel
这个问题在这里已经有了答案: XMPPFramework - How to create a MUC room and invite users? (3 个答案) 关闭 8 年前。 我需要使用 XM
我的 xmpp 流连接成功,在回调中我尝试发送用户的存在。但是,我不断收到此错误:Error Domain=XMPPStreamErrorDomain Code=1“操作无法完成。(XMPPStrea
我从 Google Talk 帐户接收消息,它们显示在 Ios 模拟器的表格 View 中,但是当我发送消息时,它不会显示在 Google Talk 客户端(在另一台计算机上)中。这是代码: -(IB
我正在尝试将用户状态设置为离开(或目前的任何状态)。我正在使用以下代码,但它似乎没有做任何事情。 XMPPPresence *presence = [XMPPPresence presence]; N
我是 iOS 的新手。我正在使用 XMPPFramework 构建应用程序。但是最近几天我遇到了一个问题。找不到任何解决方案。问题是当我想向任何特定的 id 发送消息时,消息没有被发送。发送消息的 A
如何在 iOS 中使用 XMPPFramework 获取在线和离线好友列表? 我想向用户发送好友请求。那么我该如何实现呢?有人可以为我分享一些示例代码吗? 谢谢。 最佳答案 通过使用这些方法,您将收到
我正在使用 https://github.com/robbiehanson/XMPPFramework对于我的 iOS 聊天应用程序。 我需要帮助来删除注册用户帐户。 请帮帮我。 最佳答案 如 the
我已经使用 XMPP 协议(protocol)进行了一对一聊天。现在,我想在我的应用程序中发送图像和视频。我研究了文件传输,但没有找到解决方案。我还使用了下面的代码进行 Socket 连接。 请告诉我
我是一名优秀的程序员,十分优秀!