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.7.2


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.


User List.png Video Call.png Incoming Call.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.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.


Previous releases

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 new AWS S3 SDK


v2.3.0.1 — Jun 17, 2015

  • Fixed a crash with [QBConnection setAutoCreateSessionEnabled:YES]


v2.3 — Jun 17, 2015

  • General:
    • Removed API 1.x
  • Chat:
    • Models QBAbstractMessage, QBChatMessage, QBChatHistoryMessage are merged into one model QBChatMessage
    • Now you must use QBChatDialog for all chat related operations. Previous methods are deprecated.
    • Added API to send and receive system messages: A method [[QBChat instance] sendSystemMessage:] and delegate chatDidReceiveSystemMessage:
    • Updated XMPPFramework
    • Ability to mark all chat messages as read: [QBRequest markMessagesAsRead:null dialogID:dialogID successBlock:errorBlock:]
    • Added readIds and dialogId properties to QBChatMessage model
    • TLS connection set by default now
    • Added methods to QBChatDelegate to track chat reconnection states
    • Added method to get a number on chat dialogs and messages: [QBRequest countOfDialogsWithExtendedRequest:successBlock:errorBlock:], [QBRequest countOfMessagesForDialogID:extendedRequest:successBlock:errorBlock:]
    • Added 2 delegate methods for Contact List API: chatDidReceiveAcceptContactRequestFromUser:, chatDidReceiveRejectContactRequestFromUser:
  • Content:
    • Simplified API to download files from Content module. Now QBCBlob model has next methods to get an url to file: publicUrl, publicUrlForID:, privateUrl, privateUrlForID:
  • Custom Objects:
    • Added aggregation API
  • Users:
    • New API to update user
    • Now SDK hosts current logged in user: [QBSession currentSession].currentUser
  • Messages:
    • New methods to register and unregister push notifications that take an additional argument to set device udid.
    • Now you can subscribe to push notifications just with single request: [QBRequest createSubscription:successBlock:errorBlock:]


v2.2.5 — Jun 12, 2015

  • Added readIDs field to QBChatHistoryMessage


v2.2.4 — Apr 28, 2015

  • Removed property QBChat.useMutualSubscriptionForContactList. Now it's always YES.
  • Fixed an issue with contact list accept request functionality.


v2.2.3 — Apr 10, 2015

  • Added method chatDidNotSendMessage:toRoomJid:error to QBChatDelegate


v2.2.2 — Apr 8, 2015

  • Fixed an issue with privacy lists in iOS7
  • Added an ability to block a user in 1-1 and group chats in a single privacy list.


v2.2.1 — Apr 2, 2015

  • Group blocks in chat
  • Added an ability to cancel QBRequest
  • Fixed an issue with chat room join where user's nick was 0


v2.2 — Mar 23, 2015

  • Switched from delegates to block-based API and JSON for Chat API. Previous methods are deprecated.
  • Added an ability to automatic recreate a session [QBConnection setAutoCreateSessionEnabled:YES]
  • Message Carbons(XEP-0280) for Chat
  • Stream Management(XEP-0198) for Chat
  • Auto-reconnection manager for Chat
  • Added an ability to set custom uniqueDeviceIdentifier when subscribe to push notifications: [QBRequest registerSubscriptionForDeviceToken: uniqueDeviceIdentifier: successBlock: errorBlock:]
  • Added an ability to enable activity indicator [QBConnection setNetworkIndicatorManagerEnabled:YES]
  • Fixed an issue with header QB-Token-ExpirationDate when 12h format is set
  • Fixed an issue with totalEntries for pagination requests
  • Fixed an issue with password update for user
  • QBChatDelegate now is multicast delegate
  • Update the logic of QBChatDialog.chatRoom. Now it returns the same value, not the new one.
  • Added an ability to use custom chat resource.


v2.1.1 — Mar 5, 2015

  • Added an ability to set custom parameters to chat dialog


v2.1 — Feb 9, 2015

  • Modules support added (now only WebRTC module uses this)
  • [QBChat instance].delegate property changed from retain to assign
  • Renamed Result class to QBResult
  • Fixed an issue where after social login with new API old requests weren't working


v2.0.12 — Dec 5, 2014

  • fixed some zombie issues
  • updates for Chat server domain logic
  • fixed an issues with chat message attachments parser
  • added a method requestUsersWithAffiliation to QBChat


