- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
正如标题所暗示的,我正在尝试为我的用户创建一个 vcard 并将其发送到服务器,但它似乎不起作用,有什么想法吗?我将不胜感激任何帮助
这是我的代码以及流连接和身份验证,我包括了这些部分因为它们也可能有问题,因为我是使用 xmpp 框架的菜鸟,我使用的 iOS 客户端是:https://github.com/robbiehanson/XMPPFramework
.h类代码是:
#import <UIKit/UIKit.h>
#import "XMPPStream.h"
#import "XMPP.h"
#import "XMPPReconnect.h"
#import "XMPPPresence.h"
#import "XMPPRoster.h"
#import "ForgotPasswordViewController.h"
#import "XMPPReconnect.h"
#import "XMPPRosterCoreDataStorage.h"
#import "ConractsViewController.h"
#import "KeychainItemWrapper.h"
#import "SignUpViewController.h"
#import "XMPPvCardTemp.h"
#import "XMPPvCardTempModule.h"
#import "XMPPvCardCoreDataStorage.h"
@interface SignInViewController : UIViewController <UITextFieldDelegate, XMPPRosterDelegate, XMPPStreamDelegate>
@property (strong, nonatomic) XMPPRosterCoreDataStorage *xmppRosterStorage;
@property (strong, nonatomic) XMPPRoster *xmppRoster;
@property (strong, nonatomic) XMPPReconnect *reconnect;
@property (strong, nonatomic) XMPPStream *xmppStream;
@end
.m类实现
@implementation SignInViewController
@synthesize xmppRosterStorage, xmppRoster, reconnect, xmppStream;
- (void)viewDidLoad {
//add SignIn button
int signInButtonXPossition = [[UIScreen mainScreen] bounds].size.width * 0.1f;
int signInButtonYPossition = [[UIScreen mainScreen] bounds].size.height * 0.55f;
int signInButtonWidth = [[UIScreen mainScreen] bounds].size.width * 0.8f;
int signInButtonHeight = [[UIScreen mainScreen] bounds].size.height * 0.07;
UIButton *signInButton = [[UIButton alloc] initWithFrame:CGRectMake(signInButtonXPossition, signInButtonYPossition, signInButtonWidth, signInButtonHeight)];
[signInButton addTarget:self
action:@selector(signInButtonFunction)
forControlEvents:UIControlEventTouchUpInside];
signInButton.backgroundColor = [UIColor colorWithRed:(167/255.f) green:(224/255.f) blue:(250/255.f) alpha:1];
signInButton.layer.cornerRadius=[[UIScreen mainScreen] bounds].size.width * 0.05f;
signInButton.layer.borderWidth=1.0;
signInButton.layer.masksToBounds = YES;
signInButton.layer.borderColor=[[UIColor whiteColor] CGColor];
[self.view addSubview:signInButton];
[signInButton setTitle:@"Sign In" forState:UIControlStateNormal];
}
- (void)signInButtonFunction{
xmppStream = [[XMPPStream alloc] init];
xmppStream.myJID = [XMPPJID jidWithString:@"test@administrator"];
xmppStream.hostName = @"www.domainName.com";
xmppStream.hostPort = 5222;
[xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()];
reconnect = [[XMPPReconnect alloc] init];
[reconnect activate:xmppStream];
NSError *error = nil;
if (![xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error]) {
NSLog(@"error: %@", error);
}
NSLog(@"error: %@", error);
}
- (void)xmppStreamDidConnect:(XMPPStream *)sender {
NSError *error = nil;
if (![xmppStream authenticateWithPassword:@"test" error:&error]) {
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
message:[NSString stringWithFormat:@"Can't authenticate %@", [error localizedDescription]]
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
}
XMPPPresence *mypresence = [XMPPPresence presenceWithType:@"available"];
[xmppStream sendElement:mypresence];
}
- (void)xmppStreamWillConnect:(XMPPStream *)sender{
NSLog(@"Did connect");
}
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
NSLog(@"e%d",[xmppStream isConnected]);//prints out 1
NSLog(@"e%d",[xmppStream isAuthenticated]);//prints out 1
if ([xmppStream isAuthenticated]) {
NSLog(@"authenticated");
XMPPvCardCoreDataStorage* xmppvCardStorage = [XMPPvCardCoreDataStorage sharedInstance];
XMPPvCardTempModule *xmppvCardTempModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:xmppvCardStorage dispatchQueue:dispatch_get_main_queue()];
XMPPvCardTemp *xmppvCardTemp;
NSXMLElement *vCardElement = [NSXMLElement elementWithName:@"vCard" xmlns:@"vcard-temp"];
NSXMLElement *nicknameElement = [NSXMLElement elementWithName:@"nickname" stringValue:@"A0Test1"];
[vCardElement addChild:nicknameElement];
xmppvCardTemp = [XMPPvCardTemp vCardTempFromElement:vCardElement];
[xmppvCardTempModule updateMyvCardTemp:xmppvCardTemp];
}
}
当我连接和验证时它返回 1,但没有上传卡,我的操作是否正确,至少部分正确?
感谢您的支持,并为所有答案投票!
最佳答案
更新 1 - 上传 VCARD 成功:
我已经通过使用下一个代码设法更新/创建了一个 vCard,但是当我尝试使用方法 setLabels 发送 NSArray 时遇到了问题,该数组没有发送到服务器或者服务器没有保存当它收到它时。
这是我的更新:
- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender{
if ([xmppStream isAuthenticated]) {
NSLog(@"authenticated");
dispatch_queue_t queue = dispatch_queue_create("queue", DISPATCH_QUEUE_PRIORITY_DEFAULT);
dispatch_async(queue, ^{
XMPPvCardCoreDataStorage * xmppvCardStorage = [XMPPvCardCoreDataStorage sharedInstance];
XMPPvCardTempModule * xmppvCardTempModule = [[XMPPvCardTempModule alloc] initWithvCardStorage:xmppvCardStorage];
[xmppvCardTempModule activate:[self xmppStream]];
XMPPvCardTemp *myVcardTemp = [xmppvCardTempModule myvCardTemp];
if (!myVcardTemp) {
NSLog(@"TEST FOR VCARD");
NSXMLElement *vCardXML = [NSXMLElement elementWithName:@"vCard" xmlns:@"vcard-temp"];
XMPPvCardTemp *newvCardTemp = [XMPPvCardTemp vCardTempFromElement:vCardXML];
[newvCardTemp setNickname:@"nick"];
[xmppvCardTempModule updateMyvCardTemp:newvCardTemp];
}else{
//Set Values as normal
NSLog(@"TEST FOR VCARD ELSE");
NSLog(@"TEST FOR VCARD");
NSXMLElement *vCardXML = [NSXMLElement elementWithName:@"vCard" xmlns:@"vcard-temp"];
XMPPvCardTemp *newvCardTemp = [XMPPvCardTemp vCardTempFromElement:vCardXML];
[newvCardTemp setNickname:@"aaaaaa"];
NSArray *interestsArray= [[NSArray alloc] initWithObjects:@"food", nil];
[newvCardTemp setLabels:interestsArray];
[newvCardTemp setMiddleName:@"Stt"];
[newvCardTemp setEmailAddresses:[NSMutableArray arrayWithObjects:@"email", nil]];
[xmppvCardTempModule updateMyvCardTemp:newvCardTemp];
}
});
}
}
根据我的测试,我得出结论,当服务应该处理 NSArray 时应该存在问题。
我还尝试发送自定义 XML,这是示例,我不知道如何发送数组所以我将其转换为字符串:
NSLog(@"TEST FOR VCARD");
NSXMLElement *vCardXML = [NSXMLElement elementWithName:@"vCard" xmlns:@"vcard-temp"];
NSXMLElement *nicknameElement = [NSXMLElement elementWithName:@"nickname" stringValue:@"A0Test1"];
NSArray *myTestArray = [NSArray arrayWithObjects:@"IT",@"PC", nil];
NSXMLElement *nicknameElement2 = [NSXMLElement elementWithName:@"interests" stringValue:[NSString stringWithFormat:@"%@", myTestArray]];
[vCardXML addChild:nicknameElement];
[vCardXML addChild:nicknameElement2];
XMPPvCardTemp *newvCardTemp = [XMPPvCardTemp vCardTempFromElement:vCardXML];
[xmppvCardTempModule updateMyvCardTemp:newvCardTemp];
现在我的问题仍然存在,如何检查它是否到达服务器,当 vCard 传输完成时,是否有 xmpp 框架调用任何委托(delegate)方法,如在流情况下?以及如何从服务器接收 vCard?
关于ios - 如何在 iOS 上使用 XMPPFramework 和 OpeFire 创建/更新/检索用户 vCard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28878849/
我正在使用 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 连接。 请告诉我
我是一名优秀的程序员,十分优秀!