Этот проект был запланирован к прекращению поддержки, дальнейшее обслуживание не будет осуществляться. Мы представили Chat Demo на основе Swift SDK.
Chat Demo расположен в проекте swift-sdk-demo.
Если у вас возникли вопросы, пожалуйста, свяжитесь с нами по адресу support@leancloud.rocks.
 
[](https://github.com/turbo/git-brag)
Если у вас возникли вопросы, вы можете создать issue, также приветствуем pull requests.
ChatKit — это бесплатный и открытый UI-компонент для чата, который включает облачный сервер, поддержку уведомлений, функцию перемещения сообщений и их постоянное хранение. Нижележащие службы чата основаны на сервисе IM-коммуникации LeanCloud, который использует протокол Protobuf для передачи сообщений. ChatKit помогает разработчикам быстро интегрировать IM-сервисы, легко реализовывать функции чата, предоставляя полностью свободную лицензию и поддержку вторичной разработки. Главное преимущество заключается в предоставлении разработчикам набора часто используемых функций чата вместе с UI. ChatKit отвечает только за демонстрацию основных логических элементов чата, поэтому не поддерживает кастомизацию сообщений (например,红包、名片等) и не поддерживает кастомизацию интерфейса.
git clone --depth=1 https://github.com/leancloud/ChatKit-OC
На основе множества сценариев использования можно сказать, что страницы "Список последних контактов" и "Страница чата" являются наиболее часто используемыми и сложными для реализации.
Основные трудности реализации страницы "Список последних контактов" заключаются в следующем:- Необходимость сортировки списка контактов на основе последних открытых чатов;
Отображение последнего сообщения и времени для каждого последнего контакта или группы;
Временная поддержка счетчика непрочитанных сообщений;Основные трудности реализации страницы "Страница чата" включают:
Разнообразие типов сообщений требует значительных разработок для обеспечения хорошего пользовательского опыта, включая асинхронную обработку;
Запись и отправка аудио и видео сообщений требует знания системы и API LeanCloud Real-time Communication;
Получение и загрузка последнего сообщения в текущем диалоге требует знания API LeanCloud Real-time Communication;
Сообщение с геопозицией | Сообщение с возможностью повторной отправки при неудачной отправке | Отправка изображения с индикатором прогресса |
---|---|---|
![]() |
![]() |
![]() |
Поддержка мультиплейера для изображений, поддержка различных вариантов размещения | Поддержка текста с изображениями | Поддержка двойного клика для полного экрана |
---|---|---|
![]() |
![]() |
![]() |
├── ChatKit # Основная библиотека
│ ├── LCChatKit.h # Это входная точка всего модуля, центр управления, аналогичный "Mediator" в "компонентной схеме".
│ ├── LCChatKit.m
│ └── Class
│ ├── Model
│ ├── Module
│ │ ├── Base
│ │ ├── Conversation
│ │ │ ├── Controller
│ │ │ ├── Model
│ │ │ ├── Tool
│ │ │ └── View
│ │ └── ConversationList
│ │ ├── Controller
│ │ ├── Model
│ │ └── View
│ ├── Resources # Ресурсы, такие как изображения, аудио и т.д.
│ ├── Tool
│ │ ├── Service
│ │ └── Vendor
│ └── View
└── ChatKit-OC # Пример использования
├── ChatKit-OC.xcodeproj
└── Example
└── LCChatKitExample.h # Это входной класс для примера использования, в котором представлены многие связующие функции, необходимые для базовой интеграции.
└── LCChatKitExample.m
├── Model
├── Module
│ ├── ContactList
│ │ ├── Controller
│ │ ├── Tool
│ │ └── View
│ ├── Login
│ │ ├── Controller
│ │ ├── Model
│ │ └── View
│ ├── Main
│ │ ├── Controller
│ │ └── View
│ └── Other
Из приведённого выше можно сделать вывод, что проектный пакет ChatKit-OC
разделён на две части:* ChatKit
— это основная библиотека.
ChatKit-OC
— демонстрационная часть, в которой класс LCChatKitExample
предоставляет множество связующих функций для начальной интеграции.ChatKit поддерживает следующие способы добавления в ваш проект:
Здесь рекомендуется использовать CocoaPods для управления зависимостями.
CocoaPods — это один из самых популярных инструментов для управления зависимостями в проектах Cocoa. Учитывая удобство и поддерживаемую поддержку проекта, мы рекомендуем использовать CocoaPods для добавления и управления SDK.
Если у вас уже установлен CocoaPods, вы можете перейти к следующему шагу.
Если ваша сеть уже имеет доступ к интернету, вы можете выполнить следующую команду в терминале для установки:
sudo gem install cocoapods
Если ваша сеть не имеет доступа к интернету, вы можете использовать зеркало RubyGems от Taobao для установки.
Выполните следующие команды в терминале:
gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/
sudo gem install cocoapods
Выполните следующую команду в терминале: ```shell pod search ChatKit
Обратите внимание, что эта команда ищет последнюю версию на вашем компьютере, а не в интернете. Если команда не находит последнюю версию, вы можете обновить список источников CocoaPods, выполнив следующую команду:
```shell
pod repo update
Откройте терминал, перейдите в директорию вашего проекта и выполните следующую команду, чтобы автоматически создать файл Podfile.
pod init
Затем используйте CocoaPods для установки. Если CocoaPods ещё не установлен, выполните следующую команду для установки:
gem install cocoapods
Откройте файл Podfile и добавьте следующий код в вашем проекте (в данном примере используется версия 0.8.5).
В файле Podfile
добавьте следующий код:
pod 'ChatKit', '0.8.5'
Затем выполните следующую команду в терминале:
pod install
Или этот вариант:
# Отключает обновление репозитория CocoaPods, чтобы избежать зависания на этапе анализа зависимостей
pod update --verbose --no-repo-update
Если появляется сообщение о том, что библиотека не найдена, можно удалить --no-repo-update
.
После завершения CocoaPods создаст файл .xcworkspace
в корневом каталоге вашего проекта. Вам нужно будет использовать этот файл для открытия вашего проекта, а не предыдущий .xcodeproj
.
Затем в нужных местах импортируйте ChatKit: ```Objective-C #import <ChatKit/LCChatKit.h>
**Использование CocoaPods**
**Указание версии SDK**
В CocoaPods есть несколько способов указания версии SDK. Например:
`>= 0.8.5` импортирует SDK версии OnClickListener 0.8.5 или выше, в зависимости от списка источников CocoaPods на вашем устройстве.
`~> 0.8.5` импортирует SDK версии 0.7.X до 0.8.5, в зависимости от списка источников CocoaPods на вашем устройстве.
Мы рекомендуем указывать конкретную версию для удобства работы команды. Например, указать версию 0.8.5.
```shell
pod 'ChatKit', '0.8.5'
CocoaPods имеет центральный источник, который по умолчанию кэширует все версии SDK на сервере источников CocoaPods.
Если при поиске не удалось найти или получить последнюю версию, выполните следующую команду для обновления кэша.
pod repo update
После обновления версии Pod в файле Podfile вашего проекта, выполните следующую команду в терминале.
pod update
В некоторых случаях из-за проблем с сетью или других причин файлы, загруженные через CocoaPods, могут быть повреждены.
В этом случае вы можете удалить кэш CocoaPods (каталог ~/Library/Caches/CocoaPods/Pods/Release), и затем заново импортировать.
Вы можете увидеть используемую версию SDK в файле Podfile.lock.
#import <ChatKit/LCChatKit.h>
Использование CocoaPods
Указание версии SDK
В CocoaPods есть несколько способов указания версии SDK. Например:
>= 0.8.5
импортирует SDK версии 0.8.5 или выше, в зависимости от списка источников CocoaPods на вашем устройстве.
~> 0.8.5
импортирует SDK версии 0.7.X до 0.8.5, в зависимости от списка источников CocoaPods на вашем устройстве.
Мы рекомендуем указывать конкретную версию для удобства работы команды. Например, указать версию 0.8.5.
pod 'ChatKit', '0.8.5'
CocoaPods имеет центральный источник, который по умолчанию кэширует все версии SDK на сервере источников CocoaPods.
Если при поиске не удалось найти или получить последнюю версию, выполните следующую команду для обновления кэша.
pod repo update
После обновления версии Pod в файле Podfile вашего проекта, выполните следующую команду в терминале.
pod update
В некоторых случаях из-за проблем с сетью или других причин файлы, загруженные через CocoaPods, могут быть повреждены.
В этом случае вы можете удалить кэш CocoaPods (каталог ~/Library/Caches/CocoaPods/Pods/Release), и затем заново импортировать.
Вы можете увидеть используемую версию SDK в файле Podfile.lock. Для получения дополнительной информации о CocoaPods обратитесь к документации CocoaPods.
-[AppDelegate application:didFinishLaunchingWithOptions:]
вызовите -[LCChatKit setAppId:appKey:]
, чтобы запустить сервис LeanCloud. Необходимо получить AppId и AppKey на LeanCloud. Вы можете создать приложение в консоли управления и заменить AppId и AppKey в демо-приложении. Пример кода приведен ниже:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
. . .
// Если приложение используется за пределами Китая, активируйте североамериканский узел.
// Этот вызов должен быть сделан до инициализации AppId, иначе будет использоваться китайский узел.
// [AVOSCloud setServiceRegion:AVServiceRegionUS];
[LCChatKit setAppId:LCCKAPPID appKey:LCCKAPPKEY];
// Включить уведомления о непрочитанных сообщениях
[AVIMClient setUnreadNotificationEnabled:YES];
}
// Добавьте плагины для нижней части поля ввода, если требуется изменить иконки или заголовки, создайте подкласс, а затем вызовите `+registerSubclass`
[LCCKInputViewPluginTakePhoto registerSubclass];
[LCCKInputViewPluginPickImage registerSubclass];
[LCCKInputViewPluginLocation registerSubclass];
. . .
}
-[LCChatKit sharedInstance]
для инициализации объекта-одиночки. Чтобы сделать эту библиотеку более доступной и избежать введения слишком большого количества открытых классов и концепций, мы использовали паттерн "фасад" (Facade Pattern), который объединяет все методы, которые вам могут понадобиться при использовании библиотеки ChatKit, в одном классе LCChatKit
.Этот класс является посредником и входной точкой для всего библиотеки. Если не указано иное, когда мы говорим о "вызове API", вызывающая сторона является -[LCChatKit sharedInstance]
. Схема представлена ниже:```3. Реализуйте -[[LCChatKit sharedInstance] setFetchProfilesBlock:]
, чтобы настроить систему пользователей. Внутри этого блока нужно реализовать логику получения объекта `User` по `userId`. ChatKit будет использовать эту логику при необходимости получения информации о пользователе. Для более подробных настроек обратитесь к документации: «Настройка пользовательских данных в ChatKit».
````LCCKUserSystemService.h` файл содержит примеры, демонстрирующие интеграцию с нативной системой пользователей `AVUser` от LeanCloud:[[LCChatKit sharedInstance] setFetchProfilesBlock:^(NSArray<NSString *> *userIds,
LCCKFetchProfilesCompletionHandler completionHandler) {
if (userIds.count == 0) {
NSInteger code = 0;
NSString *errorReasonText = @"User ids is nil";
NSDictionary *errorInfo = @{
@"code":@(code),
NSLocalizedDescriptionKey : errorReasonText,
};
NSError *error = [NSError errorWithDomain:NSStringFromClass([self class])
code:code
userInfo:errorInfo];
!completionHandler ?: completionHandler(nil, error);
return;
}
NSMutableArray *users = [NSMutableArray arrayWithCapacity:userIds.count];
[userIds enumerateObjectsUsingBlock:^(NSString *clientId, NSUInteger idx,
BOOL *stop) {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"peerId like %@", clientId];
// LCCKContactProfiles и LCCKProfileKeyPeerId — это предварительно определенные макросы
NSArray *searchedUsers = [LCCKContactProfiles filteredArrayUsingPredicate:predicate];
if (searchedUsers.count > 0) {
NSDictionary *user = searchedUsers[0];
NSURL *avatarURL = [NSURL URLWithString:user[LCCKProfileKeyAvatarURL]];
LCCKUser *user_ = [LCCKUser userWithUserId:user[LCCKProfileKeyPeerId]
name:user[LCCKProfileKeyName]
avatarURL:avatarURL
clientId:clientId];
[users addObject:user_];
} else {
LCCKUser *user_ = [LCCKUser userWithClientId:clientId];
[users addObject:user_];
}
}];
!completionHandler ?: completionHandler([users copy], nil);
}];
```### Автоматическое добавление подписиЕсли вы реализуете метод `-[[LCChatKit sharedInstance] setGenerateSignatureBlock:]`, то ChatKit автоматически добавит подпись для следующих действий: `open` (открытие чата), `start` (начало диалога), `kick` (выгоняет пользователя), `invite` (приглашает пользователя). В противном случае, подпись не будет добавлена.
### Открытие IM-сервиса
Вызов метода `-[[LCChatKit sharedInstance] openWithClientId:callback:]` для открытия IM-сервиса LeanCloud LeanMessage и начала чата. Убедитесь, что вы реализовали метод `-[[LCChatKit sharedInstance] setFetchProfilesBlock:]` до вызова `open`, иначе ChatKit выбросит исключение.
### Закрытие IM-сервиса
Вызов метода `-[[LCChatKit sharedInstance] closeWithCallback:]` для закрытия IM-сервиса LeanCloud и завершения чата.
### Страница списка диалогов
Основные социальные чат-приложения, такие как WeChat и QQ, используют страницу недавних диалогов как главную страницу после входа. Поэтому в ChatKit также предоставляется страница списка диалогов `LCIMConversationListController`. Метод инициализации очень прост:
```Objective-C
LCCKConversationListViewController *firstViewController = [[LCCKConversationListViewController alloc] init];
Так как все данные недавних диалогов хранятся внутри ChatKit, дополнительные данные передавать не нужно. Страница данных недавних диалогов зависит от локальной базы данных, которая автоматически обновляется в процессе чата, поэтому вам не нужно выполнять сложные операции с базой данных.### Страница чата
Страница чата может быть инициализирована двумя способами:
// Для личного чата, по умолчанию создается уникальный диалог, содержащий двух участников (если такой диалог уже существует, то он будет использован, а не создан заново)
LCCKConversationViewController *conversationViewController = [[LCCKConversationViewController alloc] initWithPeerId:peerId];
// Для личного или группового чата, используется при наличии базовой информации о диалоге.
LCCKConversationViewController *conversationViewController = [[LCCKConversationViewController alloc] initWithConversationId:conversationId];
Обратите внимание, инициализация происходит через peerId
. Внутри реализации, если нет уникального диалога, который точно содержит этих двух участников, будет создан уникальный диалог, поэтому вызов этого метода может привести к автоматическому добавлению записи в таблицу _Conversation. Аналогично, при инициализации группы через conversationId
, если текущий пользователь не является участником диалога, он будет добавлен в диалог, а затем будет запущена группа.
[[LCChatKit sharedInstance] setDidSelectConversationsListCellBlock:^(NSIndexPath *indexPath, AVIMConversation *conversation, LCCKConversationListViewController *controller) {
NSLog(@"conversation selected");
LCCKConversationViewController *conversationVC = [[LCCKConversationViewController alloc] initWithConversationId:conversation.conversationId];
[controller.navigationController pushViewController:conversationVC animated:YES];
}];
Для страницы со списком контактов можно использовать [LCChatKit sharedInstance]
для вызова следующих четырёх методов:
/*!
* Коллбэк после выбора определённого чата (обычно требуется)
* @param conversation выбранный чат
*/
typedef void(^LCCKConversationsListDidSelectItemBlock)(NSIndexPath *indexPath, AVIMConversation *conversation, LCCKConversationListViewController *controller);
/*!
* Установка коллбэка после выбора определённого чата
*/
- (void)setDidSelectConversationsListCellBlock:(LCCKConversationsListDidSelectItemBlock)didSelectItemBlock;
``````markdown
/*!
* Коллбэк после удаления определенного чата (обычно не требуется)
* @param conversation удаленный чат
*/
typedef void(^LCCKConversationsListDidDeleteItemBlock)(NSIndexPath *indexPath, AVIMConversation *conversation, LCCKConversationListViewController *controller);
/*!
* Установка коллбэка после удаления определенного чата
*/
- (void)setDidDeleteConversationsListCellBlock:(LCCKConversationsListDidDeleteItemBlock)didDeleteItemBlock;
/*!
* Настройка блока для левого свайпа в диалоге (на странице с недавними контактами, где есть сложные жесты, можно расширить функциональность через этот блок)
* @return Массив меню, который нужно отобразить
* @param conversation, диалог
* @param editActions, массив по умолчанию, элементы которого типа UITableViewRowAction
*/
typedef NSArray *(^LCCKConversationEditActionsBlock)(NSIndexPath *indexPath, NSArray<UITableViewRowAction *> *editActions, AVIMConversation *conversation, LCCKConversationListViewController *controller);
/*!
* С помощью этого блока можно настроить левое меню для каждого диалога в списке диалогов. Это синхронный вызов, поэтому необходимо быстро вернуться, иначе UI будет заблокирован.
*/
- (void)setConversationEditActionBlock:(LCCKConversationEditActionsBlock)conversationEditActionBlock;
```
```### Обработка нескольких типов действий в интерфейсе чата
```С помощью ChatKit инициализация и отображение интерфейса чата становятся очень простыми, но для взаимодействия с ним требуются дополнительные настройки.
- Внутренние ошибки при создании диалога
Если при открытии диалога по `peerId` или `conversationId` возникают сетевые проблемы или переданные параметры некорректны, диалог может не создаться. В этом случае можно использовать метод `conversationHandler` класса `LCCKConversationViewController` для обработки ошибок. Пример кода:
```objective-c
[[LCChatKit sharedInstance] setFetchConversationHandler:^(
AVIMConversation *conversation,
LCCKConversationViewController *aConversationController) {
if (!conversation) {
// Отображение сообщения об ошибке
[conversationController alert:@"Не удалось создать/загрузить диалог."];
} else {
// Обработка без ошибок
}
}];
```
Важно отметить, что метод `-setFetchConversationHandler:` не требует повторной настройки для каждого нового объекта `LCCKConversationViewController`. Необходимо настроить его только один раз, и все последующие объекты будут использовать эту настройку.
- Отображение подробной информации о диалогеВ приложениях для чата, таких как QQ или WeChat, в правом верхнем углу интерфейса чата есть кнопка для отображения подробной информации о диалоге. При нажатии на эту кнопку открывается страница с подробной информацией, где можно переименовать диалог, добавить участников, исключить участников, включить или выключить уведомления и т. д. В классе `LCCKConversationViewController` эта функциональность также поддерживается следующими API:```objective-c
typedef void(^LCCKBarButtonItemActionBlock)(void);
typedef NS_ENUM(NSInteger, LCCKBarButtonItemStyle) {
LCCKBarButtonItemStyleSetting = Метод,
LCCKBarButtonItemStyleMore,
LCCKBarButtonItemStyleAdd,
LCCKBarButtonItemStyleAddFriends,
LCCKBarButtonItemStyleShare,
LCCKBarButtonItemStyleSingleProfile,
LCCKBarButtonItemStyleGroupProfile,
};
- (void)configureBarButtonItemStyle:(LCCKBarButtonItemStyle)style action:(LCCKBarButtonItemActionBlock)action;
```
Пример кода:
```objective-c
[self configureBarButtonItemStyle:LCCKBarButtonItemStyleSetting action:^{
// Действия при нажатии на кнопку настроек
}];
```
```objective-c
[aConversationController configureBarButtonItemStyle:LCCKBarButtonItemStyleGroupProfile
action:^(UIBarButtonItem *sender, UIEvent *event) {
ConversationDetailViewController *detailVC = [[ConversationDetailViewController alloc] init]; // Конкретная реализация страницы с деталями диалога
detailVC.conversation = conversation;
[conversationController.navigationController pushViewController:detailVC animated:YES];
}];
```
### Ручная интеграция
Если вы не хотите использовать CocoaPods для интеграции, вы также можете выбрать интеграцию с использованием исходного кода. Шаги следующие:
Первый шаг:
Перетащите папку "core library" ChatKit, упомянутую в [структуре проекта](https://github.com/leancloud/ChatKit-OC#project-structure), в ваш проект.
Второй шаг:
Добавьте зависимости ChatKit от сторонних библиотек и соответствующие версии:
- [AVOSCloud](https://github.com/leancloud/objc-sdk) v3.6.1
- [AVOSCloudIM](https://github.com/leancloud/objc-sdk) v3.6.1
- [MJRefresh](https://github.com/CoderMJLee/MJRefresh) 3.1.9
- [Masonry](https://github.com/SnapKit/Masonry) v1.0.1
- [SDWebImage](https://github.com/rs/SDWebImage) v3.8.0
- [FMDB](https://github.com/ccgus/fmdb) 2.6.2
- [UITableView+FDTemplateLayoutCell](https://github.com/forkingdog/UITableView-FDTemplateLayoutCell) 1.5.betaДля более точной информации обратитесь к [этому](https://github.com/leancloud/ChatKit-OC/blob/master/ChatKit.podspec) файлу.
## Часто задаваемые вопросы
**Должен ли я платить за компоненты ChatKit?**<br/>
ChatKit является полностью открытым и бесплатным для использования разработчиками. Стоимость использования чата указана [здесь](https://leancloud.cn/pricing.html).
**Какие преимущества предоставляет ChatKit?**<br/>
Он снижает затраты на исследование в начале разработки приложения или нового функционала, позволяя сразу использовать готовое решение. ChatKit предоставляет полное решение для чата, начиная от базового уровня и заканчивая пользовательским интерфейсом.
**Как сделать приложение совместимым с iOS7?**<br/>
Поскольку ChatKit использует контроллер UITableViewRowAction из iOS8, для совместимости с iOS7 вам нужно добавить библиотеку в ваше приложение:
```Objective-C
pod "CYLTableViewRowAction", "1.0.0"
```
В демонстрационном приложении используется этот способ для совместимости с iOS7.
Если вы не используете Pod, вы можете скачать [CYLTableViewRowAction](https://github.com/ChenYilong/CYLTableViewRowAction) и перетащить папки из этого архива в ваш проект, что решит проблему совместимости с iOS7.
**Почему я не получаю уведомления?**<br/>
Описание проблемы: сертификаты для уведомлений настроены, тестирование уведомлений в консоли проходит успешно, но уведомления от другого пользователя не приходят.В этом случае, сначала обратитесь к [руководству по разработке уведомлений для iOS](https://leancloud.cn/docs/ios_push_guide.html). Если настройки выполнены правильно, проверьте, правильно ли настроены следующие параметры:
Например, вы можете настроить следующим образом:
```Objective-C
{"alert":"У вас есть новые сообщения","badge":"Increment"}
```

Если вы хотите получить содержимое уведомлений, можно ознакомиться с [статьей «iOS уведомления: как получить уведомления при нажатии на иконку приложения leanCloud»](http://blog.csdn.net/zain_/article/details/50440096)
При возникновении любых вопросов во время использования, вы можете задать их на [официальном форуме](https://forum.leancloud.cn/c/jing-xuan-faq), где вам ответит профессиональный инженер. Среднее время ответа составляет 24 часа.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )