IOS

Ask tech team
From QuickBlox Developers (API docs, code samples, SDK)
Jump to: navigation, search

We’d love your input on our survey about how you drive development with QuickBlox iOS SDK https://quickblox.com/survey/ios.
It will take just 2 minutes of your time!

Contents

Download iOS SDK

Quickblox iOS SDK, version 2.8.0.1


Code samples

Learn how to enable Push Notifications, create a Chat room, authenticate users via Facebook, show users' locations and POIs, store and retrieve files from the cloud - these code samples are simple enough that even novice developers will be able to understand them.

Title APIs used Description
Simple iOS Chat code sample Chat, Users The Chat sample connects and socializes your users with the chat module. Features include: Peer to Peer Chat; Group chat; Location based chat; Push notifications for offline users.


Simple iOS WebRTC (VideoChat) code sample Chat, VideoChat The VideoChat code sample allows you to easily add video calling and audio calling features into your iOS app. Enable a video call function similar to FaceTime or Skype using this code sample as a basis.


Login iOS.PNG Users iOS.PNG Incoming Call.png P2P iOS.PNG Group iOS.PNG

Simple iOS Custom Objects (key value data store) code sample Custom Objects This Custom Objects sample allows you to create any server side data structure, utilise it for any purpose, create any logic and many other custom features.


Simple iOS Location code sample Location, Users The Location sample connects app users with each other and their environment. Using GPS locations, map integrations and local data, end users can literally 'see' each other on the map and communicate with other users.


Simple iOS Push Notifications code sample Messages Push notifications to your user base — even when your app is not running! This sample enables you to send notifications and alerts to users at any time through an API or easy-to-use admin panel. You can filter who you send messages to through additional parameters.


Simple iOS Users authentication (Facebook, Twitter, OAuth integration) code sample Users The Users sample helps you manage and retain your user base across all platforms. It includes a simple authentication process with Single Sign-On and integration across all popular platforms, including social integration with Twitter/Facebook


Simple iOS content storage and update code sample Content The Content sample allows you to send, stream, store, share and save content, so that you may update your app's content without having to republish.



How to: add SDK to Xcode and connect to the cloud

Read Connecting Quickblox Framework with Your Project

Getting started

iOS SDK is really simple to use. In just a few minutes you can power up your mobile app with huge amount of awesome communication features & data services.

The common way to interact with QuickBlox can be presented with the following sequence of actions:

  1. Initialize framework with application credentials
  2. Login with existing user or register new one
  3. Perform actions with QuickBlox communication services and any data entities (users, locations, files, custom objects, pushes etc.)

Initialize framework

[QBSettings setApplicationID:92];
[QBSettings setAuthKey:@"wJHdOcQSxXQGWx5"];
[QBSettings setAuthSecret:@"BTFsj7Rtt27DAmT"];
[QBSettings setAccountKey:@"7yvNe17TnjNUqDoPwfqp"];

It's also possible to initialise the SDK with an existent QuickBlox token. It can be interesting in cases when you build a big system and you have the server side which generates QuickBlox tokens for example:

[QBSettings setApplicationID:92];
[QBSettings setAuthKey:@""]; // don't need to set
[QBSettings setAuthSecret:@""]; // don't need to set
 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss z"];
NSDate *expirationDate = [formatter dateFromString:@"2014-10-20 11:13:06 UTC"];
//
QBASession *session = [QBASession new];
session.token = @"f23d03bd2341a1f923b7d4c1fbee97af1cd296f2";
 
// updateSessionBlock executes synchronously on background thread and you are allowed to execute synchronous URL request
// and to block a background thread from executing until you receive updated credentials
// by the end of updateSessionBlock you should call startSessionWithDetails: with updated credentials
[[QBSession currentSession] startSessionWithDetails:session updateSessionBlock:{
//
// Execute synchronous URL request to retrieve new token from custom server
//
// Until the end of this block all the operations will be paused
QBASession *updatedSession = [QBASession new];
session.token = @"new token";
 
[[QBSession currentSession] startSessionWithDetails:updatedSession];
 
//
}];

A few words about Authentication and Authorization

Overview

Stating from QuickBlox iOS SDK 2.4 you don't need to manage session manually. SDK will automatically do all this job.

After login a REST session will be available for 2 hours.

When the session expires, any QBRequest method will firstly renew it and then execute itself.

To be able to use QuickBlox API you have to create a user and be signed in.


To create a user use the following snippet:

QBUUser *user = [QBUUser user];
user.login = @"garry";
user.password = @"garry5santos";
 
[QBRequest signUp:user successBlock:^(QBResponse *response, QBUUser *user) {
    // Success, do something
} errorBlock:^(QBResponse *response) {
    // error handling
    NSLog(@"error: %@", response.error);
}];

Then you can login with the user:

[QBRequest logInWithUserLogin:@"garry" password:@"garry5santos" successBlock:^(QBResponse *response, QBUUser *user) {
    // Success, do something
} errorBlock:^(QBResponse *response) {
    // error handling
    NSLog(@"error: %@", response.error);
}];


In order to use real time features you have to be logged in to Chat:

QBUUser *currentUser = [QBUUser user];
currentUser.ID = 2569; // your current user's ID
currentUser.password = @"garrySant88"; // your current user's password   
 
[[QBChat instance] connectWithUser:user completion:^(NSError * _Nullable error) {
    NSLog(@"Error: %@", error);
}];


Endpoints customization

You may need to configure custom endpoints to point your application to a custom backend.

This should be called in AppDelegate.m in the method

application:didFinishLaunchingWithOptions:

