前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >常用开发技巧系列(四)

常用开发技巧系列(四)

作者头像
Mr.RisingSun
发布2018-01-15 10:28:33
1K0
发布2018-01-15 10:28:33
举报
文章被收录于专栏:移动端开发移动端开发

一:友盟的错误日志怎么看?

先说说友盟崩溃日志怎么查看的问题, 友盟统计我自己用的是比较多的,因为这个第三方的分享也是有的,就直接把友盟集成进去,统计和第三方分享的功能都是可以用的,利用友盟统计也是可以统计错误信息的,这样就涉及到这个错误日志的查看问题,友盟反馈给你的错误是下面这样的,得分析一下这个日志才能查定位到为题具体是出现在哪一行代码上,日志像下面所示:

        我也是上网看到这儿dSYM工具,自己试了一下,还是很好用的,这个工具作者也是开源放到Git上了,这里是工具的下载地址,感谢作者! 

        由于我们这个是技巧的总结篇,我就不累赘的说怎么使用这个根据了,下面的文章能教你怎么的使用这个工具,作者在GIT上面也有文章说明了怎么使用这个工具,说的也是很详细,这篇文章也可以帮助你,dSYM 文件分析工具

二:Reason: image not found 

       这个问题在开发的过程中一般是在库上面体现出来的,说说我自己遇到之后的解决方法吧:

       问题就在这个 Optional 和 Required 两个选项:要是遇见了上面说的错误,把你的status改成Optional 这里说明一下这两个选项的含义: Xcode中Link Binary With Libraries的Status含义

三: iOS 上避免 SIGPIPE 信号导致的 Crash

这个问题不知道有多少人遇到过,在前段时间写Socket的时候,遇到这个问题,在你的网络不稳定的时候,当Socket链接的时候会出现Crash,解决的办法在网上查找之后又两个常见的方案,自己最近也是在看这个CocoaAsyncSocket的源码,最主要的也就是常见的GCDAsyncSocket这个文件,先一步一步来看这个问题,造一下这个错误,截张图给大家看看,还有一点这个Crash在你Debug的时候你在Xcode上点击下一步程序是还能运行的,但在你手机上的话就直接Crash,其实是很严重的一个错误:

         好咯,一时半会造不出来这张图了,在遇到补会来,这个处理的话下下面这篇文章说的也清楚:

如何在 iOS 上避免 SIGPIPE 信号导致的 crash (Avoiding SIGPIPE signal crash in iOS)

        代码的话就就是这句:放在你创建Socket之后,或者连接之后都OK。

 四:今天用Cocoapods的时候遇到这样一个问题,如下图所示:

    这个问题在这里也发出来,看到的就算给大家混个脸熟吧,这个问题解决也简单,在你 pod 的三方下面加上这样一句:

          use_frameworks!

         这个  use_frameworks! 的解释在这:

在xcode 6.4 中使用swift和object-c混合编程,同时通过cocoapods进行管理的一些问题和解决办法

五:在导入第三方框架的时候,由于Swift的版本出现的问题

        Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the  build setting directly.

       这个错误的解决就说下面两点:

       1、在Buildsetting 里面设置      Use Legacy Swift Language Version 为YES

      2、在Edit里面修改   具体的修改看下图选中选项

六: 这里有你最常用的命令:

Mac 终端命令大全

       这里再说两点我们常用到的小技巧,不是命令行来的,但可能你也能用的着:

       1、你pod search .... 某一个三方之后,你怎么退出这个信息显示页面? 这个不需要命令,只要你按一下  Q 键 !!

       2、你ping ..... 某一个地址之后,怎么结束这个ping?  control + C 

七:肯定有人让你获取一下苹果的设备ID:

      这里在后面我也会总结出文章,针对的就是最后面的方法,要有人问你,你可以先把各种方式的好坏或者能不能用先说清楚:

      UDID             ios5.0之后禁止

      IDFA             广告ID,ios6.0之后出现,在同一个设备上的所有APP都会获取到相同的值,用户可以在设置-隐私-广告追踪中关闭它的获得,会出现获取不到情况。

      IDFV             UUID 用户删除应用重新装会随之改变。

      MAC地址       ios7.0之后禁止。

      UUID + keychain  获取到上面说的UUID之后保存在系统当中,就算用户卸载了APP之后还是能获取到相同的UUID,但是用户刷机或重装系统后uuid还是会改变,越狱的设备可能会出现存储失败的问题!

八:先简单的说一下关于渐变色,代码里面的注释写的是比较详细了,可以仔细的看看代码里的注释,一定有帮助,关于图形绘制这方面的内容没有整理过,等有机会有时间这方面的内容也是需要好好整理一下的。

