0%

最近在弄 crash 日志的处理,找到了几篇文章,也还在研究,记录一下。
目前已经能正常记录程序 crash 时的调用栈。
代码在https://gist.github.com/wuchuwuyou/fdd20f64510e7652c7d95f5a22b7d988.
目前还不完善,后续继续更新。

参考

分析工具

网上一大堆文章都是分析iOS的崩溃日志的,针对Mac的特别少,其实基本原理都差不多,就不再详细的描述了。就推荐一个崩溃日志符号化的工具。

下载地址

源码地址

  • 使用方法:
    1. 将 .crash 文件和 .dSYM 文件放在同一目录下。
    2. 将 .crash 或者 .dSYM 拖入这个工具中,另外一个文件会自动导入
  • 注1:.dSYM 可以在打包时候生产的 .xcarchive 包中找到。
  • 注2:注意 .crash 和 .dSYM 的UUID要一致
  • 查看dSYM UUID xcrun dwarfdump --uuid file_path
  • .crash 查看UUID 在 Binary Images 的下一行 包名 后面的那一串字符

还有一个工具可以参考

dSYMTools
这个工具也可以符号化崩溃日志,需要手动操作,具体使用方式链接上面说的很清楚了。

参考链接

问题的出现

发现在文件传输的过程中,内存一直在增长并且不释放,反复的测试发现是在文件上传过程中,上传文件块过程中内存不释放,导致内存泄漏。

阅读全文 »

经常使用 SandBox ,但是总也记不住,记录下来免的又忘记了。

沙盒目录

沙盒的目录中有很多文件,经常打交道的是Data文件,它包含下面三个文件

  1. Documents:用于存储用户数据,iTunes备份和恢复的时候会包括此目录,所以,苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下。
  2. Library:包含两个子目录:Caches 和 Preferences。Caches用来存放用户需要换成的文件。Preferences是APP的偏好设置,可以通过NSUserDefaults来读取和设置。
  3. tmp: 用于存放临时文件,这个可以放一些当APP退出后不再需要的文件。

获取沙盒路径

根目录

//获取沙盒根目录
NSString *directory = NSHomeDirectory();

Documents路径

//获取Documents路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];

Library路径

//获取Library路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];

Caches路径

//获取Caches路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];

tmp路径

//获取tmp路径 
NSString *tmp = NSTemporaryDirectory();

–EOF–

起因

前些日子集成了某人脸识别的 SDK,通过他们发来的文档成功接入了,发测试也是使用了蒲公英进行分发的,通过 Xcode 打包出 ipa 然后传到蒲公英,一切都是很正常。直到前两天我要提交审核了,上传 ipa 的时候报错了。

报错信息:

ERROR ITMS-90166: “Missing Code Signing Entitlements. No entitlements found in bundle ‘com.xx.xxxx’ for executable ‘Payload/xx.app/PlugIns/xxxx.bundle/xxxx’.””

ERROR ITMS-90171: “Invalid Bundle Structure - The binary file ‘xx.app/PlugIns/xxxx.bundle/xxxx’ is not permitted. Your app can’t contain standalone executables or libraries, other than the CFBundleExecutable of supported bundles. Refer to the Bundle Programming Guide at https://developer.apple.com/go/?id=bundle-structure for information on the iOS app bundle structure.”

基本上就是报这两个错误,由于文件都是别人提供的,我就去问了下技术支持,但是没人鸟我啊,所以只能自己解决了。

刚看到报错信息我就想当然的就去网上搜了。费了很长时间都没有解决,焦头烂额,人也很烦躁。

后来实在没招了,仔细看了下报错信息,再对比下源文件,bundle 包下有一个可执行文件,报错信息中也确实给指出了问题:

Your app can’t contain standalone executables or libraries, other than the CFBundleExecutable of supported bundles.

解决办法:

  1. 删除编译 bundle 的 info.plist 中 Executable file
  2. 删除 bundle 所有的可执行文件。

因为 bundle 是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参加项目编译的。也就意味着,bundle包中不能包含可执行的文件。它仅仅是作为资源,被解析成为特定的2进制数据。

还在研究项目中引用的工程是怎么自己把执行文件也打包到 bundle 中的,等研究明白了再做更新。

总结

还是自己太不稳当了,太毛躁,遇到问题就知道网上查,其实问题已经很明显了,稍微用下心就能很快的解决。一定要记得看仔细看报错信息,答案都在里面了。

–EOF–

这两天老婆要全天在店里,晚上也吃不到老婆做的饭了。天天回来都喊累,我一琢磨,干脆我晚上自己做吧,多做点,第二天还能让她带饭吃。然后我就连续做了两天。基本上7点左右到家开始做,10点左右才做完,累的不行了最后也草草的吃两口就完了,做了俩小时,吃也就用10分钟。以下就是我这两天做的菜啦,看着不咋地,但是味道还可以。

阅读全文 »

很早之前制作过自己的pods,以前是然后pull request到specs,最近又想弄了,发现现在不再接受pull request了 改为trunk服务了,所以记录一下,免得自己以后也忘记了。

关于CocoaPods Trunk这里有介绍。

准备

先升级下CocoaPods版本,0.33以上就行了。

pod --version看一下版本。

然后注册一下trunk

pod trunk register your email 'your name'

your email就是填的邮箱了,your name就写你的名字。

完了话会收到一份邮件,验证一下。

然后就可以使用

pod trunk me     

来查看一下你自己的注册信息了。

如果你已经制作完了pod并创建修改完了podspec,就直接往下看了,如果没有就在网上搜一下。

提交

都弄完了我们就可以push啦。

当然了我们先验证下podspec文件喽

pod spec lint your.podspec

这步要是有问题就看看报错修改喽。没问题就继续

pod trunk push your.podspec

成功之后呢,我们看一下有没有

pod search yourpod

就是搜下你提交的pod的名字。
我们也可以在本地~/.cocoapods的路径下看一下有没有yourpod.podspec.json这个文件。

如果之前已经发布过的pod,作者本人声明所有权可以通过Claim Your Pods来看下具体步骤。认领地址

End

制作的时候也会有很多要注意的地方,我实在是懒的很,还是自己搜搜吧。。。。我这个写的相当粗糙了,网上有很多写的相当具体的了。比如:


更新一下:

如果使用

pod trunk XXX

报错

[!] Authentication token is invalid or unverified. Either verify it with the email that was sent or register a new session.

那就再执行下命令

pod trunk register your email

然后在你的邮箱里找找邮件打开验证一下,再继续。


更新

自己的制作的库要引用其他pod的文件的时候,引用方式头文件报错了,具体就是

#import<xxxx.h>

这类不行了 换成

#import<xxxx/xxxx.h>

–EOF–