//Set settings for zone
[QBSettings setApiEndpoint:@"https://yourApiEndpoint.quickblox.com" chatEndpoint:@"yourChatEndpoint.quickblox.com" forServiceZone:QBConnectionZoneTypeProduction];
 
// Activate zone
[QBSettings setServiceZone:QBConnectionZoneTypeProduction];

Read on: iOS SDK documentation (Apple style)

Full reference on classes and protocols used in QuickBlox iOS SDK:
http://sdk.quickblox.com/ios/documentation/sdk

iOS SDK Transition guide from version 1.9 to 2.0

Transition guide from version 1.9 to 2.x


Main changes

  • ARC compatible
  • Block callbacks
  • JSON based requests to QuickBlox API
  • General restructuring and reachitecture
  • Cocoapods integration


All requests to QuickBlox now start from QBRequest class.


CocoaPods integration

Remember: Be sure that you have $(inherited) in Other Linker Flags in build settings. Otherwise you will receive linking errors with undefined classes.

To install QuickBlox framework using CocoaPods - you should just add following line in your Podfile:

pod 'QuickBlox'


And run pod install in your Terminal.

That's all :)

More info you can find on cocoapods.org, Get Started section.


Connecting to QuickBlox 1.9 SDK

[QBSettings setApplicationID:92];
[QBSettings setAuthorizationKey:@"wJHdOcQSxXQGWx5"];
[QBSettings setAuthorizationSecret:@"BTFsj7Rtt27DAmT"];
[QBSettings setAccountKey:@"7yvNe17TnjNUqDoPwfqp"];

2.0 SDK

[QBApplication sharedApplication].applicationId = 92;
[QBConnection registerServiceKey:@"wJHdOcQSxXQGWx5"];
[QBConnection registerServiceSecret:@"BTFsj7Rtt27DAmT"];
[QBSettings setAccountKey:@"7yvNe17TnjNUqDoPwfqp"];

QBSettings is replaced with:

  • QBApplication class is used for storing your app applicationId.
  • QBConnection class stores service key and secret.


Creating session example 1.9 SDK

[QBAuth createSessionWithExtendedRequest:extendedAuthRequest delegate:self];
 
#pragma mark -
#pragma mark QBActionStatusDelegate
 
// QuickBlox API queries delegate
- (void)completedWithResult:(QBResult*)result{
    // QuickBlox session creation result
    if( [result isKindOfClass:[QBAAuthSessionCreationResult class]] ){
        if( result.success ){
            // session created
        }
    }
}

2.0 SDK

[QBRequest createSessionWithSuccessBlock:^(QBResponse *response, QBASession *session) {
    // session created
} errorBlock:^(QBResponse *response) {
    // handle errors
    NSLog("%@", response.error);
}];

Instead of QBActionStatusDelegate you need to implement block callbacks. In success block you could use QBASession object. If error block is fired you could look at error property of response object.


Upload/Download progress block example 1.9 SDK

UIImage *image = [UIImage imageNamed:@"greatImage.png"];
NSData* imageData = UIImagePNGRepresentation(image);
 
[QBContent TUploadFile:imageData fileName:@"Great Image" contentType:@"image/png" isPublic:NO delegate:self];
 
#pragma mark -
#pragma mark QBActionStatusDelegate
 
- (void)setProgress:(float)progress{
    NSLog(@"progress: %f", progress);
}

2.0 SDK

// show progress changes
QBRequestStatusUpdateBlock block = ^(QBRequest *request, QBRequestStatus *status) {
    NSLog(@"%f", status.percentOfCompletion);
};
 
// Upload file to QuickBlox server
UIImage *image = [UIImage imageNamed:@"greatImage.png"];
NSData* imageData = UIImagePNGRepresentation(image);
QBRequest *request = [QBRequest TUploadFile:imageData fileName:@"Great Image" contentType:@"image/png" isPublic:NO successBlock:nil statusBlock:block errorBlock:nil];


Push notification changes 1.9 SDK

// AppDelegate.m
 
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    NSLog(@"didReceiveRemoteNotification userInfo=%@", userInfo);
}
 
// YourClass.m
 
QBASessionCreationRequest *extendedAuthRequest = [QBASessionCreationRequest request];
extendedAuthRequest.userLogin = @"injoitUser1";
extendedAuthRequest.userPassword = @"injoitUser1";
 
// QuickBlox session creation
[QBAuth createSessionWithExtendedRequest:extendedAuthRequest delegate:self];
 
#pragma mark -
#pragma mark QBActionStatusDelegate
 
// QuickBlox API queries delegate
- (void)completedWithResult:(QBResult *)result{
    // Success result
    if( result.success ){
        // QuickBlox session creation result
        if( [result isKindOfClass:[QBAAuthSessionCreationResult class]] ){            
            // Register as subscriber for Push Notifications
            [QBMessages TRegisterSubscriptionWithDelegate:self];
        // QuickBlox register for Push Notifications result
        }
        else if( [result isKindOfClass:[QBMRegisterSubscriptionTaskResult class]] ){
            // you can now receive push notifications
        }
    }
    else{
        // show Errors
    }
}

2.0 SDK

// AppDelegate.m
 
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    NSLog(@"didReceiveRemoteNotification userInfo=%@", userInfo);
}
 
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
    // register for push notifications
    [QBRequest registerSubscriptionForDeviceToken:deviceToken successBlock:^(QBResponse *response, NSArray *subscriptions) {
    // successfully subscribed
    } errorBlock:nil];
}
 
// YourClass.m
 
// Create extended session request (for push notifications)
QBSessionParameters *parameters = [[QBSessionParameters alloc] init];
parameters.userLogin = @"injoitUser1";
parameters.userPassword = @"injoitUser1";
 
// QuickBlox session creation
[QBRequest createSessionWithExtendedParameters:parameters successBlock:^(QBResponse *response, QBASession *session) {
    UIRemoteNotificationType types = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound;
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
} errorBlock:nil];


Errors 2.0 SDK

If errorBlock of the request is fired you have a response object within block:

[QBRequest userWithExternalID:555 successBlock:^(QBResponse *response, QBUUser *user) {
    NSLog(@"Successfull response!");
} errorBlock:^(QBResponse *response) {
    NSLog(@"Response error: %@", response.error.reasons);
}];

From QBResponse class you could get information about failed request. error property is an instance of QBError class that stores information about error. reasons property of QBError class contains NSDictionary with human readable reasons of failure. If the reasons is nil than you could look at error property of QBError to identify where is the problem.

Framework changelog

v2.8.0.1 — Sep 20, 2016

  • Fixed mutualBlock property in QBPrivacyItem class being readonly. By default user, who is blocking, can send messages and presences to the one he blocked without any errors. To achieve a two-way block set this property to YES. After that the user, who is blocking, will receive errors when will try to communicate with blocked user.


v2.8 — Sep 16, 2016

  • Introducing refactored connect to chat. Now even faster.
  • Fixed Join in group dialogs deadlock, whenever user was performing join in bunch of rooms at the same time.
  • Added mutualBlock property to QBPrivacyItem class. By default user, who is blocking, can send messages and presences to the one he blocked without any errors. To achieve a two-way block set this property to YES. After that the user, who is blocking, will receive errors when will try to communicate with blocked user.
  • Updated inline documentations and nullability pointers in various classes headers.
  • [iOS 10]
    • In order for QBSession restoration from keychain to work as intended, you from now on need to turn on keychain share in your application project capabilities.



Previous releases

v2.7.6 — Aug 12, 2016

  • Removed encoding/decoding for XML escape characters in QBChatMessage. This feature is now been supported by server.
  • Deprecated methods + (void)setChatDNSLookupCacheEnabled:(BOOL)enabled and + (BOOL)isChatDNSLookupCacheEnabled of QBSettings class. The feature was removed.


  • QMServices v0.4.4:
    • Minor logic refactoring and improvements.
    • Fixed reading same message multiple times resulting in multiple delegate calls.
    • Fixed QBChatDialog updatedAt not being updated for adding occupants.
    • QMChatAttachmentService refactoring:
      • Deprecated getImageForAttachmentMessage:completion: method. Use imageForAttachmentMessage:completion: instead.
      • Added localImageForAttachmentMessage:completion: method. Use it to get image from local storage.
    • Fixed searchUsersWithPhoneNumbers: in QMUsersService class not returning BFTask (thanks joihelgi).
    • Added loginWithTwitterAccessToken:accessTokenSecret: method to QMAuthService. Use it to log in with twitter access token and access token secret.
    • Fixed several issues, that were preventing project from compiling and running using use_frameworks! flag in podfile.
    • Fixed contact list emptiness check in QMContactListService. This fixes several problems for contact list been erased from both cache and memory storage after chat disconnect.
    • All contact list will be replaced in cache after using insertOrUpdate methods in QMContactListCache class. This fixes issues with removed contacts not been removed from cache


  • QMChatViewController v0.3.10:
    • Implemented functionality for copy and paste images in input text field. Use didPressSendButton:withTextAttachments:senderId:senderDisplayName:date: method in sub-class for this.
    • Fixed several issues, that were preventing project from compiling and running using use_frameworks! flag in podfile.


v2.7.5 — Aug 3, 2016

  • Introducing Quickblox iOS SDK as dynamic framework. See our updated installation guide on this.
    • Dynamic framework is supporting iOS 8+.
    • For iOS 7+ use QuickBlox-static pod as static library.
  • Added framework version as QuickbloxFrameworkVersion extern constant.
  • [FIXES]
    • Fixed QBChat connection issues with IPv6.
    • Fixed QBCOFileUploadInfo not being public class (thanks mskrischke).
    • Fixed memory leak with QBSession management.


v2.7.4 — July 15, 2016

  • Refactored QBPrivacyItem class interface (with backwards compatibility):
    • Refactored C-style enums for NS_ENUM to match latest Swift support:
      • Deprecated QBPrivacyItemType enum, use QBPrivacyType instead.
      • Deprecated QBPrivacyItemAction enum, use QBPrivacyAction instead.
    • Deprecated old enum-representive properties:
      • Deprecated type property. Use privacyType instead.
      • Deprecated action property. Use privacyAction instead.
    • Deprecated constructor initWithType:valueForType:action:. Use initWithPrivacyType:value:privacyAction instead.
  • Refactored QBPrivacyList class interface:
    • Deprecated items property. Use privacyItems instead.
    • Deprecated count method, use privacyItems.count instead.
  • Minor inline documentation improvement for various classes.
  • Added data property to QBChatAttachment class interface. Use this property to store any additional data, that does not fit in already existent properties.
  • Added isConnecting property to QBChat class interface. Use this property to determine whether chat connection is in progress.


  • QMServices v0.4.3:
    • QMServices v0.4.3 is now requiring Quickblox iOS SDK 2.7.4 or later.
    • Implemented flag to enable/disable logging for QMServices project. In order to do so use QMServicesManager class static method: + (void)enableLogging:(BOOL)flag;.
    • Added caching for new QBChatAttachment field - data.
    • Implemented QBChatAttachment+CustomData category. Use this to convert dictionary into JSON string and vise-versa.
    • Implemented location message model. QBChatMessage+QMCustomParameters category now have locationCoordinate property. Use it to set/get location from message instance.
    • Fixed contact list been erased in both memory storage and cache whenever chat did disconnect.


  • QMChatViewController v0.3.9:
    • Added leftContentPadding and rightContentPadding properties to QMToolbarContentView class interface. Use them to set left and right padding in toolbar content view.
    • Fixed expand for toolbar.
    • Implemented location UI:
      • Added QMChatLocationIncomingCell and QMChatLocationOutgoingCell.
      • Added UIImageView+QMLocationSnapshot category. Use it to set location into image view by setSnapshotWithLocationCoordinate: method.
      • QMChatLocationCell protocol to determine location cells and collaborate with its image view.
    • Added scrolling to last message if keyboard frame has changed.
    • Fixed NSTextAttachment not been showed in QMChatNotificationCell.

v2.7.3 — June 7, 2016

  • [QBChat]
    • Introduced new QBChat feature - XMPP Ping. You can use the following methods:
      • pingServer: - send ping to server with completion block.
      • pingServerWithTimeout:completion: - send ping to server with timeout and completion block.
      • pingUserWithID:completion: - send ping to user with ID and completion block.
      • pingUserWithID:timeout:completion: - send ping to user with timeout and completion block.
        • ** Note ** completion block will be called when ping will reach its destination or destination is not reachable (in this case completion block will return an error).
    • QBChat in-depth optimization.
    • Deprecated several blocks name definition to make a simple and little amount of them (see ChatEnums header file):
      • QBChatDialogStatusBlock - use QBChatCompletionBlock block definition instead.
      • QBChatDialogRequestOnlineUsersBlock - use QBChatDialogRequestOnlineUsersCompletionBlock block definition instead.
      • QBChatDialogJoinFailedBlock - use QBChatCompletionBlock block definition instead.
      • QBChatDialogIsTypingBlock - use QBChatDialogUserBlock block definition instead.
      • QBChatDialogStoppedTypingBlock - use QBChatDialogUserBlock block definition instead.
      • QBChatDialogOccupantJoinBlock - use QBChatDialogUserBlock block definition instead.
      • QBChatDialogOccupantLeaveBlock - use QBChatDialogUserBlock block definition instead.
      • QBChatDialogOccupantUpdateBlock - use QBChatDialogUserBlock block definition instead.
      • QBChatDialogBlockedMessageBlock - use QBChatCompletionBlock block definition instead.
    • Removed stream management for join and leave methods in QBChatDialog due to them have a server callback. This fixes several performance issues (e.g. long join for multiple room) with join/leave methods.
    • Added check for QBChatDialog instance not being private type in order to perform requestOnlineUsersWithCompletionBlock: method.


  • [MISC]
    • Stability improvements for sample-chat and sample-chat-swift sample projects.
    • Minor inline documentation improvements for several classes.
    • Fixed rare crash with session parsing for simulators with iOS 8 and lower (thanks to dpfaffenbauer for finding and reporting the issue!).
    • Fixed wrong date serialization for QBMEvent creation and server response handling (thanks to neshyurik for finding and reporting the issue!).
    • Fixed local session not being removed after deleteCurrentUserWithSuccessBlock: method successful result.


  • QMServices v0.4.2:
    • Fixed incorrect pointers for methods:
      • getUserWithExternalID:
      • getUserWithExternalID:forceLoad:
    • Added missing nullability pointers.
  • QMServices v0.4.1:
    • Implemented forceLoad flag for every get user method in QMUsersService. Set this flag to YES in order to force users loading from server.
      • ** Note ** every get method now have its own implementation with forceLoad. By default selectors with no forceLoad variable will consider it as NO.
    • Implemented usersService:didUpdateUsers: delegate in QMUsersServiceDelegate protocol. This delegate will notify about users been updated in memory storage by calling get methods with forceLoad flag as YES.
    • Implemented getUsersWithTwitterIDs: and getUserWithExternalID: in QMChatService class.
    • Added userWithExternalID:, userWithExternalIDs: and usersWithTwitterIDs: methods to QMUsersMemoryStorage class.
    • Fixed delegate chatService:didAddChatDialogsToMemoryStorage: been called even when there is no dialogs to add.
    • Added removing messages logic for dialog that does not exists for messagesWithChatDialogID:completion: method callback.
    • Several improvements for read message method.
    • Fixed crash when readMessages:forDialogID: method was trying to update dialog that does not exist anymore.
    • Added chatServiceChatHasStartedConnecting: delegate to QMChatConnectionDelegate protocol. Use it to get notified when QMChatService is performing chat connect.
    • Minor improvements for several classes headers.
    • Deprecated sendSystemMessageAboutAddingToDialog:toUsersIDs:completion: in QMChatService class - use sendSystemMessageAboutAddingToDialog:toUsersIDs:withText:completion: instead.
    • Improvements and fixes for QBChatDialog unreadMessageCounter managing.
    • Improvements and fixes for chat carbons:
      • Fixed read message markings.
      • Fixed contact request QBChatDialog been created with self and not an opponent for a carbon message.
    • Added chat connection states to QMChatService class. See chatConnectionState property which has 3 states: disconnected, connecting and connected.
    • Refactored and fixed logic for updating group dialogs in handleChatMessage: method.
    • Added public interface for sending message with a specific type. See sendMessage:type:toDialog:saveToHistory:saveToStorage:completion: method. The purpose of this method is to have a proper way of sending messages with a different message type, which does not have their own methods in QMChatService class (e.g. contact request).


  • QMChatViewController v0.3.8:
    • Added check for camera access before performing image picker initialization.
    • Fixed scroll jump on receiving new message while scrolling through chat history.
    • Allowed TTTAttributedLabel 2.0. Dependency are now requiring 1.13 and later.
    • Added text checking results for incoming and outgoing text cell. Set up text checking types by setting enableTextCheckingTypes property in QMChatViewController subclass. Handle QMChatCell chatCell:didTapOnTextCheckingResult: delegate in order to listen for user taps on it.
    • chatCell:didTapAtPosition: and chatCell:didPerformAction:withSender: are now optional QMChatCell delegate methods and can be ignored in QMChatCellDelegate protocol implementation.
    • Removed old deprecated properties and methods in QMChatViewController class:
      • timeIntervalBetweenSections property - use chatSectionManager.timeIntervalBetweenSections instead.
      • updateDataSourceWithMessages:, insertMessagesToTheTopAnimated:, insertMessageToTheBottomAnimated: and insertMessagesToTheBottomAnimated: methods - use [chatSectionManager addMessage:] or [chatSectionManager addMessages:] instead.
      • updateMessage: and updateMessages: - use [chatSectionManager updateMessage:] or [chatSectionManager updateMessages:] instead.
      • deleteMessage: and deleteMessages: methods - use [chatSectionManager deleteMessage:] or [chatSectionManager deleteMessages:] instead.
      • messageForIndexPath: method - use [chatSectionManager messageForIndexPath:] instead.
      • indexPathForMessage: method - use [chatSectionManager indexPathForMessage:] instead.


