• Stars
    star
    102
  • Rank 335,584 (Top 7 %)
  • Language
    Objective-C
  • License
    MIT License
  • Created over 9 years ago
  • Updated about 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

JChat iOS app, a real app based on JMessage SDK.

JChat iOS

JChat-iOS 现在只处理 bug,不再添加新功能,新功能将会在 jchat-swift 上更新。

介绍

JChat 是一个聊天 App。

JChat 具有完备的即时通讯功能。主要有:

  • 基本的聊天类型:文本、语音、图片;
  • 单聊与群聊;
  • 用户属性,包括头像;
  • 黑名单;
  • 好友通讯录;
  • 消息同步功能

JChat 的功能基于 JMessage SDK 来开发。它是一个 JMessage SDK 的完备的 Demo,但不仅仅是 Demo。我们的预期与目标是,当你的业务需要一个企业级的聊天 App 时,可以基于这里提供的源代码,更换 Logo 与应用名称,就可以直接用上。

JChat 当前提供 Android 与 iOS 版本。稍后也将提供 Web 版本。

运行

本源代码项目要编译运行跑起来,需要注意以下几个地方。

  • 工程使用 cocoapods 管理依赖如果没有安装 pod 需要先行安装 👉 CocoaPods
  • 成功安装 cocoapods 后在终端执行如下命令安装依赖(在 Podfile 文件所在目录)
pod install
打开项目文件 JChat.xcworkspace
  • 因为这是一个 CocoaPods 项目。打开 .xcodeproj 项目目录将缺少依赖。
配置运行的基本属性
  • appKey:JPush appKey 是 JMessage SDK 运行的基本参数。请到 JPush 官方网站登录控制台创建应用获取。
  • bundle_id:这是一个 iOS 应用的基本属性。你需要登录到 Apple 开发者网站去创建应用。

JMessage 文档

JMessage 升级

JMessage 当前版本为 2.0.x。与之前 1.0.x 版本有比较大的变更。

因为变更太大,所以这次变更有点不够友好,大部分 API 有调整,包括对象结构。这会导致集成 JMessage SDK 1.0.x 版本的 App 切换到新版本时,会编译不通过,某些 API 调用需要调整。调整的具体思路,可参考本项目 JChat iOS 源代码,以及 JMessage iOS 相关文档。

JChat 介绍

JChat 工程结构

如图

JChat 代码结构

主要分为五个功能模块:用户详情 (UserInfo),会话列表 (Conversation List),会话 (Conversation) 登录 (Login) 和 设置 (Setting)。每个功能模块按照 MVC 模式划分,部分模块还有一些 Util 类。

CustomUI 自定义 View

Category 通用 Category

Util 通用辅助类

主要功能索引

JMessage 初始化代码

建议在 AppDelegate didFinishLaunchingWithOptions 方式初始化,如JChat 所示

- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  [self initLogger];

  // init third-party SDK
  [JMessage addDelegate:self withConversation:nil];// 这句代码放到前面目的是,应用启动是会做数据库是否升级盘点,如果需要升级,则锁定数据库,进行升级
  
  [JMessage setupJMessage:launchOptions
                   appKey:JMSSAGE_APPKEY
                  channel:CHANNEL apsForProduction:NO
                 category:nil];
  
  [JPUSHService registerForRemoteNotificationTypes:(UIUserNotificationTypeBadge |
                                                    UIUserNotificationTypeSound |
                                                    UIUserNotificationTypeAlert)
                                        categories:nil];
  
  [self registerJPushStatusNotification];
  
  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  self.window.rootViewController = [UIViewController new];
  [self.window makeKeyAndVisible];
  [self setupMainTabBar];
  [self setupRootView];
  
  [JCHATFileManager initWithFilePath];//demo 初始化存储路径
  
  return YES;
}

注册SDK 注册APNS 成功获得APNS token 传入JPUSHService 如下代码所示

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  [JPUSHService registerDeviceToken:deviceToken];
}

注册 登录

首次使用JMessage 需要有JMessage 账户,通过如下代码注册一个新用户。JChat 项目在JCHATRegisterViewController 类中执行了注册操作,并且在注册完成回调执行登录操作(登录操作也可以移动到其它地方进行,具体看程序业务)。

