SDK для добавления в iOS-приложения функциональности обмена сообщениями в реальном времени.
- Xcode 6
- iOS 7.0
- ARC
Через СocoaPods.
platform :ios, '7.0'
pod 'ACSDK', :git => "https://github.com/allychat/ios-sdk.git"
Без CocoaPods:
- Добавьте
ACSDK.framework
в ваш проект. - Ваше приложение должно быть собрано со следующими подключаемыми библиотеками:
- libicucore.dylib
В начале советуем ознакомиться с демо-приложением в папке ACSDKDemo, которое содержит примеры использования различных возможностей SDK, таких как прием/отправку сообщений, подписку на Push-уведомления, вызовы методов REST API. Так как демо-проект использует систему управления зависимостями CocoaPods, для просмотра необходимо открывать ACSDKDemo.xcworkspace.
Для работы с SDK необходимо его проинициализировать, передав Application ID и URL сервера.
#import <ACSDK/ACSDK.h>
[[ACSDK defaultInstance] setApplicationId:@"app_id" serverURL:[NSURL URLWithString:@"https://example.com"]];
//Create new User
ACUserModel *user = [ACUserModel userWithAlias:@"ALIAS"];
//Or you can avoid setting the alias
//ACUserModel *user = [ACUserModel anonymousUser];
//Register (or login) to Allychat server
[[ACSDK defaultInstance] signIn:user completion:^(ACUserModel *userModel, NSError *error) {
if (error) {
// handle error
} else {
// userModel contains signed in user data
}
}];
После успешной регистрации (авторизации) станет доступен список комнат.
В SDK также имеется поддержка кроссавторизации:
[[ACSDK defaultInstance] signInWithCode:code completion:^(ACUserModel *userModel, NSError *error) {
if (error.domain == ACSDKErrorDomain && error.code == ACSDKBadCodeError) {
// obtain new auth code and try again, or just ignore
}
}];
Если авторизацонный код не пустой, то он будет использован для получения новых токенов, иначе SDK будет использовать токены с предыдущей oauth авторизации. При необходимости обновить токены будет отправлено уведомление ACSDKOauthTokensExpiredNotification
и вызван соответствующий метод делегата.
// current room
ACRoomModel *room = [ACSDK defaultInstance].supportRoom;
// sending text
ACMessageModel *textMessageModel = [ACTextMessageModel messageWithText:@"text" room:room];
[[ACSDK defaultInstance] sendMessage:textMessageModel];
// sending image
UIImage *image = ...;
ACMessageModel *imageMessageModel = [ACImageMessageModel messageWithImage:image room:room];
[[ACSDK defaultInstance] sendMessage:imageMessageModel];
Изменение состояния сообщений при отправке передается с помощью уведомлений ACSDKDidUpdateMessageStatusNotification
и ACSDKDidUpdateUploadProgressNotification
, а также через методы делегата:
- (void)allyChatSDK:(ACSDK *)allyChatSDK didUpdateMessageStatus:(ACMessageModel *)messageModel room:(ACRoomModel *)roomModel;
- (void)allyChatSDK:(ACSDK *)allyChatSDK didUpdateUploadProgress:(ACMessageModel *)messageModel room:(ACRoomModel *)roomModel;
Подготовка к отправке сообщения с изображением может занять некоторое время, поскольку объект с изображением необходимо сохранить на диск в формате, пригодном для передачи по сети. После завершения сохранения в поле imageURL
содержится путь до изображения на локальном диске, которое доступно пока происходит загрузка файла на сервер.
Завершение подготовки передается с помощью уведомления ACSDKDidPrepareMessageNotification
, а также через метод делегата:
- (void)allyChatSDK:(ACSDK *)allyChatSDK didPrepareMessage:(ACMessageModel *)messageModel room:(ACRoomModel *)roomModel;
Новые сообщения доставляются в реальном времени через центр уведомлений (ACSDKDidReceiveMessageNotification
) и через метод делегата:
- (void)allyChatSDK:(ACSDK *)allyChatSDK didReceiveMessage:(ACMessageModel *)messageModel room:(ACRoomModel *)roomModel;
Для получения истории сообщений используются методы SDK:
ACMessageModel *messageModelOrNil = ...;
[[ACSDK defaultInstance] messagesAfterMessage:messageModelOrNil room:room limit:limit completion:^(NSArray *messages, BOOL hasMore, NSError *error) {
...
}];
[[ACSDK defaultInstance] messagesBeforeMessage:messageModelOrNil room:room limit:limit completion:^(NSArray *messages, BOOL hasMore, NSError *error) {
...
}];
В случае передачи nil
в качестве параметра messageModel
, в качестве точки отсчета используется сообщение, следующее за последним. То есть messagesBeforeMessage:nil room:room limit:limit completion:completion
вернет limit
самых последних сообщений в комнате, а messagesAfterMessage:nil room:room limit:limit completion:completion
вернет пустой список.
По умолчанию всем полученным сообщениям устанавливается статус 'Прочитано'. Для самостоятельной установки данного статуса необходимо убрать соответствующий флаг и использовать метод SDK
// init
[[ACSDK defaultInstance] setApplicationId:@"app_id" serverURL:[NSURL URLWithString:@"https://example.com"]];
[ACSDK defaultInstance].setReadForAllDeliveredMessages = NO;
// send read status
[[ACSDK defaultInstance] setReadForMessage:messageModel];
ACUserModel *anotherUser = [ACUserModel userWithAlias:@"alias"];
[[ACSDK defaultInstance] createRoomWithUser:anotherUser completion:^(ACRoomModel *roomModel, NSError *error) {
...
}];
При появлении новой комнаты или изменении существующей происходит отправка уведомления ACSDKDidUpdateRoomsNotification
, а также вызов метода делегата
- (void)allyChatSDK:(ACSDK *)allyChatSDK didUpdateRooms:(NSArray *)rooms;
NSData *deviceToken = ...;
[[ACSDK defaultInstance] subscribeToAPNs:deviceToken];
[[ACSDK defaultInstance] unsubscribeFromAPNs];
CLLocation *location = ...;
[[ACSDK defaultInstance] sendLocation:location];