使用 NoticeBoard 迅捷而优雅地发布通知

Android 有原生的 SnackBar ,iOS 没有与之相似的原生控件,GitHub 上好像也没有找到特别好用的开源库。

既然在 Android 平台上能够作为原生控件存在,足以说明这种需求不算太不小众,在 iOS 端,类似的需求可能被 UIAlertController、MBProgressHUD 来替代,但是他们都需要打断用户当前正在进行的事情,体验很不好。GitHub 上有一个开源库 NoticeBar ,模仿 QQ的实现效果 ,虽然有200+的 Star ,个人感觉 UI 和可定制性都不是特别好,于是自己写了一个模仿系统原生通知样式的易于定制的 NoticeBoard ,下面请看截图和演示效果:

iOS 开发工程师面试心得 [持续更新]

最近找工作已经面试了6家公司,既有初创公司也有上市公司,现利用周末时间总结一下面试被问的频率高的技术问题,本文最近几天会持续更新。

技术点 频率
Runtime机制及其应用 ★★★★★
RunLoop原理及其应用 ★★★★★
多线程技术 ★★★★★
网络技术 ★★★★★
内存管理理解及其应用 ★★★★★
性能优化 ★★★★★
系统架构设计 ★★★★☆
Block ★★★★☆
CoreGraphics、UIBezierPath、CoreAnimation ★★★★☆
数据结构和算法 ★★★★☆
第三方库 ★★★☆☆

其中智能硬件行业的公司会问蓝牙BLE的技术点:数据分包、传输、校验、加密。
另外,AXKit(个人开源库)的简介中的功能的实现思路也是必问的。

如何整理混乱不堪的各国语言翻译

现状

linksmart项目截止目前已经支持了17个国家的语言,从诞生到现在也已经经历了很多程序员的修改和维护,代码已经变得十分混乱。因为公司一直在接新的定制项目,所以也没有时间进行一次彻底的重构,只能在维护某方面的BUG的时候,对相关代码进行局部重构。现在的情况是:

  • 同一个文本有些语言有翻译,有些语言没有翻译。
  • 有些需要使用缩进的地方,由于某种原因,并没有使用UIEdgeInsets进行缩进,而是在文本前后加空格。(⊙﹏⊙)b

整理思路

首先必须得找出一种合适的方法维护这些Localizable.strings,在Excel里做一个总表,增加语言的时候,可以直接把英文的一列发给客户进行翻译。最大的优势是:随时可以用脚本把Excel里的所有语言导出成项目支持的Localizable.strings文件,极大提高效率。

iPhone 屏幕尺寸与分辨率

屏幕尺寸 缩放比例 逻辑分辨率 物理分辨率
3.5 @2x 320 x 480 640 x 960
4 @2x 320 x 568 640 x 1136
4.7 @2x 375 x 667 750 x 1334
5.5 @3x 414 x 736 1242 x 2208
5.8 @3x 375 x 812 1125 x 2436

使用 appledoc 生成 API 文档

appledoc是个强大的工具,使用教程参考 ibireme 的博客 《用 appledoc 生成文档》 就足够了。

安装

git clone git://github.com/tomaz/appledoc.git
cd ./appledoc
sudo sh install-appledoc.sh

验证

appledoc --version

使用

你可以直接通过终端命令去生成,不过我更喜欢做成Xcode编译脚本,步骤如下:

  1. 选中你的工程,点击Add Target按钮,选择Other -> Aggregate模板新建
  2. 点击Add Build Phase按钮,添加一个Run Script
  3. 把下面的模板代码复制进去,把前几行参数改成你自己的
  4. 在Xcode左上角选择这个新建的Target,然后点击build
  5. 文档就会编译好并且自动安装进Xcode了(重启Xcode生效)
#appledoc Xcode script
# Start constants
company="xaoxuu";
companyID="com.xaoxuu";
companyURL="http://xaoxuu.com";
target="iphoneos";
#target="macosx";
outputPath="${SRCROOT}/docs/appledoc";
# End constants
/usr/local/bin/appledoc --project-name "${PROJECT_NAME}" --project-company "${company}" --company-id "${companyID}" --docset-atom-filename "${company}.atom" --docset-feed-url "${companyURL}/${company}/%DOCSETATOMFILENAME" --docset-package-url "${companyURL}/${company}/%DOCSETPACKAGEFILENAME" --docset-fallback-url "${companyURL}/${company}" --output "${outputPath}" --publish-docset --docset-platform-family "${target}" --logformat xcode --keep-intermediate-files --no-repeat-first-par --no-warn-invalid-crossref --exit-threshold 2 "${PROJECT_DIR}/AXKit"

open "${SRCROOT}/docs/appledoc/html/index.html"

