Hi, this is Alice Home


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 公益404

Linux 进程切换

发表于 2018-03-01

SQLite With Swift4

发表于 2018-02-23

Git-Flow 工作流程

发表于 2018-02-22 | 分类于 Git

Feature

Start a new feature

Finish up a feature

Publish a feature

Get a published feature

Track a feature on origin

Release

Start a release

Publish a release

Finish up a release

Don’t forget to push your tags

Hotfixes

Start a hotfix

Finish a hotfix

参考:
git-flow 的工作流程

iOS组件化开发 概述‘

发表于 2018-02-08 | 分类于 iOS

Umeng 劫持 NSSetUncaughtExceptionHandler()

发表于 2018-02-02 | 分类于 iOS 问题

APP 工程中使用了友盟统计信息,导致自己通过NSSetUncaughtExceptionHandler收集崩溃信息失败。

自定义收集崩溃信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

NSSetUncaughtExceptionHandler (&MLUncaughtExceptionHandler);

return YES;
}

void MLUncaughtExceptionHandler(NSException *exception) {
NSArray *arr = [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
//将崩溃原因保存到本地
[[NSUserDefaults standardUserDefaults] setObject:reason forKey:@"reson"];
[[NSUserDefaults standardUserDefaults] synchronize];

}

如上,通过NSSetUncaughtExceptionHandler(),参数传入函数地址。当异常发生时,就会将异常信息保存到本地(当然也可发送给后台或者发邮件)。

问题重现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

NSSetUncaughtExceptionHandler (&MLUncaughtExceptionHandler);
NSSetUncaughtExceptionHandler (&WMUncaughtExceptionHandler);
return YES;
}

