iOS学习笔记-环信UI3.0集成中的问题

1.UserProfileManager

这里写图片描述

做为整个项目中管理用户entity的类,它封装了很多实用方法,我们可以采用原来的大部分内容,但是要把原demo中Parse相关部分注释掉,自己来完成数据从远程的读取和存储,以及如何存储在本地;

static UserProfileManager *sharedInstance = nil;
@interface UserProfileManager ()
{
    NSString *_curusername;
}

@property (nonatomic, strong) NSMutableDictionary *users;
@property (nonatomic, strong) NSString *objectId;
//@property (nonatomic, strong) PFACL *defaultACL;

@end

users数组存在周期为整个APP运行时段,所以可以作为数据缓存,app退出后就释放了,当然你可以在

- (void)loadUserProfileInBackgroundWithBuddy:(NSArray*)buddyList
                                saveToLoacal:(BOOL)save
                                  completion:(void (^)(BOOL success, NSError *error))completion

方法里写存储到本地数据库的逻辑(FMDB)

这里我来示例一下:

- (void)loadUserProfileInBackground:(NSArray*)userInfos
                       saveToLoacal:(BOOL)save
                         completion:(void (^)(BOOL success, NSError *error))completion
{
    _users = [NSMutableDictionary dictionary];
    for (NSDictionary *dic in userInfos) {
        MHJUserProfileEntity *entity = [MHJUserProfileEntity initWithDictionary:dic];
        [_users setObject:entity forKey:[NSString stringWithFormat:@"%@",entity.username]];
//        NSLog(@"testst:%@",dic);
    }
    if (save) {//一般来说不用存储到本地,看个人需求了
//        NSString *table = [NSString stringWithFormat:@"a%@",USERNAME];//防止以数字开头,所以加个a,数据库中表是不能以数字开头的
//        FMDatabase *myUserDB = [FMDatabase databaseWithPath:UserEntityDB_Path];
//        if ([myUserDB close]) {
//            [myUserDB open];
//        }
//        
//        
//        BOOL delete = [myUserDB executeUpdate:DeleteTable(table)];
//        if (delete) {
//            NSLog(@"成功删除该用户之前entity数据表");
//        }else{
//            NSLog(@"删除用户表失败");
//        }
//        
//
//        
//        NSString *createEntityTable = CreatTable_ForUserEntity(table);
//        BOOL FactoryTable = [myUserDB executeUpdate:createEntityTable];
//        if(!FactoryTable){
//            NSLog(@"创建entity表失败,或许已存在表");
//        }else{
//            NSLog(@"创建entity表成功");
//        }
//        
//        for (MHJUserProfileEntity *entity in _users.allValues){
////            int imageID;
////            if ([myDic objectForKey:UserEntity_HXInfo] && ![[myDic objectForKey:UserEntity_HXInfo] isKindOfClass:[NSNull class]] && ![[myDic objectForKey:UserEntity_HXInfo] isEqualToString:@""]) {
////                NSString *jsonString = [myDic objectForKey:UserEntity_HXInfo];
////                NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
////                NSError *err;
////                NSDictionary *infoDic = [NSJSONSerialization JSONObjectWithData:jsonData
////                                                                        options:NSJSONReadingMutableContainers
////                                                                          error:&err];
////                if(err) {
////                    NSLog(@"json解析失败:%@",err);
////                }
////                
////                if ([infoDic objectForKey:UserEntity_ImageId] && ![[infoDic objectForKey:UserEntity_ImageId] isKindOfClass:[NSNull class]]) {
////                    imageID = [[infoDic objectForKey:UserEntity_ImageId] intValue];
////                }else{
////                    imageID = 0;
////                }
////            }
//            
//            BOOL res = [myUserDB executeUpdate:InsertTable_ForUserEntity(table,entity.userId,entity.sex,entity.imageUrl,entity.email,entity.username,entity.imageID,entity.nickname,entity.describe]);
//            if (!res) {
//                NSLog(@"插入document数据库成功");
//            }
//        }
//        [myUserDB close];
    }

    if (self.users != nil) {
        if (completion) {
            completion(YES,nil);
        }
    }
    NSLog(@"缓存数据成功");
}