v2.7.2.1 — June 03, 2016

  • Hot fixed QBChat with IPv6 support


v2.7.2 — Apr 19, 2016

  • Hot fixed QBError and QBConnection duplicate symbols.
  • Fixed nullability pointer for markMessagesAsRead:dialogID:successBlock:errorBlock: method in QBRequest+QBChat class. You can now pass nil into messagesIDs to mark all messages in a specific dialog as read.
  • Deprecated registerSubscriptionForDeviceToken:uniqueDeviceIdentifier:successBlock:errorBlock method in QBRequest+QBPushNotifications class. Use 'createSubscription:successBlock:errorBlock method instead.
  • Fixed Xcode 6 compatibility for Objective-C chat sample.


  • QMServices v0.4:
    • Fixed license warning for Cocoapods.
    • Removed carbons enabling after chat did connect. You should enable carbons with all QBSettings you are setting from now on. Use [QBSettings setCarbonsEnabled:YES] for that.
    • Removed deprecated methods in QMChatAttachmentService class.
      • Removed sendMessage:toDialog:withChatService:withAttachedImage:completion: method. Use [chatService sendAttachmentMessage:toDialog:withAttachmentImage:completion:] instead.
      • Removed getImageForChatAttachment:completion method. Use getImageForAttachmentMessage:completion: method instead.
    • Removed sendMessageAboutUpdateDialog:withNotificationText:customParameters:completion: method from QMChatService class. Use sendNotificationMessageAboutAddingOccupants:toDialog:completion:, sendNotificationMessageAboutLeavingDialog:completion:, sendNotificationMessageAboutChangingDialogPhoto:completion: or sendNotificationMessageAboutChangingDialogName:completion: depending on update type instead.
    • Fixed some nullability pointers in generics.
    • QBUUser customData field context management now have public interface. See QBUUser+CustomData class.
    • Updated log style for Cache modules.
    • Removed explicit call of nullability in implementation files (Xcode 6 compatibility).
    • Excluded Frameworks folder for public Cocoapods podspec.


  • QMChatViewController v0.3.7:
    • Fixed license warning for Cocoapods.


v2.7.1 — Apr 15, 2016

  • Introduced feature to enable logging in file. Use [QBSettings enableFileLoggingWithMaximumFileSize:] method in order to enable file logging with maximum file size in bytes, for example: 1024 * 1024 * 10 = 10Mb. You can also use [QBSettings logFilePaths] in order to see log file path and [QBSettings disableFileLogging] to stop file logging.
  • Fixed unexpected crash when QBChatDialog was initialized using initWithCoder: constructor.
  • Error reasons of failed QBRequest will now be printed in debug console automatically.
  • Minor SDK cleanup and performance improvements.
  • Deprecated senderNick property of QBChatMessage class. Use customParameters in order to send your own sender name if required.
  • Deprecated sendPresence method of QBChat class. You are no longer required to send presences in order to stay online in chat. If you still want to send custom presences use sendPresenceWithStatus: method.
  • Added handling for presence with status.
  • Improved [QBSettings setCarbonsEnabled:] method. You are not required to set it every time after chat has connected from now on. Set it only once in your AppDelegate (for example).
  • Fixed bug which was restricting QBCBlob to be cached and restored correctly.
  • Fixed QBCBlob NSCoding and copying.
  • Fixed customUDID property of QBMPushToken class not been serialized, deserialized and copied.
  • Fixed markable property of QBChatMessage class not been serialized, deserialized and copied.
  • Fixed unexpected retain of objects that have been transmitted in blocks for upload and download QBRequest methods of blobs and data.
  • Fixed upload data QBRequest tasks to execute extra request that was not required.


  • QMServices v0.3.9:
    • Added missing generics and nullability pointers to all header files.
    • Cleanup of missing files.
    • Deprecated presence sending. You are no longer required to send presences in order to stay online in chat.
    • Deprecated methods without completion in QMChatCache class. Use same methods with completion blocks.
    • Updated documentation.
    • Added allContactListItems method to QMContactListMemoryStorage class. It will return all existing contact list items.
    • Messages and dialogs will now be loaded using equality parameter (e.g. 'lte', 'gte') due to some of them were missed in server response.
    • Removed binary data from frameworks in Frameworks folder. See updated documentation on manual installation.
    • Added isMessageExistent:forDialogID: method to QMMessagesMemoryStorage class. It will return boolean value whether message is existent in memory storage or not.
    • Added chatService:didUpdateMessages:forDialogID: delegate to QMChatServiceDelegate protocol. Use it to receive notifications about some messages been updated.
    • Fixed Quickblox iOS SDK dependency version in podspec for Cocoapods.
    • Fixed attachments upload and isMediaMessage custom property of QBChatMessage.
    • Added ability to cache customData field of QBChatDialog to Core Data.
    • Messages are now being sorted by two fields: dateSent and ID.
    • Fixed manual installation + updated manual installation guide (see README.md).
    • Notification messages will no longer be marked as delivered (but still need to be marked as read).
    • Fixed unreadMessageCounter not been decremented for chat dialog while messages were read on another device (using Chat carbons).


  • QMChatViewController v0.3.6:
    • Major date time improvements, such as localization and perfomance.
      • Formatted date string for section header will now use Apple localization that conforms to the current language on device (see QMDateUtils class).
    • Removed auto updating message if it was passed to addMessage: or addMessages: method of QMChatSection class and is already existent. Use updateMessage: or updateMessages: method in order to update it.
    • Fixed Quickblox iOS SDK dependency version in podspec for Cocoapods.
    • Messages ordering in chat section will now compare messages ID if dateSent property value of them is equal in order to determine whether message should be put before or after the existent one.
    • Fixed animation parameter not being listened to in deleteMessages:animated: method of QMChatSection class.
    • Fixed chatCellDidTapAvatar: delegate of QMChatCellDelegate protocol not being called after tap on avatar was received.