- (IBAction)registerBtnClick:(id)sender {
  DDLogDebug(@"Action - registerBtnClick");
  if ([self.usernameTextField.text isEqualToString:@""]) {
    [MBProgressHUD showMessage:@"用户名不能为空" view:self.view];
    return;
  }
  
  if ([self.passwordTextField.text isEqualToString:@""]) {
    [MBProgressHUD showMessage:@"密码不能为空" view:self.view];
    return;
  }
  
  [self.usernameTextField resignFirstResponder];
  [self.passwordTextField resignFirstResponder];
  
  NSString *username = self.usernameTextField.text.stringByTrimingWhitespace;
  NSString *password = self.passwordTextField.text.stringByTrimingWhitespace;
  
  if ([self checkValidUsername:username AndPassword:password]) {
    [MBProgressHUD showMessage:@"正在注册" view:self.view];
    [[JCHATTimeOutManager ins] startTimerWithVC:self];
    [JMSGUser registerWithUsername:username
                          password:password
                 completionHandler:^(id resultObject, NSError *error) {
                   [[JCHATTimeOutManager ins] stopTimer];
                   if (error == nil) {
                     [MBProgressHUD hideHUDForView:self.view animated:YES];
                     [MBProgressHUD showMessage:@"注册成功" view:self.view];
                     [[JCHATTimeOutManager ins] startTimerWithVC:self];
                     [JMSGUser loginWithUsername:username
                                        password:password
                               completionHandler:^(id resultObject, NSError *error) {
                                 [[JCHATTimeOutManager ins] stopTimer];
                                 if (error == nil) {
                                   [[NSUserDefaults standardUserDefaults] setObject:username forKey:kuserName];
                                   [[NSUserDefaults standardUserDefaults] setObject:username forKey:klastLoginUserName];
                                   
                                   [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
                                   JCHATSetDetailViewController *detailVC = [[JCHATSetDetailViewController alloc] init];
                                   [self.navigationController pushViewController:detailVC animated:YES];
                                   [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
                                 } else {
                                   DDLogDebug(@"login fail error  %@",error);
                                   NSString *alert = [JCHATStringUtils errorAlert:error];
                                   alert = [JCHATStringUtils errorAlert:error];
                                   [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
                                   [MBProgressHUD showMessage:alert view:self.view];
                                   DDLogError(alert);
                                 }
                               }];
                   } else {
                     NSString *alert = @"注册失败";
                     alert = [JCHATStringUtils errorAlert:error];
                     [MBProgressHUD hideHUDForView:self.view animated:YES];
                     [MBProgressHUD showMessage:alert view:self.view];
                   }
                 }];
  }
}

注册完成会回调 handler ,如下代码。如果出现错误会返回的error 部位nil,注意resultOvject 不同接口会返回不同类型的值或者nil,详细信息可以关注 JMessage 官方文档

typedef void (^JMSGCompletionHandler)(id resultObject, NSError *error);

会话 (Conversation)

会话是一个用户与用户之间聊天的载体,要有会话用户之间才能收发消息 获得会话有两种方式 1. 创建会话 2. 获取历史会话

1.创建会话

如下代码分别创建了 单聊会话,和群聊会话, JChat 在JCHATConversationListViewController类 实现创建会话操作


- (void)skipToSingleChatView :(NSNotification *)notification {
  JMSGUser *user = [[notification object] copy];
  __block JCHATConversationViewController *sendMessageCtl =[[JCHATConversationViewController alloc] init];
  __weak typeof(self)weakSelf = self;
  sendMessageCtl.superViewController = self;
  [JMSGConversation createSingleConversationWithUsername:user.username completionHandler:^(id resultObject, NSError *error) {
    __strong __typeof(weakSelf)strongSelf = weakSelf;
    if (error == nil) {
      sendMessageCtl.conversation = resultObject;
      JPIMMAINTHEAD(^{
        sendMessageCtl.hidesBottomBarWhenPushed = YES;
        [strongSelf.navigationController pushViewController:sendMessageCtl animated:YES];
      });
    } else {
      DDLogDebug(@"createSingleConversationWithUsername");
    }
  }];
}

2. 获取历史会话

JCHat在JCHATConversationListViewController类中获取所有历史会话的具体代码如下

- (void)getConversationList {
  [self.addBgView setHidden:YES];
  [JMSGConversation allConversations:^(id resultObject, NSError *error) {
    NSLog(@"the result");
    JPIMMAINTHEAD(^{
      if (error == nil) {
        _conversationArr = [self sortConversation:resultObject];
        _unreadCount = 0;
        for (NSInteger i=0; i < [_conversationArr count]; i++) {
          JMSGConversation *conversation = [_conversationArr objectAtIndex:i];
          _unreadCount = _unreadCount + [conversation.unreadCount integerValue];
        }
        [self saveBadge:_unreadCount];
      } else {
        _conversationArr = nil;
      }
      [self.chatTableView reloadData];
    });
  }];
}

3. 添加代理

若想监听conversation 的消息需要把某个对象设为conversation的delegate(可以是任何对象),比如JChat JCHATConversationViewController类需要监听发送回调,受消息回调则必须先设置代理,具体代码如下

- (void)addDelegate {
  [JMessage addDelegate:self withConversation:self.conversation];
}

4. 发送消息

JMSGMessage 是消息的实体。需要自己创建要发送的消息,JChat JCHATConversationViewController类中发送消息的代码如下

  - (void)prepareTextMessage:(NSString *)text {
  DDLogDebug(@"Action - prepareTextMessage");
  if ([text isEqualToString:@""] || text == nil) {
    return;
  }
  [[JCHATSendMsgManager ins] updateConversation:_conversation withDraft:@""];
  JMSGMessage *message = nil;
  JMSGTextContent *textContent = [[JMSGTextContent alloc] initWithText:text];
  JCHATChatModel *model = [[JCHATChatModel alloc] init];
  
  message = [_conversation createMessageWithContent:textContent];
  [_conversation sendMessage:message];// 发送该条消息
  [self addmessageShowTimeData:message.timestamp];
  [model setChatModelWith:message conversationType:_conversation];
  [self addMessage:model];
}

5. 接收消息

前面已经说了可以给conversation 添加回调delegate,收到消息也是通过回调函数来获取的,JChat JCHATConversationViewController类 收到消息回调方法如下

- (void)onReceiveMessage:(JMSGMessage *)message
                   error:(NSError *)error {
  if (error != nil) {
    JCHATChatModel *model = [[JCHATChatModel alloc] init];
    [model setErrorMessageChatModelWithError:error];
    [self addMessage:model];
    return;
  }
  
  if (![self.conversation isMessageForThisConversation:message]) {
    return;
  }
  
  if (message.contentType == kJMSGContentTypeCustom) {
    return;
  }
  DDLogDebug(@"Event - receiveMessageNotification");
  JPIMMAINTHEAD((^{
    if (!message) {
      DDLogWarn(@"get the nil message .");
      return;
    }
    
    if (_allMessageDic[message.msgId] != nil) {
      DDLogDebug(@"该条消息已加载");
      return;
    }
    
    if (message.contentType == kJMSGContentTypeEventNotification) {
      if (((JMSGEventContent *)message.content).eventType == kJMSGEventNotificationRemoveGroupMembers
          && ![((JMSGGroup *)_conversation.target) isMyselfGroupMember]) {
        [self setupNavigation];
      }
    }
    
    if (_conversation.conversationType == kJMSGConversationTypeSingle) {
    } else if (![((JMSGGroup *)_conversation.target).gid isEqualToString:((JMSGGroup *)message.target).gid]){
      return;
    }
    
    JCHATChatModel *model = [[JCHATChatModel alloc] init];
    [model setChatModelWith:message conversationType:_conversation];
    if (message.contentType == kJMSGContentTypeImage) {
      [_imgDataArr addObject:model];
    }
    model.photoIndex = [_imgDataArr count] -1;
    [self addmessageShowTimeData:message.timestamp];
    [self addMessage:model];
  }));
}

More Repositories

1

aurora-imui

General IM UI components. Android/iOS/RectNative ready. 通用 IM 聊天 UI 组件,已经同时支持 Android/iOS/RN。
Java
5,710
star
2

jpush-react-native

JPush's officially supported React Native plugin (Android & iOS). 极光推送官方支持的 React Native 插件(Android & iOS)。
Objective-C
1,351
star
3

jpush-phonegap-plugin

JPush's officially supported PhoneGap/Cordova plugin (Android & iOS). 极光推送官方支持的 PhoneGap/Cordova 插件(Android & iOS)。
JavaScript
926
star
4

jpush-flutter-plugin

JPush's officially supported Flutter plugin (Android & iOS). 极光推送官方支持的 Flutter 插件(Android & iOS)。
Objective-C
825
star
5

jpush-api-java-client

JiGuang's officially supported Java client library for accessing JPush APIs. 极光官方支持的 Java 版本服务器端 SDK。
Java
724
star
6

jpush-api-php-client

JPush's officially supported PHP client library for accessing JPush APIs. 极光推送官方支持的 PHP 版本服务器端 SDK。
PHP
524
star
7

jchat-android

JChat android app. A real app based on JMessage SDK.
Java
376
star
8

jchat-swift

Swift version of JChat iOS.
Swift
290
star
9

jpush-api-nodejs-client

JPush's officially supported Node.js client library for accessing JPush APIs. 极光推送官方支持的 Node.js 版本服务器端 SDK。
JavaScript
240
star
10

jpush-api-python-client

JPush's officially supported Python client library for accessing JPush APIs. 极光推送官方支持的 Python 版本服务器端 SDK。
Python
208
star
11

jmessage-react-plugin

Objective-C
184
star
12

jmessage-flutter-plugin

JMessage's Flutter plugin (Android & iOS). 极光推送官方支持的 Flutter 插件(Android & iOS)。
Java
166
star
13

jpush-hbuilder-demo

极光推送官方提供的 HBuilder 示例代码,可用于快速集成 JPush SDK 到 HBuilder 项目里。
JavaScript
144
star
14

jpush-api-csharp-client

JPush's officially supported C# client library for accessing JPush APIs. 极光推送官方支持的 C# 版本服务器端 SDK。
C#
135
star
15

jverify-flutter-plugin

JPush's officially supported Flutter plugin (Android & iOS). 极光推送官方支持的 Flutter 插件(Android & iOS)。
Objective-C
117
star
16

jpush-unity3d-plugin

JPush's officially supported Unity3d plugin (Android & iOS). 极光推送官方支持的 Unity3d 插件(Android & iOS)。
C#
114
star
17

jpush-docs

JPush docs on official website. 极光推送官方文档。
HTML
114
star
18

jmessage-phonegap-plugin

JiGuang's officially supported JMessage PhoneGap/Cordova plugin (Android & iOS). 极光官方支持的 IM PhoneGap/Cordova 插件。
JavaScript
106
star
19

jchat-web

JChat web
TypeScript
105
star
20

jshare-react-native

Objective-C
104
star
21

jpush-api-ruby-client

JPush's officially supported Ruby client library for accessing JPush APIs. 极光推送官方支持的 Ruby 版本服务器端 SDK。
Ruby
99
star
22

jbox

极光宝盒,一个基于 JPush 的轻便易用的通知框架。
Python
74
star
23

aurora-imui-examples

Swift
65
star
24

jmessage-api-java-client

JiGuang's officially supported Java client library for accessing JMessage APIs. 极光官方支持的 Java 版本服务器端 SDK。
Java
60
star
25

jpush-swift-demo

Offically supported Swift Demo for JPush iOS SDK.
Swift
55
star
26

janalytics-react-native

Objective-C
52
star
27

jcore-react-native

Objective-C
49
star
28

jpush-hbuilder-plugin

Vue
48
star
29

jmessage-api-php-client

JMessage's officially supported PHP client library for accessing JMessage APIs. 极光IM官方支持的 PHP 版本服务器端 SDK。
PHP
43
star
30

jmessage-android-uikit

极光IM Android SDK UI 组件
Java
39
star
31

janalytics-flutter-plugin

Dart
38
star
32

jmessage-ios-uikit

极光IM iOS SDK UI 组件
Objective-C
31
star
33

jverification-react-native

Objective-C
30
star
34

jpush-java-library

Java library for JPush API. Moved to - https://github.com/jpush/jpush-api-java-client 本库不再维护,做了迁移。
Java
30
star
35

jpush-ios-sdk-pod

JPush's officially supported iOS SDK Pod for CocosPods. 极光推送官方支持的 iOS SDK Pod.
Objective-C
28
star
36

jsms-api-java-client

JiGuang's officially supported Java client library for accessing JSMS APIs. 极光官方支持的 JSMS Java 版本服务器端 SDK。
Java
27
star
37

jverification-hbuilder-plugin

极光认证官方支持的 hbuilder 插件(Android & iOS)
Objective-C
24
star
38

jshare-flutter-plugin

JShare's officially supported Flutter plugin (Android & iOS). 极光分享官方支持的 Flutter 插件(Android & iOS)。
Dart
24
star
39

cordova-plugin-jcore

Java
20
star
40

jmlink-flutter-plugin

JPush's officially supported Flutter plugin (Android & iOS). 极光推送官方支持的 Flutter 插件(Android & iOS)。
Dart
19
star
41

jiguang-java-client-common

Common lib for JiGuang Java clients.
Java
18
star
42

jpush-cocos2d-x-plugin

JPush's officially supported Cocos2d-x plugin (Android & iOS). 极光推送官方支持的 Cocos2d-x 插件(Android & iOS)。
Python
18
star
43

jpush-android-samples

JPush's officially supported Android SDK samples for demo SDK APIs. 极光推送官方支持的 Android SDK 示例,以演示如何使用 SDK APIs。
Java
18
star
44

cordova-plugin-janalytics

Objective-C
14
star
45

JVerfication-Demo

Objective-C
14
star
46

android-push-example

更丰富地演示基于 JPush Android SDK 可以实现的功能、效果。
Java
14
star
47

jchat-windows

JChat Windows Application
C++
13
star
48

jmessage-api-csharp-client

JMessage's officially supported CSharp client library for accessing JMessage APIs. 极光IM官方支持的 CSharp 版本服务器端 SDK。
C#
13
star
49

jmrtc-react-native

Objective-C
10
star
50

jmessage-api-python-client

JiGuang's officially supported Python client library for accessing JMessage APIs. 极光官方支持的 JMessage Python 版本服务器端 SDK。
Python
9
star
51

jpush-weex-plugin

Java
8
star
52

jsms-api-php-client

JiGuang's officially supported PHP client library for accessing JSMS APIs. 极光官方支持的 JSMS PHP 版本服务器端 SDK。
PHP
8
star
53

cordova-plugin-jsms

JiGuang's officially supported JSMS PhoneGap/Cordova plugin (Android & iOS). 极光官方支持的短信验证码 PhoneGap/Cordova 插件。
Objective-C
8
star
54

JIoT-SDK-C

C
7
star
55

jmlink_demo

jmlink demo
Java
7
star
56

jpush-api-go-client

JPush's officially supported Go-lang client library for accessing JPush APIs. 极光推送官方支持的 Go 语言版本服务器端 SDK。
5
star
57

jpush-opensource

JPush official website for open-source projects.
CSS
5
star
58

JVerification-cordova-plugin

极光认证官方支持的 cordova 插件(Android & iOS)
Objective-C
4
star
59

jmrtc-phonegap-plugin

Objective-C
4
star
60

cordova-plugin-jshare

极光官方支持的社交分享 Cordova 插件。
3
star
61

jsms-react-native

Java
3
star
62

jmessage-ios-pod

JMessage iOS SDK (framework) for CocoaPods
Objective-C
3
star
63

jpush-ios-samples

JPush's officially supported iOS SDK samples for demo SDK APIs. 极光推送官方支持的 iOS SDK 示例,以演示如何使用 SDK APIs。
Objective-C
3
star
64

jsms-api-csharp-client

JiGuang's officially supported C# client library for accessing JSMS APIs. 极光官方支持的 JSMS C# 版本服务器端 SDK。
C#
3
star
65

ios-resources-review

2
star
66

jmlink-react-native

JMlink's officially supported react native plugin (Android & iOS). 极光魔链官方支持的 react native 插件(Android & iOS)。
Objective-C
2
star
67

JIoT-rtthread-package

JIoT SDK rt-thread package
C
2
star
68

jmessage-android-samples

极光IM Android SDK 样例
2
star
69

joperate-flutter-plugin

Dart
2
star
70

JIoT-SDK-Android

极光 IoT 客户端 SDK Android
Java
1
star
71

jmessage-unity3d-plugin

1
star
72

jcore-hbuilder-plugin

Objective-C
1
star
73

janalytics-hbuilder-demo

HTML
1
star
74

jsms-api-python-client

Python
1
star
75

Jpush-Google

1
star