- iOS IM SDK 基础功能
- 概述
- 字符串规范
- SDK 初始化
- 监听代理
- 添加代理
- 移除代理
- 注册
- 登录
- 退出登录
- 通知管理
- 注册远程推送
- 注册DeviceToken
- 设置角标(到服务器)
- 重置角标(到服务器)
- 自定义通知栏展示逻辑
- 登录设备记录
- DeviceInfo
- 多端同时在线
- 概述
iOS IM SDK 基础功能
概述
JMessage iOS IM SDK的基础功能。了解极光 IM 的详细信息,请参考文档:JMessage 产品简介
字符串规范
此处定义JMessage产品里字段属性与规范,用于校验与规范化。
| 参数 | 字符说明 | 长度限制 |
|---|---|---|
| app_key | 由 JPush Web Portal 生成的 24位字符串。字母或者数字,不区分大小写 | |
| username | 以字母或者数字开头。支持字母、数字、下划线、英文点、减号、 @。 | Byte(4~128) |
| password | 不限 | Byte(4~128) |
| group_name | 不支持的字符:“\n” “\r” | Byte(0~64) |
| nickname | 不支持的字符:“\n” “\r” | Byte(0~64) |
| note_name | 不支持的字符:“\n” “\r” | Byte(0~64) |
| other | 其他未明确指定的 String 类型字段,都按照这个处理。 支持字符:全部 | Byte(0~250) |
SDK 初始化
setupJMessage:方法,需要在应用初始化时调用- SDK 初始化时,可设置是否启用消息记录漫游
打开消息漫游之后,用户多个设备之间登录时,SDK会自动将历史消息同步到本地,同步完成之后SDK会触发代理方法onSyncRoamingMessageConversation:通知上层刷新,具体方法见消息同步
/*!* @abstract 初始化 JMessage SDK** @param launchOptions AppDelegate启动函数的参数launchingOption(用于推送服务)* @param appKey appKey(应用Key值,通过jiguang官网可以获取)* @param channel 应用的渠道名称* @param isProduction 是否为生产模式* @param category iOS8新增通知快捷按钮参数* @param isRoaming 是否启用消息漫游,默认关闭** @discussion 此方法必须被调用, 以初始化 JMessage SDK** 如果未调用此方法, 本 SDK 的所有功能将不可用.*/+ (void)setupJMessage:(NSDictionary *)launchOptionsappKey:(NSString *)appKeychannel:(NSString *)channelapsForProduction:(BOOL)isProductioncategory:(NSSet *)categorymessageRoaming:(BOOL)isRoaming;
监听代理
JMessage SDK 采用 Delegate 的机制给 App 发通知,而不是采用 iOS 平台通用的通知方式。
添加代理
可以在 App 的任何类里,调用以下方法来监听事件通知。
[JMessage addDelegate:self withConversation:nil]
为了上述这行有效,则需要在当前类的头文件里声明实现 JMessageDelegate 协议。
以下示例在 AppDelegate 里加监听:
@interface AppDelegate : UIResponder <UIApplicationDelegate,JMessageDelegate>
另外,需要实现你需要监听的事件的方法。比如监听数据库升级:
- (void)onDBMigrateStart {NSLog(@"onDBmigrateStart in appdelegate");_isDBMigrating = YES;}
注意: 由于 JMessage SDK 会在 setup 时检测数据库升级,如果有需要就发出通知。所以建议在 AppDelegate 里调用 setupJMessage 之前就添加监听。
移除代理
为了避免内存损耗和不必要的监听,在上层不需要监听时,可以调用一下接口移除监听:
+(void)removeDelegate: withConversation:
更多监听代理的使用可以查看 事件管理
注册
直接通过 username 和 password 来注册 im 账号
/*!* @abstract 新用户注册** @param username 用户名. 长度 4~128 位.* 支持的字符: 字母,数字,下划线,英文减号,英文点,@邮件符号. 首字母只允许是字母或者数字.* @param password 用户密码. 长度 4~128 位.* @param handler 结果回调. 返回正常时 resultObject 为 nil.*/+ (void)registerWithUsername:(NSString *)usernamepassword:(NSString *)passwordcompletionHandler:(JMSGCompletionHandler JMSG_NULLABLE)handler;
也可以在注册用户时,携带用户其他信息字段一起注册,可携带字段请查看 JMSGUserInfo
/*!* @abstract 新用户注册(支持携带用户信息字段)** @param username 用户名. 长度 4~128 位.* 支持的字符: 字母,数字,下划线,英文减号,英文点,@邮件符号. 首字母只允许是字母或者数字.* @param password 用户密码. 长度 4~128 位.* @param userInfo 用户信息类,注册时携带用户信息字段,除用户头像字段* @param handler 结果回调. 返回正常时 resultObject 为 nil.** @discussion 注意: 注册时不支持上传头像,其他信息全部支持*/+ (void)registerWithUsername:(NSString *)usernamepassword:(NSString *)passworduserInfo:(JMSGUserInfo *JMSG_NULLABLE)userInfocompletionHandler:(JMSGCompletionHandler JMSG_NULLABLE)handler;
登录
/*!* @abstract 用户登录** @param username 登录用户名. 规则与注册接口相同.* @param password 登录密码. 规则与注册接口相同.* @param handler 结果回调** - resultObject 简单封装的user对象* - error 错误信息** 注意:上层不要直接使用 resultObject 对象做操作, 因为 resultOjbect 只是一个简单封装的user对象.*/+ (void)loginWithUsername:(NSString *)usernamepassword:(NSString *)passwordcompletionHandler:(JMSGCompletionHandler JMSG_NULLABLE)handler;
退出登录
如果上层不主动调用 logout 接口,原则上是一直处于登录的。
/*!* @abstract 当前用户退出登录** @param handler 结果回调。正常返回时 resultObject 也是 nil。**/+ (void)logout:(JMSGCompletionHandler JMSG_NULLABLE)handler;
通知管理
注册远程推送
/*!* @abstract 注册远程推送* @param types 通知类型* @param categories 类别组* @discussion 此方法必须被调用,如果有集成JPush或其他远程推送注册方法,请不要再调用此方法**/+ (void)registerForRemoteNotificationTypes:(NSUInteger)typescategories:(NSSet *)categories;
注册DeviceToken
/*!* @abstract 注册DeviceToken* @param deviceToken 从注册推送回调中拿到的DeviceToken* @discussion 此方法必须被调用**/+ (void)registerDeviceToken:(NSData *)deviceToken;
设置角标(到服务器)
/*!* @abstract 设置角标(到服务器)** @param value 新的值. 会覆盖服务器上保存的值(这个用户)** @discussion 本接口不会改变应用本地的角标值.* 本地仍须调用 UIApplication:setApplicationIconBadgeNumber 函数来设置角标.** 该功能解决的问题是, 服务器端推送 APNs 时, 并不知道客户端原来已经存在的角标是多少, 指定一个固定的数字不太合理.** APNS 服务器端角标功能提供:** - 通过本 API 把当前客户端(当前这个用户的) 的实际 badge 设置到服务器端保存起来;* - 调用服务器端 API 发 APNs 时(通常这个调用是批量针对大量用户),* 使用 "+1" 的语义, 来表达需要基于目标用户实际的 badge 值(保存的) +1 来下发通知时带上新的 badge 值;*/+ (BOOL)setBadge:(NSInteger)value;
重置角标(到服务器)
/*!* @abstract 重置角标(为0)** @discussion 相当于 [setBadge:0] 的效果.* 参考 [JMessage setBadge:] 说明来理解其作用.*/+ (void)resetBadge;
自定义通知栏展示逻辑
上层开发者可以对通知栏进行一些定制,如:控制离线消息的存储、自定义通知栏内容等,具体的功能可以想象查看 JMSGOptionalContent 类里面的说明。在 发送消息 - 附带可控参数 模块会具体说明实现。
登录设备记录
登录时可以获取到设备的登录记录。
/*!* @abstract 用户登录,返回登录设备信息** @param username 登录用户名. 规则与注册接口相同.* @param password 登录密码. 规则与注册接口相同.* @param devicesInfo 登录设备回调,返回数据为 NSArray<JMSGDeviceInfo>* @param handler 结果回调** - resultObject 简单封装的user对象,上层不要直接使用 resultObject 对象做操作, 因为它只是一个简单封装的user对象* - error 错误信息** @discussion 回调中 devices 返回的是设备信息,具体属性请查看 JMSGDeviceInfo 类*/+ (void)loginWithUsername:(NSString *)usernamepassword:(NSString *)passworddevicesInfo:(nullable void(^)(NSArray <__kindof JMSGDeviceInfo *>*devices))devicesInfocompletionHandler:(JMSGCompletionHandler JMSG_NULLABLE)handler;
DeviceInfo
| 属性 | 类型 | 说明 |
|---|---|---|
| platformType | JMSGPlatformType | 获取设备所属平台类型 |
| isLogin | BOOL | 判断设备当前是否处于登陆状态, YES:登陆,NO:登出 |
| online | UInt32 | 获取设备在线状态,0不在线,1在线 |
| mtime | NSNumber | 获取设备最近一次登陆时间,单位-秒 |
| flag | NSInteger | 默认为0,1表示该设备被当前登录设备踢出 |
多端同时在线
SDK从3.3.0版本开始支持多端同时在线,具体规则见多端在线说明