v2.7 — Mar 17, 2016

  • Introduced feature to disable auto create session on manual session create using initial setup with

startSessionWithDetails:updateSessionBlock: and then updating the session with startSessionWithDetails

  • Fixed XMPPStreamErrorDomain error that was experienced by some users when they tried to join in chat dialog after chat reconnect.
  • Introduced XML decoding/encoding of chat messages. Before sending a message, we creating an encoded copy of that message and then we send the encoded message via REST or Chat API. After receiving messages we decode them. That is needed to send a special symbols through the XMPP channel (using XML).
  • Fixed recipientID in QBChatDialog. recipientID will be retrieved from [QBSession currentSession].currentUser by subtracting currentUser.ID from occupantsIDs.
  • Fixed carbon messages handling.
  • Added QBResponseStatusCodeForbidden(403) error code to QBResponse.
  • Removed the following deprecated methods:
    • File ChatDelegates.h
      • Removed chatDidNotSendMessage:error:, chatDidNotSendMessage:toDialogID:error:. Use onBlockedMessage property of QBChatDialog class instead
    • File QBApplication.h
      • Removed restAPIVersion. Method is no longer available
      • Removed applicationId. Use [QBSettings setApplicationID:]
    • File QBChat.h
      • Removed carbonsEnabled, isCarbonsEnabled. Use [QBSettings setCarbonsEnabled:] after connect to chat
      • Removed streamResumptionEnabled, isStreamResumptionEnabled. Use [QBSettings setStreamResumptionEnabled:]
      • Removed streamManagementSendMessageTimeout. Use [QBSettings setStreamManagementSendMessageTimeout:]
      • Removed autoReconnectEnabled. Use [QBSettings setAutoReconnectEnabled:]
      • Removed reconnectTimerInterval. Use [QBSettings setReconnectTimerInterval:]
      • Removed keepAliveInterval. Use [QBSettings setKeepAliveInterval:]
      • Removed backgroundingEnabled. Method is no longer available
      • Removed disconnect. Use disconnectWithCompletionBlock:
      • Removed readMessage:. Use readMessage:completion:
      • Removed markAsDelivered:. Use markAsDelivered:completion:
      • Removed addUserToContactListRequest:. Use addUserToContactListRequest:completion:
      • Removed addUserToContactListRequest:sentBlock:. Use addUserToContactListRequest:completion:
      • Removed removeUserFromContactList:. Use removeUserFromContactList:completion:
      • Removed removeUserFromContactList:sentBlock:. Use removeUserFromContactList:completion:
      • Removed confirmAddContactRequest:. Use confirmAddContactRequest:completion:
      • Removed confirmAddContactRequest:sentBlock:. Use confirmAddContactRequest:completion:
      • Removed rejectAddContactRequest:. Use rejectAddContactRequest:completion:
      • Removed rejectAddContactRequest:sentBlock:. Use rejectAddContactRequest:completion:
      • Removed sendSystemMessage:. Use sendSystemMessage:completion:
    • File QBChatDialog.h
      • Removed onJoin, setOnJoin:. Use joinWithCompletionBlock:
      • Removed onLeave, setOnLeave:. Use leaveWithCompletionBlock:
      • Removed onReceiveListOfOnlineUsers, setOnReceiveListOfOnlineUsers. Use requestOnlineUsersWithCompletionBlock:
      • Removed onJoinFailed, setOnJoinFailed:. Use joinWithCompletionBlock:
      • Removed sendGroupChatMessageWithoutJoin:. Use sendGroupChatMessageWithoutJoin:completion:
      • Removed join. Use joinWithCompletionBlock:
      • Removed leave. Use leaveWithCompletionBlock:
      • Removed requestOnlineUsers. Use requestOnlineUsersWithCompletionBlock:
    • File QBConnection.h
      • Removed registerServiceKey:. Use [QBSettings setAuthKey:]
      • Removed registerServiceSecret:. Use [QBSettings setAuthSecret:]
      • Removed setServiceZone:. Use [QBSettings setServiceZone:]
      • Removed currentServiceZone. Method is no longer available
      • Removed setNetworkIndicatorManagerEnabled:. Use [QBSettings setNetworkIndicatorManagerEnabled:]
      • Removed isNetworkIndicatorVisible. Use [QBSettings isNetworkIndicatorVisible]
      • Removed setApiDomain:forServiceZone:. Use [QBSettings setApiEndpoint:chatEndpoint:forServiceZone:]
      • Removed currentApiDomain. Method is no longer available
    • File QBRequest+QBUsers.h
      • Removed deleteUserWithID:successBlock:errorBlock:. Use [QBRequest deleteCurrentUser:successBlock:errorBlock:]
      • Removed deleteUserWithExternalID:successBlock:errorBlock:. Use [QBRequest deleteCurrentUser:successBlock:errorBlock:]
    • File QBRequest.h
      • Removed operation. Property is no longer available due to internal architecture changes
    • File QBSettings.h
      • Removed setBackgroundingEnabled:. Method is no longer available
      • Removed setServerChatDomain:. Use setApiEndpoint:chatEndpoint:forServiceZone:
      • Removed serverChatDomain. Method is no longer available
  • QMServices v 0.3.8:
    • Added delegate method -usersService:didLoadUsersFromCache which is getting called when users were loaded from cache to memory storage
    • Added missing generics, implemented chatDialogsWithUsersIDs method - Get all dialogs with specific user ids.
    • Refactored contact list loading from cache to memory storage
    • Updated logic for notification message about leaving dialog
    • Added possibility to Enable/disable auto join in QMChatService for group chat dialogs (use this if you want to handle group dialog joining manually)
    • Deleted chat dialog from all devices if chat owner leaves the group chat (carbons functionality)
    • Added lastRequestAt field caching for QBUUser in QMUsersCache
    • Remove encoding / decoding category from chat service (this logic was moved to our latest SDK 2.7)
    • Fixed field lastMessageUserId of QBChatDialog not being updated after message sending / receiving
    • Fixed delegate - chatService:didDeleteMessageFromMemoryStorage -chatService:didDeleteMessagesFromMemoryStorage not to return messages due to them being deleted through a straight pointer
    • Fixed carbon message for private chat dialog
  • QMChatViewController v0.3.5:
    • Added missing constructors in QMImageView
    • Redesigned QMChatContactRequestCell
    • Removed line limit for QMChatNotificationCell
    • Updated QMDateUtils
    • Fixed messages ordering in chat sections when there was only one section


