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];