v2.0.11 — Nov 20, 2014

  • fixed the QBGeneralResponsePage.totalEntries property


v2.0.10 — Oct 20, 2014

  • added 'delete ChatDialog' API
  • added an ability to init SDK with existent QuickBlox token
  • fixed a crash with email notifications
  • set chat message packet ID to MongoDB ObjectID
  • added 'Message Read' status for Chat


v2.0.9 — Oct 3, 2014

  • Fixed an issue with EndpointsAPIStorage


v2.0.8 — Sep 23, 2014

  • Fixed an issue with settings for enterprise account


v2.0.6 — Sep 18, 2014

  • Fixed an issue with update user password


v2.0.5 — Sep 16, 2014

  • Fixed an issue with "is typing" chat status


v2.0.4 — Sep 9, 2014

  • Fixed an issue with session creation with user email
  • Fixed an issue with chat markable messages


v2.0.2 — Sep 1, 2014

  • Fixed an issue with chat delegate chatRoomDidReceiveMessage:fromRoomJID: getting called twice


v2.0.1 — Aug 29, 2014

  • Fixes for Chat TLS negotiation
  • Fixes for arm64 architecture


v2.0 — Aug 28, 2014

  • New syntax for requests
  • ARC support for new API
  • Switched from delegates to block-based API
  • JSON requests
  • Added CocoaPods distribution
  • New API covered with tests
  • General re-architecture
  • Old API is fully supported + marked as deprecated
  • iOS8 Push Notifications support
  • Other Chat related features which we also included to this release:
  • Chat:
    • Added an ability to track 'user is typing' status
    • Added an ability to track 'delivered' status
    • Completely supports TLS negotiation
    • Added 'markMessagesAsRead' method to QBChat
    • Added 'createMessage' method to QBChat


v1.9.2 — Aug 21, 2014

  • Privacy List API


v1.9.1 — Jul 18, 2014

  • Remove senderID from QBChatMessage for group chat


v1.9 — Jul 17, 2014

  • Chat 2.0 API added
  • added customData field to QBUUser


v1.8.6 — May 29, 2014

  • Fixes for session recreation


v1.8.5 — May 22, 2014

  • Custom Objects:
    • fixed an issue with parser that prevented name array field in singular form
  • Content:
    • implemented upload/download file progress delegate
    • translated Blob public url to new format
  • Users:
    • added method [QBUsers usersWithExtendedRequest:filters delegate:self]
  • General:
    • Added new required settings method [QBSettings setAccountKey:@"..."]
    • integrated Endpoints API http://quickblox.com/developers/Overview#Endpoints
    • fixed social login urls for custom servers
    • removed some deprecated methods
    • removed setZone and setServerDomain methods from QBSettings
    • removed kQBVideoChatTURNServerEndPoint key from video chat settings. Added a method to QBSettings to set TURN server endpoint.


v1.8.4 — April 10, 2014

  • Location:
    • added location push notifications


v1.8.3 — April 5, 2014

  • VideoChat:
    • added Cancel call handler
    • fixes for iOS7.1
  • Users:
    • QBUUser. blobID type changed to NSInteger. Now you can unset blob_id field of user - pass blob_id=-1
  • Chat:
    • added [QBChat instance].useMutualSubscriptionForContactList to manage subscriptions mode of chat contact list
    • QBContactListItem: added subscriptionState property
    • added ability to use secureTLS connection for chat: [QBSettings useTLSForChat:YES];
  • General:
    • fixes for QBToken header when use different API domains


v1.8.2 — January 28, 2014

  • enabled HTTPS by default
  • fixed some conflicts with AFNetworking
  • changed type of property QBLGeoDataGetRequest.radius from NSUInteger to CGFloat


v1.8.1 — January 15, 2014

  • VideoChat:
    • integrated iLBC audio codec
    • updated low level audio API