v2.6.6 — Feb 23, 2016

  • Improved QBChat performance with optimizations for serialization/deserialization QBChatMessages
  • +[QBSettings setChatDNSLookupCacheEnabled:] - this setting allows to cache the dns lookup result when connect to chat. This is to speed up the chat login request.
  • Fixed chat carbon system messages
  • Added methods to manage typing statuses without join for enterprise:

-[QBChatDialog sendUserIsTypingWithoutJoin]

-[QBChatDialog sendUserStoppedTypingWithoutJoin]

  • QMServices v 0.3.7:
    • Uses auto migration stack for Core Data by default. Migration option NSMigratePersistentStoresAutomaticallyOption, NSInferMappingModelAutomaticallyOption
    • Added missing field update on adding chat dialog
    • Delayed messages should no longer increment unread message counter
    • Updated Bolts framework to v1.5
    • Removed Git-LFS
    • Added check for dialog existence in system message handling
    • Changed license to 3-clause BSD
  • QMChatViewController v0.3.4:
    • Fixed incorrect year comparison
    • Added async chat section manager (QMChatSectionManager)
    • Fixed cell size calculation and added maxWidthMarginSpace
    • Changed license to 3-clause BSD
    • Deprecated methods :
      • - [QMChatViewController updateDataSourceWithMessages:];
      • - [QMChatViewController insertMessagesToTheTopAnimated:];
      • - [QMChatViewController insertMessagesToTheBottomAnimated:];
      • - [QMChatViewController totalMessagesCount];
      • - [QMChatViewController timeIntervalBetweenSections];
      • - [QMChatViewController updateMessage:];
      • - [QMChatViewController updateMessages:];
      • - [QMChatViewController deleteMessage:];
      • - [QMChatViewController deleteMessages:];
      • - [QMChatViewController messageForIndexPath:];
      • - [QMChatViewController indexPathForMessage:];


v2.6.5 — Feb 4, 2016

  • Fixed issue with 'QBSession currentUser will only be reassigned if userID has changed'.
  • Fixed error block never called for QBRequest data type if session creation was failed.
  • Added handling a case with creating a session without internet.
  • Fixed issue with 'Join to room'.
  • Added session start skipping for QBChat connection.
  • Added check if received roomJID from server is different from created by QBChatDialog constructor
  • Fixed Warning for reconnect time interval being less then 5
  • QMServices v 0.3.6:
    • Removed roomJID from caching in QMChatCache
    • Added new didUpdateChatDialogs delegate in QMChatService delegates


v2.6.4 — Jan 27, 2016

  • Added storing session details per api endpoint, now you can easily switch api endpoints
  • Added full XMPP logging(disabled by default), enable it with [QBSettings enableXMPPLogging]
  • Added [QBRequest deleteCurrentUserWithSuccessBlock:errorBlock]. You can delete only current user.
  • Fixed chat connection in disconnectWithCompletionBlock

Deprecated methods:

