草庐IT

ios - 我收到未经授权的错误 quickblox

coder 2024-01-12 原文

我有以下使用 quickblox 的代码。

不幸的是,当我访问 View Controller 时,我从 quickblox API 收到“未授权”错误。

我做错了什么?

#import "QChatViewController.h"
#include "ChatMessageTableViewCell.h"

@interface QChatViewController ()

@end

@implementation QChatViewController

@synthesize opponent;
@synthesize currentRoom;
@synthesize messages;

@synthesize toolBar;
@synthesize sendMessageField;
@synthesize sendMessageButton;
@synthesize tableView;

#pragma mark -
#pragma mark View controller's lifecycle

- (id) initWithStartup: (NSDictionary *) _startup investor: (NSDictionary *) _investor chat_id: (NSInteger) _chat_id chat_name: (NSString *) _name
{ 
    self = [self initWithNibName: @"QChatViewController" bundle: nil];

    if(self)
    {
        startup = _startup;
        investor = _investor;

        startup_id = 0;
        investor_id = 0;

        if ([startup objectForKey: @"id"] &&
            [startup objectForKey: @"id"] != (id)[NSNull null])
        {
            startup_id = [[startup objectForKey: @"id"] intValue];
        }

        if ([investor objectForKey: @"id"] &&
            [investor objectForKey: @"id"] != (id)[NSNull null])
        {
            investor_id = [[investor objectForKey: @"id"] intValue];
        }

        past = 0;
        chat_id = _chat_id;

        self.title = _name;
        self.title = @"Chat";

        UIButton * button4 = [UIButton buttonWithType:UIButtonTypeCustom];
        UIImage * btnImage = [UIImage imageNamed: @"chatrightbtn.png"];
        [button4 setFrame:CGRectMake(-90.0f, 0.0f, btnImage.size.width, btnImage.size.height)];
        [button4 addTarget:self action:@selector(showSheet:) forControlEvents:UIControlEventTouchUpInside];
        [button4 setImage: btnImage forState:UIControlStateNormal];
        UIBarButtonItem *random1 = [[UIBarButtonItem alloc] initWithCustomView:button4];

        self.navigationItem.rightBarButtonItem = random1;
        self.navigationItem.leftBarButtonItem.title = @"";
    }

    return self;
}


- (void) viewWillAppear:(BOOL)animated
{

    [super viewWillAppear: animated];


    QBASessionCreationRequest *extendedAuthRequest = [QBASessionCreationRequest request];
    extendedAuthRequest.userLogin = @"testjk";
    extendedAuthRequest.userPassword = @"jerry";

    [QBAuth createSessionWithExtendedRequest:extendedAuthRequest delegate:self];


}
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.navigationController.navigationBarHidden = NO;


    if(chat_id >= 1) {
        NSString * roomName = [NSString stringWithFormat: @"%d", chat_id];
        [[QBChat instance] createOrJoinRoomWithName: roomName membersOnly:YES persistent:NO];
    }

    messages = [[NSMutableArray alloc] init];


}

-(void) chatDidLogin{
    // You have successfully signed in to QuickBlox Chat
}

- (void)completedWithResult:(Result *)result{

    // Create session result
    if(result.success && [result isKindOfClass:QBAAuthSessionCreationResult.class]){
        // You have successfully created the session
        QBAAuthSessionCreationResult *res = (QBAAuthSessionCreationResult *)result;

        // Sign In to QuickBlox Chat
        QBUUser *currentUser = [QBUUser user];
        currentUser.ID = res.session.userID; // your current user's ID
        currentUser.password = @"jerry"; // your current user's password

        // set Chat delegate
        [QBChat instance].delegate = self;

        // login to Chat
        [[QBChat instance] loginWithUser:currentUser];

    }
}



- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];

    // leave room
    if(self.currentRoom){
        if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) {
            // back button was pressed.
            [[QBChat instance] leaveRoom:self.currentRoom];
            [[DataManager shared].rooms removeObject:self.currentRoom];
        }
    }
}

- (void)viewDidUnload{
    [self setToolBar:nil];
    [self setSendMessageField:nil];
    [self setSendMessageButton:nil];
    [self setTableView:nil];


    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)dealloc {
}