上面的常量字符串我定义成了宏方法

#define UserEntityDB_Path [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"/test.db"]


//判断表是否存在 - A 为表名
#define ExistTable(Table) [NSString stringWithFormat:@"select count(*) as 'count' from sqlite_master where type ='table' and name = %@_Table",Table]
//删除表
#define DeleteTable(Table) [NSString stringWithFormat:@"delete from %@_Table",Table]
//创建表
#define CreatTable_ForUserEntity(Table) [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@_Table (id INTEGER PRIMARY KEY,sex INTEGER,imageUrl TEXT,email TEXT,username TEXT,imageID INTEGER,usertitle TEXT,discription TEXT) ",Table]
//查找表
#define SelectTable_WhereUsername(Table,Username) [NSString stringWithFormat:@"SELECT * FROM %@_Table where username = %@",Table,Username]
//向表中插入数据
#define InsertTable_ForUserEntity(Table,A,B,C,D,E,F,G,H) [NSString stringWithFormat:@"insert into %@_Table(id,sex,imageUrl,email,username,imageID,usertitle,discription)values(%d,%d,'%@','%@','%@',%d,'%@','%@')",Table,A,B,C,D,E,F,G,H]
1.1 UserProfileEntity

在UserProfileManager里面声明了这个类,你可以自定义用户实体的属性如:

@interface UserProfileEntity : NSObject

+ (instancetype)initWithPFObject:(PFObject*)object;

@property (nonatomic,strong) NSString *objectId;
@property (nonatomic,strong) NSString *username;
@property (nonatomic,strong) NSString *nickname;
@property (nonatomic,strong) NSString *imageUrl;

@end

看自己的要求了。总之各种与用户数据相关的逻辑都可以写在这个类里;

2.ChatDemoHelper - 重要

这里写图片描述

这个类在整个环信项目中是最非常重要的,里面实现了大量的回调逻辑,比如收到消息,收到好友请求,收到静默消息(cmd消息),发送语音邀请等等;如果你想在接收到这些操作的同时相应事件,就得在这里写;(你可以换个符合你项目的名字 例如:TestHelper )

点开.m文件,方法名很易懂:

这里写图片描述

各种逻辑它都写好了,你可以仿写;

3.AppDelegate+EaseMob

用于处理SDK注册设置等相关逻辑,你只需要按他的来就行了;

4.出现:CopyPNGFile 异常错误

这里写图片描述

出现这种情况项目还是能够编译运行的
大部分原因是因为你项目中存在了多个这样的文件,删除,只留一个就行了;如果只有一个,那就是格式问题了

5.Decoder_Interface_init()崩溃错误

在环信UI3.0中,使用了音频转码
opencore-amrnb
opencore-amrwb
这里写图片描述

如果出现这个问题,一般是你独立集成一个环信测试demo,运行正常,但是当你集成到你公司项目中时,就崩溃了,这是静态库冲突的问题,我自己也没解决,如果静态库中同用了一个“工具”,但是是不同版本,那就会导致。

6.Library Search Path 的设置问题

如果对这方面比较熟悉,这段就用看了;

我们需要导入SDK和视频解码的静态库,一般来说Xcode会帮我们自动设置静态库的路径,但是如果出现:ld: library not found for xxxxx 的问题,那就是静态库路径错误了

这里写图片描述

我们找到静态库文件直接拖入:

这里写图片描述

拖入到$(inherited)的下方:

这里写图片描述

这里可以去掉引号,这样只导入了一个静态库,如果该文件下有多个静态库文件,你只需要导入该文件的路径就行了;

此外路径右边的 non-recursive 表示不检查这个文件下子目录所包含的静态库

如果设置为recursive,你直接写上工程总目录,静态库能够自动全部导入的;

7.便捷的显示方式[self showHint:@”提示信息”]

在环信中,使用了MBProgressHUD工具,其中方便快捷的显示提示框的方式来自分类:

这里写图片描述

使用者可以使用这种快捷方式,很方便,当然,这些我们也可以自己写某个工具类里面调用这些方法

这里写图片描述

有问题可以提问,我正愁没东西写,因为想不到

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值