代码语言:javascript
复制
-(void)drawRect:(CGRect)rect{

        /*
           颜色空间的创建
         */
        // 我们最常用的就是RGB色彩  显示三色
        CGColorSpaceRef rgbSpaceRef  = CGColorSpaceCreateDeviceRGB();
        
        // 这个是灰度色彩
        // CGColorSpaceRef graySpaceRef = CGColorSpaceCreateDeviceGray();
        
        // 印刷四色 CMYK色彩
        // CGColorSpaceRef cmykSpaceRef = CGColorSpaceCreateDeviceCMYK();
        
        /*
           const CGFloat *components :数组 每四个一组 表示一个颜色 {r,g,b,a ,r,g,b,a}
           const CGFloat *locations  :表示渐变的开始位置
         
           可以像下面这样写
           CGFloat components[8] = {1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0};
           CGFloat locations[2] = {0.0,1.0};
        */

        UIColor * strokeColor = [UIColor colorWithWhite:0.06 alpha:1.0f];
        
        // 上面的也可以直接写成如下形式:
        UIColor * gradientLightColor = [UIColor colorWithRed:0.101 green:0.100 blue:0.103 alpha:1.000];
        UIColor * gradientDarkColor  = [UIColor colorWithRed:0.237 green:0.242 blue:0.242 alpha:1.000];
        
        //
        NSArray * gradientColors = @[(id)gradientDarkColor.CGColor,(id)gradientLightColor.CGColor];
        CGFloat   locations[] ={0.0,1.0};
        
        // gradientColors 这个是OC的对象
        // 仔细看创建时候的参数可以看到这里需要的是CFArrayRef cg_nullable colors
        // CFArrayRef 对象 利用 __bridge的知识,把NSArray对象转化成 CFArrayRef
        CGGradientRef grandRef = CGGradientCreateWithColors(rgbSpaceRef, (__bridge CFArrayRef)gradientColors, locations);
        
        
        // 获取图形上下文 Graphics 绘制
        CGContextRef contextRef = UIGraphicsGetCurrentContext();
        
        // 渐变区域裁剪
        // CGContextClipToRect(context, CGRectMake(0, 360, 200, 100));
        // CGRect rect[5] = {CGRectMake(0, 0, 100, 100),CGRectMake(100, 100, 100, 100),CGRectMake(200, 0, 100, 100),CGRectMake(0, 200, 100, 100),CGRectMake(200, 200, 100, 100)};
        // CGContextClipToRects(context, rect, 5);
        
        /*
         
          这里也可以理解一下 CGRectInset 和 CGRectOffset
          CGRect CGRectInset(CGRect rect, CGFloat dx, CGFloat dy)  以rect为核心,dx 和dy 缩小相应的值
          CGRect CGRectOffset(CGRect rect, CGFloat dx, CGFloat dy) 以rect左上角为基点,向X轴和Y轴偏移dx和dy像素。
         
         */
        
        // 创建这个rect的目的是找到一个比View的rectX.Y缩小2.0个像素的rect
        CGRect insetRect = CGRectInset(rect, 2.0, 2.0);
        
        // 先给整个context设置填充色
        CGContextSetFillColorWithColor(contextRef, strokeColor.CGColor);
        
        // 填充指定矩形中的椭圆  Ellipse 椭圆
        // 给我们指定的rect绘制一个内切椭圆
        CGContextFillEllipseInRect(contextRef, insetRect);
        
        // X 坐标加 rect 宽度的值
        CGFloat midX = CGRectGetMidX(insetRect);
        CGFloat midY = CGRectGetMidY(insetRect);
        
        // 根据中心点,半径,起始的弧度,最后的弧度,是否顺时针画一个圆弧
        // CG_EXTERN void CGContextAddArc(CGContextRef cg_nullable c, CGFloat x, CGFloat y,CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)
        // 参数分别是 context 中心点  半径  起始的弧度 结束的弧度 是否顺时针
        CGContextAddArc(contextRef, midX, midY, CGRectGetWidth(insetRect) / 2, 0, M_PI * 2, 1);
        // 设置阴影
        CGContextSetShadowWithColor(contextRef, CGSizeMake(0.0f, 0.5f), 2.0f, [UIColor darkGrayColor].CGColor);
        // 直接在图形上下文中渲染路径
        CGContextFillPath(contextRef);
        
        // 在画一个比前面小一点的圆弧
        CGContextAddArc(contextRef, midX, midY, (CGRectGetWidth(insetRect) - 6) / 2, 0, M_PI * 2, 1);
        
        // 裁剪
        // CGContextClip   裁剪当前View path 的区域
        // CGContextEOClip 这个
        CGContextClip(contextRef);
        
        CGPoint startPoint = CGPointMake(midX, CGRectGetMaxY(insetRect));
        CGPoint endPoint = CGPointMake(midX, CGRectGetMinY(insetRect));
        
        /*
         CGContextDrawRadialGradient
         //下面再看一个颜色渐变的圆
         //参数1:图形上下文
         //参数2:渐变色
         //参数3:开始中心点
         //参数4:开始半径
         //参数5:结束中心点
         //参数6:结束半径
         //参数7:渲染模式
         CGContextDrawRadialGradient(context, gradient, CGPointMake(400, 100), 0.0, CGPointMake(350, 100), 30, kCGGradientDrawsBeforeStartLocation);
       
         */
        
        // gradient渐变颜色,startPoint开始渐变的起始位置,endPoint结束坐标,options开始坐标之前or开始之后开始渐变
        CGContextDrawLinearGradient(contextRef, grandRef, startPoint, endPoint, 0);
        
        CGGradientRelease(grandRef);
        CGColorSpaceRelease(rgbSpaceRef);
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-12-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档