- (IBAction)sendMessage:(id)sender {

    if(self.sendMessageField.text.length == 0){
        return;
    }

    if(chat_id == 0)
    {
        NSString * sid = [NSString stringWithFormat: @"%d", startup_id];
        NSString * iid = [NSString stringWithFormat: @"%d", investor_id];
        NSString * pasts = [NSString stringWithFormat: @"%d", past];
        NSString * chat_ids = [NSString stringWithFormat: @"%d", chat_id];

        NSString * path_str = [NSString stringWithFormat: @"chats/?format=json"];
        NSMutableDictionary* params =[NSMutableDictionary dictionaryWithObjectsAndKeys:
                                      sid, @"startup",
                                      iid, @"investor",
                                      pasts, @"past",
                                      chat_ids, @"conversation_id",
                                      @"avv7ejtaegxxk2wzgnymsj8xtm2tk9s4xgp6854r6dqn8bk6jjwux4g9dh9b", @"apikey",
                                      nil];

        [[API sharedInstance] postcommandWithParams:params
                                               path: path_str
                                       onCompletion:^(NSDictionary *json)
         {
             if(chat_id == 0)
             {
                 if ([json objectForKey: @"id"] &&
                     [json objectForKey: @"id"] != (id)[NSNull null])
                 {
                     chat_id = [[json objectForKey: @"id"] intValue];

                     if(chat_id >= 1) {
                         NSString * roomName = [NSString stringWithFormat: @"%d", chat_id];
                         [[QBChat instance] createOrJoinRoomWithName: roomName membersOnly:YES persistent:NO];
                     }

                     [[QBChat instance] sendMessage:self.sendMessageField.text toRoom:self.currentRoom];

                     // reload table
                     [self.tableView reloadData];

                     // hide keyboard & clean text field
                     [self.sendMessageField resignFirstResponder];
                     [self.sendMessageField setText:nil];
                 }
             }
         }];
    }
    else
    {
        [[QBChat instance] sendMessage:self.sendMessageField.text toRoom:self.currentRoom];

            // reload table
        [self.tableView reloadData];

        // hide keyboard & clean text field
        [self.sendMessageField resignFirstResponder];
        [self.sendMessageField setText:nil];
    }
}

-(void)keyboardShow{
    CGRect rectFild = self.sendMessageField.frame;
    rectFild.origin.y -= 215;

    CGRect rectButton = self.sendMessageButton.frame;
    rectButton.origin.y -= 215;

    [UIView animateWithDuration:0.25f
                     animations:^{
                         [self.sendMessageField setFrame:rectFild];
                         [self.sendMessageButton setFrame:rectButton];
                     }
     ];
}

-(void)keyboardHide{
    CGRect rectFild = self.sendMessageField.frame;
                         rectFild.origin.y += 215;
    CGRect rectButton = self.sendMessageButton.frame;
                         rectButton.origin.y += 215;

    [UIView animateWithDuration:0.25f
                     animations:^{
                         [self.sendMessageField setFrame:rectFild];
                         [self.sendMessageButton setFrame:rectButton];
                     }
     ];
}


#pragma mark - 
#pragma mark TextFieldDelegate

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    [self keyboardShow];
}

- (void)textFieldDidEndEditing:(UITextField *)textField{
    [self keyboardHide];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    [textField setText:nil];
    [textField resignFirstResponder];
    return YES;
}


#pragma mark -
#pragma mark TableViewDataSource & TableViewDelegate