void MLUncaughtExceptionHandler(NSException *exception) {
NSArray *arr = [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
//将崩溃原因保存到本地
[[NSUserDefaults standardUserDefaults] setObject:reason forKey:@"reson2"];
[[NSUserDefaults standardUserDefaults] synchronize];

}

void WMUncaughtExceptionHandler(NSException *exception) {
NSArray *arr = [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
//将崩溃原因保存到本地
[[NSUserDefaults standardUserDefaults] setObject:reason forKey:@"reson"];
[[NSUserDefaults standardUserDefaults] synchronize];

}

上面的代码相当于有两个收集崩溃信息的地方 MLUncaughtExceptionHandler() 和 WMUncaughtExceptionHandler() ,但是当运行程序的时候回发现 MLUncaughtExceptionHandler() 不会收集到任何信息。因为 NSSetUncaughtExceptionHandler() 传入了两次函数地址,第一次函数的地址被替换掉了。

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
static NSUncaughtExceptionHandler *_MLHandler;

NSSetUncaughtExceptionHandler (&MLUncaughtExceptionHandler);
// 保存MLUncaughtExceptionHandler异常的handler
_MLHandler = NSGetUncaughtExceptionHandler();
// 设置WMUncaughtExceptionHandler异常的handler
NSSetUncaughtExceptionHandler (&WMUncaughtExceptionHandler);
return YES;
}

void MLUncaughtExceptionHandler(NSException *exception) {
NSArray *arr = [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
//将崩溃原因保存到本地
[[NSUserDefaults standardUserDefaults] setObject:reason forKey:@"reson2"];
[[NSUserDefaults standardUserDefaults] synchronize];

}

void WMUncaughtExceptionHandler(NSException *exception) {
NSArray *arr = [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
//将崩溃原因保存到本地
[[NSUserDefaults standardUserDefaults] setObject:reason forKey:@"reson"];
[[NSUserDefaults standardUserDefaults] synchronize];
_MLHandler(exception);
}

将之前对exception处理的handle进行保存,下一次处理的时候,重新调用之前的handle,将异常抛出给他们。

Umeng 劫持 Exception 问题

Umeng 应该也是用了上述方式对异常进行的处理,但是并没有将异常进行抛出,所以,当工程中使用了Umeng进行异常统计的时候,我们自己写的异常捕获有可能会失效。如果写在Umeng统计之前就会被Umeng替换掉,异常就无法捕捉。 但是,如果写在Umeng之后,就会造成Umeng统计失效(这个没有去验证)。所以我们就需要使用上面的方式进行处理。

1
2
3
4
5
static NSUncaughtExceptionHandler *_umengHandler;
// 将Umeng异常处理保存
_umengHandler = NSGetUncaughtExceptionHandler();
// 设置自己处理 (UncaughtExceptionHandlerYourself 是你自己处理异常的函数)
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandlerYourself);

如上,首先保存Umeng的handler UncaughtExceptionHandlerYourself 使我们自己处理异常的handler,然后在自己处理完异常之后,调用一下之前保存的Umeng的handler

1
_umengHandler(exception);

· 参考文档 ·
iOS友盟和其他崩溃收集库共存时的冲突问题

Git 札记

发表于 2018-02-01 | 分类于 Git

Git 常用命令

推送一个本地新建分支到远端

某些时候,我们为了开发某个需求,于是乎就新建了一个分支,但是这个分支是在本地的。当开发完这个需求后,其他需求没有完成,这个分支需要等待,这时候放在本地不太安全,万一明天来了电脑死球了呢,所以最保险的办法是将这个分支推送到远端,而此时远端并没有这个分支。(还有一种情况,你为了开发一个新的需求,本地新建了一个分支,而在开发期间发现别人需要在你的分支上继续开发,所以你必须把这个本地分支推送到远端),废话不多说,命令如下:

1
2

v2.4.3$ git push --set-upstream origin v2.4.3

如上,在当前分支上运行 git push 命令,加上后面的参数, v2.4.3 就是当前的分支名字。
特殊技巧

1
2
3
4
5
6

v2.4.3$ git push
fatal: The current branch v2.4.3 has no upstream branch.
To push the current branch and set the remote as upstream, use

git push --set-upstream origin v2.4.3

什么意思呢? git 是一个强大的交互工具,如果你忘记了这些个参数,那么直接输入 git push git 就会告诉你应该怎么做的。这里需要注意,git push 操作会影响远端,所以,粗心的我们在进行这些操作的时候一定要注意,万分谨慎,你必须要知道你要干嘛以及你干了什么事,切记切记。

获取一个本地没有的远程分支

  1. git branch 查看本地分支;
  2. git branch -a 查看本地分支和远程分支

    1
    2
    3
    4
    5
    6
    7
    8
    9
    v2.4.3$ git branch -a
    242
    master
    * v2.4.3
    remotes/origin/242
    remotes/origin/HEAD -> origin/master
    remotes/origin/master
    remotes/origin/segment
    remotes/origin/v2.4.3
  3. git checkout -b 本地分支名字 origin/远程分子名字

    1
    2
    3
    4
    5
    6
    7
    8
    v2.4.3 $ git checkout -b segment origin/segment
    Branch segment set up to track remote branch segment from origin.
    Switched to a new branch 'segment'
    segment$ git branch
    242
    master
    * segment
    v2.4.3

为本地 Git 添加远程 Git 地址

  1. 在远端创建一个空的 Git
  2. 进入本地仓库,添加远端 Git 地址git remote add origin git@github.com:AliceHome/SwiftApprentice.git,当然这之前需要在远端添加 ssh
  3. 推送到远端 git push -u origin master

    Git 思想

开发 IDE

发表于 2018-01-04

记录 IDE 使用方式以及配置,以备不时之需

Vim

EMACS

Emacs

安装 Emacs

1
brew install emacs --with-cocoa

Xcode

Visual Studio Code

Sublime

Atom

在使用Atom之前,已经使用了一段时间的 sublime,这两款 IDE 功能很相似的,但是我倾向于 Atom,可能是因为 Atom 名字靠前吧!如果这么类比的话,vim VS. Emacx ,我会选择使用 Emacs,哈哈,什么毛病啊!

Atom 是 GitHub 推出的一款编辑软件

MWeb

Markdown 的写作工具,之前用过其他的,但是最终还是选择了这个,这篇博客就是用它写的。

极光开发汇总

发表于 2018-01-02

开发了几款应用之后,大多数都用到了极光的推送,这里记录下极光的资源:

文档

极光官方文档, 这个文档里包含了

  • 推送
  • 统计
  • IM
  • 短信
  • 分享

文档很全了已经

极光开发者(GitHub)

极光开发者,极光的 GitHub 里面有各种版本的 demo,算是个百宝箱吧!

集成经验

最好知道你在做什么,要达到什么效果。在集成推送的时候,遇到了好多人问我,这个怎么不起作用,这个怎么了啊 … 其实,使用别人的东西的时候一定要知道用了什么达到什么效果,否则的话真的是盲人摸象。

iOS 推送集成

  • 注册极光开发者
  • 创建应用
  • 配置应用的证书
  • 到 apple 开发者那里生成证书,主要是生成 xxx.cer 然后下载到本地,导出 pl2 文件上传到极光上去
  • 创建 demo,建议通过 CocoaPods 集成,根据文档添加代码
  • 在极光后台测试推送(需要demo的 register id)

Git 上获取部分文件

发表于 2018-01-01 | 分类于 Git

背景

最近在开发的时候,遇到这么一种情况,公司的设计同事将 UI 设计稿放到了 git 上,但是这个 git 库已经 5+ G了。我为了看某一个版本的 UI 设计稿,要把所有的设计稿都拽下来,之前自己的本本硬盘比较足,还是不在乎的,最近换了个 256 的Mini,我卡,不行,不能拽一些没用的下来,so … 我需要一种技能 —— git pull 的时候,每次只拉去 Git 仓库中的某个文件夹。

一言蔽之

从远程 Git 仓库获取某个目录下的内容。

操作

创建本地Git仓库目录

1
2
3
4
5
6
7
$mkdir myGit_folder
$cd myGit_folder
#/myGit_folder 目录下
$git init
Initialized empty Git repository in /your computer path/myGit_folder/.git/
$ls -a
. .. .git

如上所示,如果在你当前目录下看到了隐藏 .git 目录就证明OK了。

添加远程 Git 仓库地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$git remote add -f origin < your git url,like: http://youaresogreat:3000/lawyer/ui.git >

##这个时候在.git目录下的config文件是这个样子
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
sparseCheckout = true
[remote "origin"]
url = http://youaresogreat:3000/lawyer/ui.git
fetch = +refs/heads/*:refs/remotes/origin/*

如果 url = http://youaresogreat:3000/lawyer/ui.git 这一行添加到了 .git/config 文件中,就证明OK了。

开启 Git 仓库 Sparse Checkout 模式

1
$git config core.sparsecheckout true

命令执行前:

1
2
3
4
5
6
7
8
9
10
11
#.git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = http://youaresogreat:3000/lawyer/ui.git
fetch = +refs/heads/*:refs/remotes/origin/*

命令执行后:

1
2
3
4
5
6
7
8
9
10
11
12
#.git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
sparseCheckout = true
[remote "origin"]
url = http://youaresogreat:3000/lawyer/ui.git
fetch = +refs/heads/*:refs/remotes/origin/*

如果 sparseCheckout = true 这一行添加到了 .git/config目录下,就说明OK了。

进入到 .git/info/ 配置要获取的文件夹路径

1
2
3
4
5
$cd .git/info
$ vim sparse-checkout
/ui/HTML/2.4.0
:wq
$cd ...

这里是在 sparse-checkout 文件中设置你要获取的文件夹目录 - /ui/HTML/2.4.0

拉取远程目录内容

1
git pull origin master

快速操作步骤:

这是对上面罗里吧嗦的步骤的总汇

1
2
3
4
5
6
7
8
9
10
11
12
$md myGit
$cd myGit
$(myGit/) git init
$(myGit/) git remote add -f origin (your git url)
$(myGit/) git config core.sparsecheckout true
$(myGit/) cd .git/info
$(myGit/.git/info) vim sparse-checkout
/one/two/three/mywantFileDir/
:wq
$(myGit/.git/info) cd ...
$(myGit/) git pull origin master
...

后记:本质就是开启git的 sparse checkout 模式,在 .git/config/sparse-checkout 文件中配置要拉取的文件夹路径。

思考:

通过写一个脚本让操作更加简单 … …

Mac 修改文件编码

发表于 2017-12-07 | 分类于 Mac

Mac 修改文件编码

最近,在使用 mac iterm 中的vim查看文件的时候,出现了乱码现象。

解决 vim 查看文件乱码

1
2
vim ~/.vimrc
set encoding=urf-8 fileencodings=ucs-bom,utf-8,cp936

enca 编码转换

  1. 查看文件编码:

    1
    $file FileName
  2. 安装工具

    1
    $sudo brew intsll enca
  3. 查看当前文件编码

    1
    enca -L zh_CN fileName
  4. 转换

    1
    2
    3
    4
    5
    $enca -L zh_CN -x utf-8 * #将当前目录下所有的文件都转换为 utf-8 编码

    $enca -L zh_CN -x UTF-8 fileName # 将名字为 fileName 的文件转换为 utf-8 编码

    $enca -L zh_CN -x UTF-8 <fileName1> fileName2 # 不想覆盖源文件
1…91011…13
Alice

Alice

The Loneliest Whale in the World

121 日志
35 分类
30 标签
© 2021 Alice
由 Hexo 强力驱动
主题 - NexT.Pisces