美文网首页iOS之报错上架填坑iOS 艾欧艾斯买不来的iOS实用技巧
iOS开发--开发经验和解决方案(更新添加.dylib方案)

iOS开发--开发经验和解决方案(更新添加.dylib方案)

作者: FR_Zhang | 来源:发表于2016-10-17 17:04 被阅读1746次

    一. 重新创建项目,设置账号运行,突然出现下面的情况:

    Bug展示
    我来简单的翻译一下最重要的:
    Your maximum App ID limit has been reached. You may create up to 10 App IDs every 7 days
    你的最大限制应用程序ID。你可以每7天创建10个APP IDs

    ------------我是一个可爱的分割线------------

    也就是说,你的当前的开发者账号在创建APP IDs的有效期是7天,同样的,在7天内的最大饱和创建数量是10个.(我是这么理解的)
    这里算是一个坑,针对XCode7的改变之一,因为特别是针对开发初学者而言,需要创建多数demo用来调试程序,功能写好了,添加到相应的程序中,这里的限制显然是为了苹果开发者文件的资源最优化.
    ps:苹果现在是越来越矫情

    • 问题出现了,该怎么解决呢,我采用比较笨的方案,当然也是可行方案:

    将自己每一个创建项目的(必须通过自己或者相关的账号)Bundle Identifier记录下来,怎么记录都行,我是用印象笔记记录的,等到在创建项目的时候出现这样的问题,直接使用之前自己创建的Bundle Identifier就行了.

    Bundle Identifier

    二. XCode乱七八糟的碎碎念

    先来个截图

    碎碎念

    为了方便用户搜索,现在贴出输出代码:

    2016-10-17 17:17:12.846456 ChildDoByFarther[10287:907310] subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
    2016-10-17 17:17:12.849892 ChildDoByFarther[10287:907310] subsystem: com.apple.UIKit, category: HIDEventIncoming, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
    2016-10-17 17:17:12.857289 ChildDoByFarther[10287:907305] subsystem: com.apple.BaseBoard, category: MachPort, enable_level: 1, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0
    2016-10-17 17:17:12.869714 ChildDoByFarther[10287:907269] subsystem: com.apple.UIKit, category: StatusBar, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
    2016-10-17 17:17:12.889922 ChildDoByFarther[10287:907269] subsystem: com.apple.BackBoardServices.fence, category: App, enable_level: 1, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0
    

    这里呢,其实是XCode8更新后输出的XCode的日志,反正我是看不懂,目前为止对我而言无关紧要,要是有看得懂的可以私信我研究研究.
    好的,接下来,说一下解决方案,目前为止的可行解决方案修改配置(直接上图来的直观):

    1. 在XCode的左上角点击项目名称,出现如下:


      进入配置
    2. 选择Arguments中的Environment Variables,并点击+号:


      选择配置相关
    3. 在Environment Variables下边添加:OS_ACTIVITY_MODE, value值设置为disable...........添加后点击Close


      添加配置
    4. 完美解决


      完美

    三.iOS项目中的中文字符查找

    1.打开”Find Navigator",并且将搜索方式切换搜索模式到 “Find > Regular Expression”,如下图
    
    选择查找方式.png
    2.输入查找信息
    OC输入:@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?" 
    Swift输入:@"[^"]*[\u4E00-\u9FA5]+[^"\n]*?"
    
    查找内容.png

    效果展示如上图查到的结果一样.

    备注,在参考网络上的解决方案,发现可以根据正则表达来解决这个事情,但是,由于本人对正则方案不是很了解,下面贴出解决方案,大家有兴趣的可以参考参考:

    如果你跟我一样嫌NSLocalizedString的comment碍事 也可以用正则替换掉
    Find NSLocalizedString\((@"[^\)]*?")\s*,\s*@"[^\)]*"\s*\)
    Replace With NSLocalizedString\($1, nil\)
    

    四.评论的坑:屏幕的多点触控导致的UIButton和UITextField均相应

    说明:这是我在开发中,点击cell可以对评论进行回复或者举报,采用苹果原声的UIActionSheet触发事件,评论区域采用自定义View,添加UITextField.在非正常操作中,比如长按cell,这时候再点击UITextField,此时UITextField是可以相应键盘弹起来的,但是,再松开长按cell的点击的手,此时cell的触发事件也会相应,这样必然是不对的.
    下面是错误视频:


    错误设定.gif
    直接上解决方案:

    思路:采取NSTimeInterval记录按下和抬起两个事件触发的时间,并通过这个差值考虑触发事件.
    规定:考虑到人性主义和人体工学,选择0.5s时间差为有效触发事件

    1.创建实例变量,记录两中不同的点击触发事件的时间
      //保存长按的时间差
        NSTimeInterval  _timeInterVal1;
        NSTimeInterval  _timeInterVal2;
    
    2.给UIButton添加两种触发状态
    // 点击
    [_reverBtn addTarget:self action:@selector(onReverBtnTapStart:) forControlEvents:UIControlEventTouchDown];
    // 离开
    [_reverBtn addTarget:self action:@selector(onReverBtnTapFinish:) forControlEvents:UIControlEventTouchUpInside];
    
    3.再开始点击的触发事件的方法,记录开始电机的时间:
    -(void)onReverBtnTapStart:(UIButton *)sender {
        _timeInterVal1 = [[NSDate date] timeIntervalSince1970];
    }
    
    4.在结束点击的触发事件的方法中,记录结束点击的时间,并根据这个时间差进行事件的处理方法:
    -(void)onReverBtnTapFinish:(UIButton *)sender {
        _timeInterVal2 = [[NSDate date] timeIntervalSince1970];
        if(_timeInterVal2 - _timeInterVal1 < 0.5)
        {
            if ([_delegate respondsToSelector:@selector(commentCell:didTapRevertComment:)]) {
                [_delegate commentCell:self didTapRevertComment:_comment];
            }
        }
        else if(_timeInterVal2-_timeInterVal1>3.0)
        {
            return;
        }
    }
    

    五.数据库的升级(FMDB)

    实在不知道开头怎么写,先这样吧.
    数据库升级,对本地数据保存有着不可或缺的重要性,虽然移动开发针对的更多是功能性和展示性的东西,但是为了增加用户体验,会获取到一些数据保存起来,比如首页的信息缓存等等,数据库的使用就不在多说了,要是不明白或者不了解,可以看看关于数据库方面的东西.
    为了方面使用,采用了FMDB,这是个比较好的封装的数据库第三方.
    不多说直接上代码:

    1.创建静态数据库队列
    static FMDatabaseQueue *_queue;
    
    2.创建版本号

    版本号为了方便启动,建议以整形的数据进行保存

    NSString * const currentHPCacheToolVerson = @"2";
    
    3.在initialize方法中创建数据库的基本信息

    这里面主要是根据FMDatabase中的userVerson进行版本的判断,初始化版本的时候,默认是0,这里就方便了第一次安装和老用户,因为在当前存在数据库版本升级的版本之前,都是0,这里我们把0作为初始版本,即初始化创建的表和相关的字段.

    + (void)initialize { 
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"homeData.sqlite"];
        _queue = [FMDatabaseQueue databaseQueueWithPath:path];
        [_queue inDatabase:^(FMDatabase *db) {
            if (db.userVersion == 0) {
                [db executeUpdate:@"create table if not exists t_homeGroup        (id integer primary key autoincrement, homeGroup      blob);"];
                [db executeUpdate:@"create table if not exists t_videoInfos       (id integer primary key autoincrement, videoInfo      blob)"];
                [db executeUpdate:@"create table if not exists t_homeGroupDetial  (id integer primary key autoincrement, groupId        text, homeGroupDetial blob);"];
                
                [db executeUpdate:@"create table if not exists t_paintComics      (id integer primary key autoincrement, paintComic     blob, creatTime text, userId text);"];
                [db executeUpdate:@"create table if not exists t_dynamics         (id integer primary key autoincrement, dynamics       blob, creatTime text, userId text);"];
                [db executeUpdate:@"create table if not exists t_discoverTopics   (id integer primary key autoincrement, discoverTopics blob, creatTime text, userId text);"];
            // 这里需要注意的是,在创建完成之后,需要讲创建后的版本设定为1,这里是考虑到老用户和新用户的问题
                [db setUserVersion:1];
            }
               // 在的设定完初始版本后,进行数据哭的判断更新
                [self updateSQL];
        }];
    }
    
    4.版本更新,这里也是作重要的一个部分

    这里做的是匹配版本号,根据当前版本号与预期版本号进行对比,并将版本号对应的更新写入到swich中,如果当前更新完成后,版本号与预期版本号相等,则break,如果不相等(小于),则继续升级.当然,有很多朋友更喜欢写成递归的形式,考虑到理解性方面,我还是采用swich方式给大家讲解吧.

    - (void)updateSQL {
        if (db.userVersion < [currentHPCacheToolVerson integerValue]) {
                    // 更新数据库
                    [self updateDBWithOldDBVerson:db.userVersion db:db];
        }
    }
    
    + (void)updateDBWithOldDBVerson:(int32_t)verson db:(FMDatabase *)db {
        switch (verson) {
            case 1: {
                // DO 添加数据库中表的字段
                [db executeStatements:[NSString stringWithFormat: @"ALTER TABLE t_homeGroup       ADD creatTime text"]];
                [db executeStatements:[NSString stringWithFormat: @"ALTER TABLE t_homeGroup       ADD userId text"]];
                
                [db executeStatements:[NSString stringWithFormat: @"ALTER TABLE t_videoInfos      ADD creatTime text"]];
                [db executeStatements:[NSString stringWithFormat: @"ALTER TABLE t_videoInfos      ADD userId text"]];
                
                [db executeStatements:[NSString stringWithFormat: @"ALTER TABLE t_homeGroupDetial ADD creatTime text"]];
                [db executeStatements:[NSString stringWithFormat: @"ALTER TABLE t_homeGroupDetial ADD userId text"]];
                // 更新完成后,版本号迭代
                verson++;
               //写入新的版本号
                [db setUserVersion:verson];
                if ([currentHPCacheToolVerson integerValue] == verson) {
                    break;
                }
            }
            default:
                [ZZHUDMessage showCompletedText:@"数据库升级失败,请在个人中心中反馈" withCompletedType:HUDShowCompletedTypeError];
                break;
        }
    }
    

    5.iOS 解决.dylib找不到的问题

    原因:应该是从iOS7之后,所有的依赖库由.dylib变成了.tbd
    As for Xcode 7 b4: To add Parse support into existing project, follow the Parse "Set up the SDK" for existing project and to add the libz and libsqlite3 libs, use:
    如下图所示:


    tbd搜索结果.png

    *当然,有网友说tbd使用也是一样的.但是,我们的dylib去哪里添加呢?
    几经波折,终于找到了添加的方法:

    1. Build Phases -> Link Binary with Libraries -> +
    1.png
    2.点击弹框左下角的"Add Other..."
    2.png
    3.快捷键 "command+shift+G"
    3.png
    4.快速搜索路径:"/usr/lib",点击Go
    4.png
    5.在左上角输入搜索内容"libz"(这里以libz.dylib为例子),搜索完后,点击"lib"的标签,然后就出现搜索到的结果啦
    5.png
    6.最后点击搜索的结果,再点击open就可以了.

    这里会不断更新自己项目工程中遇到的BUG和问题,并给出相关的解决方案,希望大家多多交流.谢谢
    最后,附上本人写的相关的demo,有一些实用性的例子,相互学习,相互交流:demo地址

    相关文章

      网友评论

      • FR_Zhang:有别的想法和思路可以私信我
      • __下一个天亮__:不知楼主是否遇到这样的情况 : NSLog 出来的信息 显示不全
        FR_Zhang:@__下一个天亮__ 这个问题你是说直接nslog还是断点po。平常要是有需要的可以断点。遇到不可延迟比如网络情况。则断点不行。必须要用nslog。至于打印信息不全。这个我没遇到过
        __下一个天亮__:@FR_Zhang 就是 正常的从接口取出来的数据 NSLog 一下,debug区不能够完全显示出response 的信息。这个不一定,有的信息是可以log出来的,有的就不行,偶然出现这种情况。
        FR_Zhang:@__下一个天亮__ 比如举个例子。
      • 鼻毛长长:输出很多日志那个,每个新项目,写一个小demo都要添加,很麻烦,有没有傻瓜一点的?
        tdt:@鼻毛长长 Xcode8.1Beta版就没了
        FR_Zhang:@鼻毛长长 这个目前为止 我只知道这个可行的办法 期待xcode的更新解决这个问题吧
      • 麦穗0615:这就是所谓的真机调试吗?:disappointed_relieved:
        FR_Zhang:@_正阳_ 题目事真多第一条起的 后来想想把出现的问题记录下来比较好

      本文标题:iOS开发--开发经验和解决方案(更新添加.dylib方案)

      本文链接:https://www.haomeiwen.com/subject/hbqzyttx.html