static CGFloat padding = 20.0;
- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *CellIdentifier = @"MessageCellIdentifier";


    // Create cell
    ChatMessageTableViewCell *cell = (ChatMessageTableViewCell *)[_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[ChatMessageTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                                reuseIdentifier:CellIdentifier];
    }
    cell.accessoryType = UITableViewCellAccessoryNone;
    cell.userInteractionEnabled = NO;


    // Message
    QBChatMessage *messageBody = [messages objectAtIndex:[indexPath row]];

    // set message's text
    NSString *message = [messageBody text];
    cell.message.text = message;

    // message's datetime
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat: @"yyyy-mm-dd HH:mm:ss"];
    [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"..."]];
    NSString *time = [formatter stringFromDate:messageBody.datetime];


    CGSize textSize = { 260.0, 10000.0 };
    CGSize size = [message sizeWithFont:[UIFont boldSystemFontOfSize:13]
                      constrainedToSize:textSize
                          lineBreakMode:UILineBreakModeWordWrap];
    size.width += (padding/2);


    // Left/Right bubble
    UIImage *bgImage = nil;
    if ([[[DataManager shared] currentUser] ID] == messageBody.senderID || self.currentRoom) {

        bgImage = [[UIImage imageNamed:@"orange.png"] stretchableImageWithLeftCapWidth:24  topCapHeight:15];

        [cell.message setFrame:CGRectMake(padding, padding*2, size.width+padding, size.height+padding)];

        [cell.backgroundImageView setFrame:CGRectMake( cell.message.frame.origin.x - padding/2,
                                              cell.message.frame.origin.y - padding/2,
                                              size.width+padding, 
                                              size.height+padding)];

        cell.date.textAlignment = UITextAlignmentLeft;
        cell.backgroundImageView.image = bgImage;

        if(self.currentRoom){
            cell.date.text = [NSString stringWithFormat:@"%d %@", messageBody.senderID, time];
        }else{
            cell.date.text = [NSString stringWithFormat:@"%@ %@", [[[DataManager shared] currentUser] login], time];
        }

    } else {

        bgImage = [[UIImage imageNamed:@"aqua.png"] stretchableImageWithLeftCapWidth:24  topCapHeight:15];

        [cell.message setFrame:CGRectMake(320 - size.width - padding,
                                                     padding*2, 
                                                     size.width+padding, 
                                                     size.height+padding)];

        [cell.backgroundImageView setFrame:CGRectMake(cell.message.frame.origin.x - padding/2,
                                              cell.message.frame.origin.y - padding/2,
                                              size.width+padding, 
                                              size.height+padding)];

        cell.date.textAlignment = UITextAlignmentRight;
        cell.backgroundImageView.image = bgImage;
        cell.date.text = [NSString stringWithFormat:@"%@ %@", self.opponent.login, time];
    }

    return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [self.messages count];
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    QBChatMessage *chatMessage = (QBChatMessage *)[messages objectAtIndex:indexPath.row];
    NSString *text = chatMessage.text;
    CGSize  textSize = { 260.0, 10000.0 };
    CGSize size = [text sizeWithFont:[UIFont boldSystemFontOfSize:13]
                  constrainedToSize:textSize 
                      lineBreakMode:UILineBreakModeWordWrap];

    size.height += padding;
    return size.height+padding+5;
}


#pragma mark -
#pragma mark QBChatDelegate

// Did receive 1-1 message
- (void)chatDidReceiveMessage:(QBChatMessage *)message{

    [self.messages addObject:message];

    // save message to cache if this 1-1 chat
    if (self.opponent) {
        [[DataManager shared] saveMessage:[NSKeyedArchiver archivedDataWithRootObject:messages]
                  toHistoryWithOpponentID:self.opponent.ID];
    }

    // reload table
    [self.tableView reloadData];
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[messages count]-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}

// Did receive message in room
- (void)chatRoomDidReceiveMessage:(QBChatMessage *)message fromRoom:(NSString *)roomName{
    // save message
    [self.messages addObject:message];

    // reload table
    [self.tableView reloadData];
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[messages count]-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}

// Fired when you did leave room
- (void)chatRoomDidLeave:(NSString *)roomName{
    NSLog(@"Chat Controller chatRoomDidLeave");
}

// Called in case changing occupant
- (void)chatRoomDidChangeOnlineUsers:(NSArray *)onlineUsers room:(NSString *)roomName{
    NSLog(@"chatRoomDidChangeOnlineUsers %@, %@",roomName, onlineUsers);
}

- (void)chatRoomDidEnter:(QBChatRoom *)room{
    NSLog(@"Private room %@ was created", room.name);

    // You have to retain created room if this is temporary room. In other cases room will be destroyed and all occupants will be disconnected from room
    self.currentRoom =  room;

    // Add users to this room

    NSInteger user_id = [[[[API sharedInstance] user] objectForKey: @"id"] intValue];
    NSNumber *me = [NSNumber numberWithInt: user_id];
    NSArray *users = [NSArray arrayWithObjects: me, nil];

    [[QBChat instance] addUsers:users toRoom:room];
}

@end

最佳答案

我不确定您是否拥有具有这些凭据的用户

 extendedAuthRequest.userLogin = @"testjk";
 extendedAuthRequest.userPassword = @"jerry";

关于ios - 我收到未经授权的错误 quickblox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17354233/

有关ios - 我收到未经授权的错误 quickblox的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  3. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  4. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  5. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  6. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  7. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  8. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  9. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  10. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

随机推荐