iOS NSTimer不走的问题
iOS NSTimer不走的问题背景这个版本上线后,突然发现埋点数据直线下降,调试后发现是定时器上传的方法没有走,但是定时器的方法本期并没有修改过。代码如下 123456- (BOOL)initTimer() { self.uploadTimer = [NSTimer scheduledTimerWithTimeInterval:timerInterval target:self selector:@selector(handleUpload) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:self.uploadTimer forMode:NSRunLoopCommonModes];} 排查这个handleUpload方法,怎么都不会走,但是在之前的版本中就是好的,排查了之后发现,是外层调用的地方加了一层异步。即调用的地方变成了 12345dispatch_async(dispatch_get_global_queue(0, 0), ^{ i...
iOS beta4崩溃修改
iOS beta4崩溃修改前言升级iOSBeta4后,有用户反馈使用我们APP时会崩溃,有登录的、查看详情的,都会出现崩溃。我们查看Bugly数据也发现崩溃率上升了0.02%,直接超出了指定的崩溃指标。虽然是由于升级beta版系统导致的,但还是要排查出具体原因,然后尽快适配。所以我说一下我发现的哪个API导致的,供大家参考一下。 排查由于崩溃是必现的,所以排查起来很容易,找一台升级了iOS14 beta4的手机,然后复现步骤,看具体崩溃的地方,即可我们APP是由于使用了SexyJson这个库,其中SexyJsonProtocol这个类第67行中sexyToValue()的方法里使用AnyRandomAccessCollection这个地方有强制解包属性,在之前的系统版本中,这个地方返回的值不为空,所以没有问题,但是在这个版本里,这个属性返回为空了,就导致了新系统中的崩溃。 如图所示位置: 修改由于是强制解包导致的,所以直接的修改就是,把这个地方的强制解包,改为if let的格式,修改后,运行,binggo,崩溃确实没了。但是在验证过程中,由于我们使用这个是把请求的对象转为参数...
iOS14适配一查找哪些SDK使用剪切板
iOS14适配一查找哪些SDK使用剪切板背景iOS14公测版发出之后,我们app出现了从后台唤起会弹出 读取剪切板的 提示,安全要求要赶紧查,全局搜索了我们APP,发现并没有读取剪切板的代码,比窦娥还冤,只能是第三方SDK的问题了,但是项目里集成了十几个第三方SDK,一个个排查删除,万一两个SDK都有,这个排列组合可能性就太多了。 脑壳疼了好几天,求助万能的V友和群友,然后找到了好的办法 步骤1: 用Xcode的Symbolic breakpoint,调试[UIPasteboard generalPasteboard],按照重现步骤,例如,我们APP是从后台唤起来会有这个提示,就打断点,然后走这个流程。 步骤2: 断点会停在调用到这个方法的地方,然后上下查看,如果还不能确认是哪个SDK的话,就单步向下走几步,然后就会出现调用方 步骤3:具体调用的类已经暴露了之后,怎么确定这是哪个SDK的呢?在工程目录中使用命令(来自群友的帮助):12find . -type f | grep -e ".framework" | xargs grep -s...
iOS 13 适配
iOS 13 适配转自iOS 13采坑记录iOS 13适配总结 UIViewController Present出来的样式修改 iOS 13默认的modalPresentationStyle是UIModalPresentationAutomatic,可能不符合我们的要求,改回之前的模式要用UIModalPresentationFullScreen. 新写一个UIViewController的Category,改变modalPresentationStyle的返回结果 1234567@implementation UIViewController(Category)- (UIModalPresentationStyle)modalPresentationStyle { return UIModalPresentationFullScreen; }@end “NSGenericException” -reason: “Accress to UITextField’s _placeholderLabel ivar is prohibited....
ProtocolBuf Swift 使用
ProtocolBuf Swift 使用环境搭建Mac安装swift-protobuf 1brew install swift-protobuf 使用Podfile集成Xcode再Podfile里添加 1pod 'SwiftProtobuf' 然后在此目录下打开terminal运行 1Pod install 使用新建BookInfo.proto 1234567syntax = "proto3";message BookInfo { int64 id = 1; string title = 2; string author = 3;} 在此文件同目录下执行下面命令,生成.swift文件 1protoc --swift_out=. BookInfo.proto 将.swift文件拖入工程,编译一下,使用 123456789101112131415161718192021// Create a BookInfo object and populate it:var info = BookInfo()i...
Mapping architecture armv7 to i386
最近项目里升级后,编译警告多了起来,看起来好碍眼,就想着改掉,先从Debug warning: Mapping architecture armv7 to i386.这个开始。 看了警告之后,知道是对应target下的Build Settings里architecture的问题,然后去检查对应target下,发现today widget、iwatch widget里Valid Architectures的Release跟Debug不一致,然后就手动修改为 $(ARCHS_STANDARD),编译,done,完美解决。
Embedded binary is not signed with the same certificate as the parent app
Embedded binary is not signed with the same certificate as the parent app背景Xcode 10之后New Build System变为默认,编译之后一直报错,报错信息:Embedded binary is not signed with the same certificate as the parent app. Verify the embedded binary target’s code sign settings match the parent app’s. eg: 但是在Legacy Build System下就没有问题。刚开始直接粗暴的改回Legacy Build System,一直没来得及查具体原因,最近得空了,仔细查了一下。 过程搜到的好多人说,是因为keyChain里证书的信任状态不对,要用系统默认,不能强制始终信任。but,我检查了之后,我的证书确实是系统默认的状态。 在stackoverflow上iOS error “Embedded binary is not signed ...
批量图片压缩 & 替换
批量图片压缩 & 替换背景最近产品提了个需求,要求把包压缩一下,而项目是OC&Swift混编,这期还加上了RN,还要包不能增大。脑壳疼。。。。他则不上天呢。但需求出来了,还是要做的。所以就想了下面几个方法: 先用LSUnusedResources分析项目中无用的图片和类,删除; 然后对项目中的图片进行压缩替换; 再接着分析linkMap文件,找出大的文件进行优化。 基于clang插件的一种iOS包大小瘦身方案 实现这篇就是关于第二步的,项目里大约有1600多张图片,之前几次压缩都是按大小排序,然后把大于10kb的图片一个个上传到tinypng上压缩,再下载替换。tinypng web最多支持一次20张,每次上传压缩,然后等,就问问烦不烦。。。。 图片批量压缩so,这次我终于受不了,我要找批量压缩的,还真给我搜到了图片批量压缩脚本(Python),这种使用方式GitHub上已经写得很清楚了,每月可以500张批量压缩,然后有一个输出文件夹: 使用这个脚本的时候,要注意: 安装Python 安装click和tinify 到此处申请 API key: https...
CocoaPods私有库生成
CocoaPods私有库生成
iOS使用IconFont
IconFont的使用github链接背景: 最近设计提了要求,切图用IconFont一开始,在搜了IconFont的使用后,选中了TBCityIconFont,使用了之后,发现对于图片的支持不太好,就是长宽不等的图片,显示的时候会被截断,在具体实现里也没发现修改的地方。 然后就pass了,换了另一个Swift的Iconic的第三方库,这个库有个好处,是可以自动把.ttf文件里的Icon生成一个枚举使用的时候特别方便。然而缺点是安装的时候麻烦,之前只是稍微麻烦,最近变得特别麻烦,需要设置FONT_PATH。而且不支持最新版本的Swift,每次更新.ttf字体文件,都要改一次。 实在是受不了了,今天就抽空自己写(抄)了一个。😄有兴趣的可以自己看参考链接,其实就是参考链接里内容的整合。 实现首先,我想要的是,传入一个Int类型(eg: 0xe654)或者字符串类型(eg :\u{E61A})都支持。 然后如果是本地的文件,我希望可以不用手动收入unicode码。最后就是图片支持宽高不等的显示。 整体的原理是Working with icon fonts in iOS. Code...