注意:我把输出路径设置为${SRCROOT}/docs/appledoc的目的在于当前项目工程的page页面在/docs里,在page页面可以方便访问生成的文档的html页面。( 查看效果

记录第一次直播:iOS 项目框架的搭建

公司开展了一个新的活动,每周四下午的技术直播,就是传说中的直播敲代码,刚好又准备开始做新项目,所以第一个周四直播主题就是搭建项目框架。

项目框架我已经提前准备好了思维导图 项目框架设计.mindnode.zip ,基本上每个项目大同小异,而刚好几个月前我在AXKit的Demo中尝试搭建模块化框架,虽然没有做完被搁置了,但是整体项目结构都差不多,所以可以当做成一个项目模板使用。

所以这次直播的过程是这样的:我打开提前准备好的思维导图和AXKit,新建项目工程,对照着思维导图创建需要的文件夹,将AXKitDemo中有的部分拖拽过来,解决依赖问题。

在直播结束的时候,进行一个简要的总结,并就现在工作效率问题做了一些讨论,包括:需求的规范化UI的规范化,由于具体内容涉及公司机密就不再详细说明了。

git 命令及客户端的详细使用

Dev

git教程:廖雪峰的git教程git教程

Git与SVN的区别

  • git是分布式版本控制系统,SVN是集中式版本控制系统。详见: 集中式vs分布式
  • git把内容按元数据方式存储,而SVN是按文件。
  • git版本库可以离线查看所有log,可以离线提交,而SVN不可以。
  • ……更多区别详见: Svn与Git的区别

操作流程

SVN

  1. update(将远程版本库代码更新到本地)
  2. commit(将本地代码提交到远程版本库)

git

  1. commit(将本地代码提交到远程版本库)
  2. fetch(将远程版本库的改动下载到本地(未合并))
  3. merge(合并两个分支(本地、远程))
  4. push(将最新的版本库同步到远程服务器)

显而易见:SVN的操作简单明了,git学习成本比SVN高一点。但是由于git是分布式的,所以不需要联网就可以将代码改动立即提交。提交到本地版本库之后,本地和远程的版本就不一样了,因此需要fetch、merge、push来同步版本库。

那么这点区别有什么意义呢?将代码提交到版本库里就有了记录,就可以查询可以恢复,相当于游戏的存档,而与远程服务器的交互因为需要网络,就有很大的不稳定因素,可能会失败,相当于游戏的打BOSS。SVN是将存档和打BOSS绑定到了一起,要打了BOSS后才可以存档进度;而git由于版本库在本地,所以随时随地可以存档,并且要求打BOSS前必须存档。

使用git最大的感触就是安全(故障率低、易恢复)、速度快

如何搭建基于 Hexo 的独立博客

如果你的电脑是 macOS 系统,又比较懒,你可以选择使用这段脚本全程自动化完成,下面文章就可以不用看了。

# 打开终端,cd 到你想创建博客的地方,copy 并执行下面这一行:
curl -O 'https://raw.githubusercontent.com/xaoxuu/hexo.sh/master/hexo.sh' && chmod 777 hexo.sh && . hexo.sh m nhbx

当然,如果你想知其所以然,最好还是看一下本文。

Objective-C 与 Swift 混编

Demo下载:OCSwiftDemo.zip

Swift调用Objective-C

Swift调用Objective-C文件比较简单。当在Swift工程中新建Objective-C文件或者在Objective-C工程中新建Swift文件时,Xcode会自动提示你是否创建bridging header桥接头文件,点击创建后Xcode会自动为你创建一个桥接头文件。 在基于OC的OCSwiftDemo中创建一个Swift文件或者在Swift项目中创建OC文件时,Xcode会自动创建一个名为SwiftProject-Bridging-Header.h桥接头文件。

iOS 接入 Strava 分享模块(下篇:StravaSDK)

StravaKit 是一个比较新而且代码比较规范的第三方SDK,但是目前还没有上传功能(详见 todo) 。所以我不得已对StravaKit 0.9.5增加上传功能,并进行一些简单封装和改编,使之能够植入到公司项目中。由于时间有限,我只增加了上传fit文件的功能,并且使用了第三方框架Alamofire,所以需要在项目中导入Alamofire

博客如何嵌入 iframe 标签

直接插入 iframe 标签即可

网易云音乐

<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=100% height=450 src="//music.163.com/outchain/player?type=0&id=746319661&auto=0&height=450"></iframe>

效果如下:

iOS 如何取消交换方法(unswizzle)

runtime交换方法很简单,但是如何根据情况自动选择使用交换过的方法还是原方法?

没有找到更好的办法,最后只能在交换方法之前保存一个标记,表示此方法已被交换,取消的时候依据标记值进行判断,如果已经交换过了,再交换一次就是还原。关键点是判断这个方法的IMP指针指向的地址是否是原来的地址。