+ [QBRequest deleteUserWithID:successBlock:errorBlock:]
+ [QBRequest deleteUserWithExternalID:successBlock:errorBlock:]
instead use +[QBRequest deleteCurrentUserWithSuccessBlock:errorBlock:]


v2.6.3 — Jan 20, 2016

  • Fixed restoring session on network connection lost
  • Fixed parsing errors from server
  • Changed server endpoints update time from 6h to 1h
  • Fixed QBDialog.requestOnlineUsers for group chat dialogs


v2.6.2 — Jan 8, 2016

  • Fixed content upload for iOS7
  • Improved QBChat performance


v2.6.1 — Dec 16, 2015

  • Content module: public URL and private URL for UID
  • Background session support for download requests.
  • Session configuration for REST requests


v2.6.0.2 — Dec 9, 2015

  • Bitcode is enadled
  • FBKVOController now is correctly prefixed


v2.6.0.1 — Dec 3, 2015

  • Fixed an issue with thread with group chat join.


v2.6 — Dec 2, 2015

  • QMServices 0.3.1
    • QMUsersService + Cache
  • QMChatViewController 0.3
    • Time header view
    • Transformed collection view to improve chat UX
  • SDK
    • NSURLSession is used in REST API core
    • Various improvements in auto-create session flow
    • Bugfix:
      • Completion block on [QBChat disconnectWithCompletionBlock:]' called only when disconnect failed
  • Samples
    • Updated to latest SDK, Services and ChatViewController
    • Read message status done right


v2.5 — Nov 9, 2015

  • Components:
    • QMServices 0.3 - Added QMUsersService to simplify operations with users. QMUsersCache - for caching users on disc. Refactoring and cleanup in QMContactListService and QMContactListCache.
  • Samples:
    • Updated to latest services and SDK.
  • SDK:
    • Add assert for incorrect app credentials when trying to create session.
    • Fixed module issue.
    • senderID is now added automatically to to the readIDs and deliveredIDs when message is received by SDK.
    • Unified Quickblox settings in one class.
    • Header with iOS version is added to ther REST API requests.
    • Unified interface for chat methods.


v2.4.6 — Oct 23, 2015

  • SDK:
    • Fixed issue with 'Auto-create session token cleanup'.
    • Added assert about incorrect credentials for SDK.
    • Fixed QBChatDialog 'updated_at' property parsing.
    • Fixed 'Unable to join to room issue'.
  • QMServices:
    • Bug fixes and improvements.
  • QMChatViewController:
    • Bug fixes and improvements.


v2.4.5 — Oct 13, 2015

  • Fixed an issue with create event request in Push Notifications API


v2.4.4 — Oct 12, 2015

  • SDK:
    • Fixed isLoggedIn for chat on iOS 7.
    • Dialog onLeave block not fired" issue fixed.
    • Simplified isEqual in iOS SDK models.
    • Add Generics and Nullability support.
    • Renamed QBChat login/logout/isLoggedIn methods to connect/disconnect/isConnected and QBChatDelegate delegate methods chatDidLogin/chatDidNotLoginWithError to chatDidConnect/chatDidNotConnectWithError
    • Fixed issue with custom parameters in createDialog:successBlock:errorBlock: request.
    • Removed sendDirectPresenceWithStatus in QBChat.
  • Samples:
    • Migrated to Xcode7 support
    • Swift 2, Nullability, Generics support in Swift Chat Sample.
    • Chat Samples: Fixed issue when dialog info was not correctly displayed.
  • QMServices (0.2.3):
    • Implemented update message mechanism.


v2.4.3 — Sep 30, 2015

  • SDK:
    • Added total unread messages count request.
    • Delete dialogs request with 'forAllUsers' option (deleting dialogs only for current user or for all users).
    • Delete messages request with 'forAllUsers' option (deleting messages only for current user or for all users).
    • Add ability to pass 'mark_as_read=0' for get messages request.
    • Removed QBChatRoom class
    • Quickblox framework could be connected to Swift projects without bridging header.
    • Replaced group chat delegates to handle online users statuses with blocks.
    • Renamed Messages module to PushNotifications module
  • Site Documentation:
    • Swift code snippets are added to chat sample documentation.
  • Samples:
    • Push notifications and auto login features are added to the Objective-C Chat Sample and Swift Chat Sample.
  • QMChatViewController:
    • Updated to 0.2.2 version.
  • QMServices:
    • Updated to 0.2.1 version.


v2.4.2 — Sep 25, 2015

  • Custom endpoints bug fixes


v2.4.1 — Sep 16, 2015

  • Custom endpoints bug fixes


v2.4 — Sep 11, 2015

  • Framework:
    • Automatic session management
    • 'Now typing' for group chats
    • Automatic push notifications environment management
    • Added a delegate QBChatDelegate.chatDidReconnect
    • Ability to change the TCP socket keep alive settings
    • The XMPP 'see-other-hosts' processing logic has been added
    • Deprecated the old chat room delegates with jid, added new with dialog id
    • Automatically add a dialog ID to each chat message
    • Set custom endpoints retrieval period time to 6h
    • Ability to manually send the 'delivered' status via QBChat.markAsDelivered method
    • New delegates for read/delivered statuses handling
  • Samples:
    • New completely rewritten Chat code samples on Objectve-C and Swift
    • Updated UI on all code samples
  • Other:


v2.3.0.4 — Aug 7, 2015

  • Fixed an issue with WebRTC video calls between iOS SDK and Firefox web browser


v2.3.0.3 — Jul 20, 2015

  • Fixed an issue with CustomObjects file upload


v2.3.0.2 — Jul 20, 2015

  • Fixed an issue with Content file upload for n