v1.8 — November 27, 2013

  • VideoChat:
    • updated VideoChat API
    • added ability to manage audio route
    • fixes for iOS7, iPhone5C, iPhone5S
  • Chat:
    • added Chat-history-to-CusomObjects plugin: [message saveWhenDeliveredToCustomObjectsWithClassName:@"ChatMessage" additionalParameters:@{@"age": @22, @"type": @"actor"}];
  • Enterprise:
    • added ability to manage S3 bucket: [QBSettings setContentBucket:@"name_of_S3_bucket"]
  • Messages:
    • updated device udid in iOS7
  • General:
    • fixed social login dialog in landscape mode
    • added arm64 support
    • set iOS 5.1.1 as min version
    • renamed BaseService class to QBBaseModule, static method sharedService to sharedModule
    • replaced core network library ASIHTTPRequest with AFNetworking
    • added access to token expiration date [QBBaseModule sharedModule].tokenExpirationDate
  • Custom Objects:
    • added Files API
    • added output parameter to manage records' output fields
    • added ctn, or filters
    • added ability to delete multiple records in single query [QBCustomObjects deleteObjectsWithIDs:@[345,678] className:@"Movie" delegate:self]
    • added ability to create multiple records in single query [QBCustomObjects createObjects:@[object1, object2] className:@"Movie" delegate:self];
    • added ability to update multiple records in single query [QBCustomObjects updateObjects:@[object1, object2] className:@"Movie" delegate:self];
  • Content:
    • added ability to update blob's file [QBContent TUpdateFileWithData:file file:blob delegate:self];


v1.7.2 — September 22, 2013

  • Updates for iOS7


v1.7.1 — August 16, 2013

  • Added ability to set custom API & Chat endpoints (usually these features need for Enterprise clients): [QBSettings setServerApiDomain:@"http://api-mydomain.quickblox.com"];[QBSettings setServerChatDomain:@"chat-mydomain.quickblox.com"];


v1.7 — July 19, 2013<

  • Custom Objects:
    • Permissions API
    • Added method [QBCustomObjects objectsWithClassName: IDs:] to retrieve records by ids
  • Content:
    • Improved file upload query in case with 3G connection
  • Chat:
    • Removed deprecated methods createRoomWithName: and createPrivateRoomWithName: from QBChat class
    • Added ability to join room with custom nickname: [[QBChat instance] createOrJoinRoomWithName:testRoomName nickname:@"GarryGilbert" membersOnly:NO persistent:NO];
    • Updated QBChatRoomOccupant class: replaced NSUInteger userID field with NSString *nickname
    • Added method to send presense with all it's parameters [[QBChat instance] sendPresenceWithStatus:@"PC" show:QBPresenseShowDND priority:0 customParameters:@{@"job": @"manager", @"age": @"25"} toRoom:testRoom];
  • Users:
    • added method [QBUsers usersWithTwitterIDs:] to retrieve users with twitter ids
    • added method [QBUsers usersWithFacebookIDs:] to retrieve users with facebook ids


v1.6 — July 7, 2013

  • Contact list:
    • Added ContactList API
    • Added ‘sendPresenceWithStatus’ method to QBChat to send presence with additional text
    • Added ‘sendDirectPresenceWithStatus:toUser:’ method to QBChat to send direct presence inside contact list
  • QBChatMessage model:
    • Added convenience constructor to QBChatMessage: [QBChatMessage message]
    • Changed type of QBChatMessage ID field to NSString
    • Added ability to set custom parameters to QBChatMessage
  • Group chat:
    • Added ‘sendPresenceWithParameters:toRoom:’ method to QBChat to send presence to room
    • Auto add appID to room name – http://quickblox.com/developers/Chat#Room_naming_convention
    • Updated QBChatDelegate method ‘chatRoomDidChangeOnlineUsers:room:’. Now, each object from ‘onlineUsers’ array is an instance of QBChatRoomOccupant class
  • Video chat:
    • Updated VideoChat API: now you should work with QBVideoChat object instead of QBChat
    • Added ability to make audio calls (without video)
    • Added ability to set custom AVCaptureSession for video chat
    • Added ability to set kQBVideoChatP2PTimeout
    • Added ability to manage torch during call
    • Added ability to switch camera(back, face) during call
    • Added ability to set video capture preset
    • Added ‘cancelCall’ method to QBVideoChat to cancel ‘callUser:’ method
    • Added custom parameters to methods ‘callUser:’ & ‘acceptCall’


v1.5.2 — May 11, 2013

  • removed internal access to UDID
  • Users: added method to QBUsers usersWithPhoneNumbers: - allows to retrieve users by phone numbers
  • fixed 12h datetime format issue


