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

来源:互联网 发布:mac os 开机密码忘记 编辑:程序博客网 时间:2024/06/03 16:33

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 0