v1.5.1 — March 12, 2013

  • Chat: added method to QBChat requestRoomOnlineUsers: – allows to retrieve room online users
  • Chat: added isJoined property to QBChatRoom
  • Chat: Unsupported symbols now will be removed from room name. You can validate room name using [QBChat roomNameToValidRoomName:roomName]
  • Chat: added method to QBChat destroyRoom: – allows to delete room
  • VideoChat: added muteVideoChat property to QBChat - allows to mute microphone during video conference.
  • Users: added method to QBUsers usersWithLogins: - allows to retrieve users by logins
  • Users: added method to QBUsers usersWithEmails: - allows to retrieve users by emails
  • Now you can manage timeout for queries [QBSettings setTimeOutSeconds:10]


v1.5 — February 20, 2013

  • Added VideoChat API
  • QBChat: replaced method – (void)chatRoomDidEnter:(NSString *)room with – (void)chatRoomDidEnter:(QBChatRoom *)room
  • QBChatDelegate: Now you dont need to use – (void)chatRoomDidCreate:(QBChatRoom*)room. In all cases (create or join room) chatRoomDidEnter method will be called
  • QBChat: Added new method for room creation: – (void)createOrJoinRoomWithName:(NSString *)name membersOnly:(BOOL)isMembersOnly persistent:(BOOL)isPersistent. Old methods marked as deprecated.


v1.4.1 — January 9, 2013

  • Added notification when social login dialog was closed – QuickbloxSocialDialogDidCloseNotification
  • QBChatDelegate now is retained
  • Added [QBSettings useProductionEnvironmentForPushNotifications:YES] to manage Push Notifications environment


v1.4 — December 11, 2012

  • CustomObjects: added method 'objectWithClassName:ID:' to QBCustomObjects class – allows to retrieve single object
  • CustomObjects: added Array type
  • CustomObjects: added special update operators
  • CustomObjects: added relations API
  • Social API: added 'scope' param: replaced QBUsers’s method 'logInWithSocialProvider:delegate:' with 'logInWithSocialProvider:scope:delegate:'
  • Social API: now you can auth using Social provider access token
  • Chat: added method to QBChatDelegate 'chatRoomDidChangeOnlineUsers:room:'
  • Chat: added method to QBChat 'requestRoomUsers' – allows to retrieve room members
  • Users: added to QBUsers method 'usersWithIDs' – allows to retrieve users by ids
  • Users: QBUUser.tags – property type changed from NSArray to NSMutableArray
  • Messages: added methods to send push notification without environment
  • Messages: added method to class QBMessages 'TSendPushWithText' – simple way to send push – just write text & send
  • Auth: Create session with device parameters is deprecated. Now you don’t need to create session with device parameters in order to use Push Notifications


v1.3.1 — October 26, 2012

  • Now delegate is retained
  • Allow to pass any object (not only NSString) to custom object’s fields
  • New great design for the Facebook login dialog
  • Added a new method ‘createPrivateRoomWithName:(NSString *)name’ to QBChat class. It allows to create only members rooms.


v1.3.0 — October 2, 2012

  • New Chat JID format (without user's login) (http://quickblox.com/developers/Chat)
  • NSCopying, NSCoding protocols for all models are implemented
  • isEqual method for all models is implemented
  • Added a convenient constructor to class Request and all inherited classes ([Request request])
  • Added a method to Messages API for stop receive Push Notifications - [QBMessages TUnregisterSubscriptionWithDelegate:self];
  • Added a method to Messages API for sending Push Notifications to users with tags - [QBMessages TSendPush:message toUsersWithAnyOfTheseTags:@"man, car" isDevelopmentEnvironment:YES delegate:self];
  • Added a property 'enableSessionExpirationAutoHandler' to QBSettings class for enable auto handling session expiration
  • C2DM enum was renamed to GCM
  • QBMPushEvent class was renamed to QBMApplePushEvent
  • Chat API was refactored
  • SBJSON was hidden
  • Updated Content Tags API
  • iOS 6 compatibility


v1.2.0 — August 27, 2012

  • Added Custom Objects API
  • Added Content tags API
  • Social API now returns social provider's access token & token's expiration date. No you can work with FB/Twitter API without fb/twitter sdk!


v1.1.0 — August 09, 2012

  • Added Social API. Now you can authenticate through QuickBlox Users module using your Facebook/Twitter account.
  • Added 'lastRequestAt' field to QBUUser
  • Added 'blob' field to QBCFileDownloadTaskResult
  • Added Chat module snippets


v1.0.0 — July 24, 2012

  • SDK stable version
  • All API calls are covered