多粉App打包发包发布

打正式包

应用名:“多粉”
更新版本号duofen, dfsimu, DFAppNotificationExtension
选择duofen,archive选择release模式,修改name为dfRelease
是否需要更新屏幕快照
搜索todo
最好先打正式,再打测试
备份代码,最好添加GIT

打内测包

应用名:“多粉内测版”
更新版本号duofen,dfsimu,DFAppNotificationExtension
archive选择testRealse模式,修改name为dfTestRelease

mac杂记

禁用spotlight文件索引(mds_stores,mdworker等进程)

系统偏好设置–>聚焦–>隐私–>左下角的”+”–>选择Macintosh HD

彻底禁用spotlight

sudo mdutil -a -i off

如果需要再次使用spotlight,可以通过以下命令重新开启

sudo mdutil -a -i on

telegram挂代理

https://t.me/socks?server=127.0.0.1&&port=7890

解除mac电脑密码长度限制

命令 pwpolicy -clearaccountpolicies

判断终端是否已经挂上代理

如果挂上代理,会有内容返回,如果没挂代理,将卡在原地
命令 curl www.google.com

xx.app已损坏,无法打开

sudo xattr -d com.apple.quarantine /Applications/xx.app

xcode杂记

Xcode版本落后于真机iOS版本的解决方案:
https://gitee.com/Han0/iOSDeviceSupport

Xcode profile存放路径:~/Library/MobileDevice/Provisioning Profiles

Xcode 重置偏好设置 defaults delete com.apple.dt.Xcode

需要定时清理的:
/Users/lixiang/Library/Developer/Xcode/DerivedData
/Users/lixiang/Library/Developer/Xcode/iOS\ DeviceSupport
/Users/lixiang/Library/Developer/Xcode/watchOS\ DeviceSupport
/Users/lixiang/Library/Developer/Xcode/DocumentationCache
等同级别文件夹,都可以清理。

// 屏蔽杂乱日志
OS_ACTIVITY_MODE disable
// 禁止Xcode indexing
defaults write com.apple.dt.XCode IDEIndexDisable 1
defaults write com.apple.dt.XCode IDEIndexDisable 0
// 不升级仓库
pod update --verbose --no-repo-update
pod install --verbose --no-repo-update
// 删除多余的模拟器
/Library/Developer/CoreSimulator/Profiles/Runtimes

Git 取消追踪UserInterfaceState.xcuserstate

cd /Users/lixiang/工作/FarmerSeller/

git rm --cached FarmerSeller.xcodeproj/project.xcworkspace/xcuserdata/lixiang.xcuserdatad/UserInterfaceState.xcuserstate

git rm --cached FarmerSeller.xcodeproj/xcuserdata/lixiang.xcuserdatad/UserInterfaceState.xcuserstate

git rm --cached FarmerSeller.xcworkspace/xcuserdata/lixiang.xcuserdatad/UserInterfaceState.xcuserstate

swift学习笔记

1.为你的下一代iOS应用开发做准备
2.1 使用Xcode6
2.2 常量和变量
2.3 布尔类型及If语句
2.4 元祖 Tuples
2.5 可选型 Optional
3.1 基础运算符
3.2 区间运算符和for-in循环
3.3 逻辑运算符
4.1 string与character
4.2 String的基础操作
4.3 String引发的一些高级话题
5.1 数组的初始化
5.2 数组的基本操作
5.3 字典的初始化
5.4 字典的基本操作
5.5 数组与字典的可变性
5.6 iOS应用中的字典和数组
6.1 循环结构
6.2 选择结构
6.3 switch语句的高级用法
6.4 控制转移和二位数组

玩儿转swift3新特性

1.1 欢迎来到swift3的世界
2.1 弃用++和–
2.3 元祖的变化
2.4 #selector
3.1 API命名原则
3.2 使用swift3创建自己的函数
3.3 表意更清晰的函数类型
3.4 动词和名词:enumerate,sort
3.5 枚举类型的变化
3.6 where的变化
3.7 摒弃C风格的函数
4.1 Never类型
4.2 隐式可选型的类型推测
4.3 #keyPath
4.4 新的索引的使用
4.5 FloatingPoint
5.1 @autoclosure
5.2 结语

使用全局手势返回,解决返回手势与控制器切换手势的冲突

袁峥老师的YZDisplayViewController“快速集成App中顶部标题滚动条”,可以快速简单地实现类似今日头条的手势左右切换控制器的效果。

但这种左右切换的手势与UINavigationController自带的返回手势冲突,为了解决这个冲突,我引入了FDFullscreenPopGesture这个拓展。

引入后,基本上无需其他操作,就可以使所有的控制器支持全屏幕手势返回,实现新浪微博客户端一样的效果。

不过要解决与YZDisplayViewController的冲突,还需要新建一个UICollectionView的子类,并重写这个子类的方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    if (self.contentOffset.x <= 0) {
        if ([otherGestureRecognizer.delegate isKindOfClass:NSClassFromString(@"_FDFullscreenPopGestureRecognizerDelegate")]) {
            return YES;
        }
    }
    return NO;
}

使用RETrimControl+AudioTrim进行音频裁剪

使用RETrimControl可以轻易地实现一个音频剪辑的界面,而且支持自定义界面外观。

但想要真正实现音频分割的功能,还需要使用AudioTrim,代码如下:

Demo下载:https://github.com/lx271896700/audioTrim

// 音频剪切

  • (void)trimTheMusic {

CMTime startTime = CMTimeMake(20, 1);

CMTime stopTime = CMTimeMake(30, 1);

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);

NSString *libraryCachesDirectory = [paths objectAtIndex:0];

NSString *targetPath = [libraryCachesDirectory stringByAppendingPathComponent:@"output.m4a"];

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"kaibulekou" ofType:@"mp3"];

AudioTrim *audioTrim = [[AudioTrim alloc] init];

[audioTrim trimAudio:filePath toFilePath:targetPath startTime:startTime stopTime:stopTime];

}

// 播放原始音乐

  • (void)playTheOriginalMusic {

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"kaibulekou" ofType:@"mp3"];

self.player = [[AVPlayer alloc]initWithURL:[NSURL fileURLWithPath:filePath]];

[self.player play];

}

//播放裁剪后的音乐

  • (void)playTheNewMusic {

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);

NSString *libraryCachesDirectory = [paths objectAtIndex:0];

NSString *targetPath = [libraryCachesDirectory stringByAppendingPathComponent:@"output.m4a"];

NSLog(@"%@",targetPath);

self.player = [[AVPlayer alloc]initWithURL:[NSURL fileURLWithPath:targetPath]];

[self.player play];

}

2016年iOS技术圈回顾

2016年同2015年一样,在我还没有做好心理准备的时候,一晃神就到了年底。年关将近,不知诸君心情如何,年初的规划实现了多少,来年的计划又是否已有了眉目。年过三十的Peak君感觉年关是越来越难过了,越喧嚣的时候越想静处,感慨越多能说出口的反而越少。

近来有读者问Peak君为何最近这么多产,原因无他,仅为缓解年关将近的焦虑感。今年要说有什么收获,该算发现坚持写字所带来的好处。最近感觉尤其明显,只有沉浸在技术的纹理脉络之中时,才能像老僧坐定一样心无所想。看着博客和公众号里40多篇技术文章时,总算能略有慰藉,告诉年初的自己今年不算完全荒废了。

闲话不提了,今天Peak君和大家一起盘点下2016年iOS技术圈发生的一些大大小小的事,不求全面深入,但做记录之用。

创业公司入冬

过去一年,应该不少人都感觉到了,对于创业公司来说,Winter has come。投资人缩紧口袋,用户选择App更加理性,大大小小的细分市场被洗牌定格,对于每个创业团队来说,2016年必定是艰难的一年,熬过去了或许是光明,又或许是更为艰难的2017年。

更艰难的是,被大局影响的无数微小的个体,被创业大潮卷进之后,这个行业的起落兴衰必将和我们的生活息息相关。

今年10月份,春雨医生创始人张锐,猝死在公司IPO的前夕,张锐妻子在头七发表的一篇悼文《一个人,和他的爱》在朋友圈让数十万人唏嘘落泪。创业从来不是件简单的事,总会在潜移默化之间占去我们更多的时间和精力,甚至是健康,让我们无暇顾及和思考自己的生活该是什么样子,或许这件事能提醒我们更多的去关注自己的身体,更加去关心身边重要的人。我已经记不得今年有多少次,老妈打电话过来,问我为什么这么久没打电话回家时,我无奈的回说工作太忙了。

对于在职的同学来说,最冷酷的消息莫过于裁员或者公司倒闭了。今年一年的大小公司裁员事件太多了,多到让人怀疑这个行业是否还有前景。过去几年布局七大生态的乐视,今年遭遇了前所未有的危机和质疑,乐视的影子之下是更多开发者所处的团队被解散,微博和公众号里弥漫着裁员的阴影,提醒暂时还安全的我们居安思危,时刻提升自己的专业价值,在不得不面临选择的时候,至少有爬出谷底的底气和实力。

对于刚毕业或者打算跳槽的朋友来说,最直观的感受莫过于”面试变难了“。更准确的说法应该是:面试去掉了浮躁,还原了本味。市场更理性的结果必然是公司对于人才的选择也更加理性,会做UI,有过App上架经验就能找到工作时间窗口已经过去了。对于计算机基础知识的掌握,学习能力的强弱,扎实过硬的开发经历开始从面试流程中凸显出来。这对过于关注面试技巧,刷面试题的朋友来说,长远来看也是件好事,毕竟职业生涯的提升容不得半点浮躁。

好消息是,整个行业还是处于前进的态势,大大小小的公司对于人才的选择还是理性和公正的。对于静心专研技术,硬实力扎实的同学来说,行业还是处于求贤若渴的状态,所以面对这些扑面而来的行业信息,我们要做的只有两件事:一是锻炼身体,二是静下心来学习。

WWDC2016

WWDC 2016最受关注的要数iOS 10了。每年iOS新版本发布,Apple都会向开发者开放一些新的接口,这些新的接入点往往意味着新的机会。

iMessenger脱胎换骨,不知道大家有没有把玩过iOS 10中的iMessenger,其华丽程度堪称惊艳,从中不难看出Apple对于IM这一块的重视和野心。其内置的App Store允许开发者开发专属iMessenger的App或者表情包,一些敏锐的开发者已经开始试水了,长远来看,这其间蕴含的机遇也不容小觑。

App Extension进一步丰富,Extension都是基于系统原生App的功能拓展,意味着Extension具备天然的用户基础,每一个Extension Point都隐藏着很多的可能性,全凭开发者的想象力去挖掘。Apple开放Extension的脚步虽然缓慢,却是稳步向前,新接口等同于新机会,值得所有开发者关注。我在今年也开源了一款Xcode插件(基于Xcode Source Editor Extension),名为EasyCode,旨在加快代码编写速度,现阶段由于Apple开放的接口实在太少,功能还比较受限,不过不急,先占个坑,且行且珍惜。

CallKit,这个Framework允许VOIP类应用集成系统电话的壳,我司App也做了相应的适配,有VOIP产品功能的同学们可以重点关注下。

SiriKit,从iOS 10开始,开发者已经可以开始集成Siri了,也是通过Extension的方式来集成,可以通过语音来控制App的部分行为,不过当前支持的App类型还比较有限。

Swift 3正式发布,Swift进入公众视野已有一段时间,开发者社区的接纳度非常好,就我所接触的团队来说,已有不少在新产品中全面转向Swift的了。对于Objective C阵营的开发者来说,学习Swift已经是刻不容缓的事情了,对于新入行iOS犹豫在Objective C和Swift之间学哪个的同学来说,答案是两个都学。

Swift还处于新生期,这门集众家所长语言所包含的潜力还远没有被挖掘干净,业界的最佳实践还需要大量的产品来锤炼,响应式,函数式,面向协议等等都是大话题。还没看过喵神最近关于面向协议编程文章的同学,可以去仔细阅读感受下面向协议对于现有OOP方式的改变,这种思想层面的颠覆正是Swift的魅力所在。使用Swift的问题也还很多,Xcode崩溃,语法高亮消失,编译慢等等,你可以看到很多开发者吐槽用Swift写代码,但没有人转身离开。

watchOS和tvOS更新,一个代表未来穿戴式设备,一个是客厅的争夺战,二者都是未来的方向。现阶段身边使用iWatch的朋友还比较少,iWatch更像个新潮的玩具。Apple TV家里倒是有个,不过由于大部分电视台被墙,一般用来做AirPlay。现阶段这两款产品虽然没有大红大紫,但其前景却值得开发者长期关注。

其他还有一些就不一一赘述了。

微信小程序

微信小程序已经开始邀请内测了,小程序引起的动静可不小,看看铺天盖地的吐槽文,培训班,文章分享就能感受到声势之大了。纵观微信整个产品的发展史,懂得节制的微信的每一步都细小谨慎,所以小程序必然也是小步前进的节奏,对于我们iOS开发者来说,不用着急恶补新技能,看准时机再找切入点,这会是一场持久战。

至于小程序需要学习微信自研框架这一点,个人觉得这完全不值一提,相较于微信庞大的用户流量,这么点学习成本的投入微不足道,而且善于学习新事物本来就是我们开发者引以为豪的本领之一。

Macbook Pro 2016

MBP终于在2016年迎来了新款,我知道很多朋友都表达了自己的失望,表示不会购买。但我在摸到真机(深灰版)的那一刻还是被感动到了,整体工艺更加浑然一体,美感和科技感指数爆表。Apple家的产品,贵是贵,但很少有买了后悔的。

我眼中的Apple,早已不是当初二八年华的少女,一日一变,时有惊喜,如今的苹果更像内敛沉稳,娴静脱俗的大家闺秀,它的美需要长时间的相处和细细品味。Apple家的产品我还是会长期购入,但我已没了熬夜看新品发布的劲头,不会尝鲜去当小白鼠测验各种beta版,现阶段踩的坑一定多于带来的惊喜,第一时间升级新版Mac OS,iOS,Xcode的同学一定明白我在说什么。

Touch Bar或许也隐含着一些小机会,交互体验上可能会有一些创新,不是说打麻将。

丁香园CTO离职事件

今年5月份,丁香园CTO,小道消息作者Fenny从丁香园出走。这一事件当时吵得沸沸扬扬,最后收尾的热点话题是CTO该不该写代码,但Peak君觉得,比这更重要的是加入创业团队的每一位,权益如何得以保证。

创业是一件高风险伴随高收益的事,我们在加入创业团队的那一刻就已经承受了高风险,如果原本几率就小的高收益还无法得以保障,加入创业大军的初衷就成了伪命题,这才是可耻的。

这一事件在我看来还会长期发酵,对创业团队成员之间的信任问题产生深远的影响,作为技术从业者的我们,写代码反而简单,要看清厚厚一叠期权协议里的条条款款才是件难事,技术群体向来不擅长发声,习惯隐忍和承受,只在忍无可忍的最后才以离开来表达愤怒。从这一点出发,我衷心希望Fenny在这场官司中能争取到一个好的结果,这个结果能使更多平凡普通的创业者收益。

技术分享新方式

今年让我比较感兴趣的是,出现了技术分享的新形式,代表有视频直播,知乎Live,知识问答。

参加过几场类似现场敲代码的视频直播,整个流程体验虽然还略显稚嫩,但气氛很活跃,感兴趣参与的人也有不少,这些一两块钱买不了吃亏的现场直播,让知识的传递也更直接高效。

知乎Live和知识问答里,软技能分享更多一些,这对鸡汤从业者是个大利好,不过鸡汤都带有略微毒性,会让人产生硬技能得到提升的错觉,真相是,硬技能提升之路没有捷径。

这些新形式都透露着一个信息:知识可以被实实在在的定价了。这对于我们技术从业者绝对是个好消息,被误认为吃青春饭的码农们,除了提前财务自由退休,大公司养老,教育培训等出路之外,又有了新的选择,靠出卖自己长年累月积累的知识来获得收益,你行你就能上,这些新渠道连接着巨大的新机遇,值得每一个技术人员去关注。

看看营销大师李笑来两个月6w的全栈工程师培训课程就知道了,在我们这些老程序员眼里看来滑稽可笑的事情,确确实实的发生了。

双十一以及weex

weex刚诞生的时候,曾在阿里待过的Peak君也以为这会是个无疾而终的KPI项目,现在呢,脸上火辣辣的。今年双十一阿里在自家两大端手淘和天猫上,大规模应用了weex来搭建页面,页面覆盖率达99.6%,这已经不是试水了,开源框架能在这种量级的产品上实践,是比任何公关都更强有力的宣示。详细情况可以查阅公众号:手机淘宝技术团队MIT。

据闻现在实践weex的开发团队也不少,对于寻求快速迭代和发布的开发团队来说,weex已经是一个切实可行的方案了。

对于我们iOS Native开发者来说,这种跨端方案听起来多少有些被入侵的感觉,实则不然,跨领域的交流所带来的思想碰撞,能让我们站在新的角度审视自我,带来新的可能,反而能让我们收益。而且开发者没必要自我设限,weex大家都能学都能用呀,所谓君子不器。

IPv6

自今年6月1日起,所有新提交的App都需要支持纯IPv6的网络环境,否则无法过审。

这事再次体现了Apple作为国际大厂的担当,虽然大部分开发者都不需要做什么适配,但一些手写IP,调用底层API的小伙伴们还是踩坑了,比如我。Apple每次推进新技术,都是开发者跟着升级技术储备的机会,不知道大家这次有没有彻底搞明白NAT64,DNS64,IPv6相关的网络知识。相关资料可以参考微信团队分享的两篇文章,我也分享过一篇踩坑经历,里面有微信团队文章的链接,供大家参考:纯IPv6环境App适配的坑

HTTPS

早些年,还能时不时听到关于Apple封闭生态圈的吐槽,到今天Apple以其刚硬的产品质量和大厂品格赢得了市场和用户的尊重。

Apple对于新技术的推进向来积极,甚至略带‘激进’的味道,还没普及的IPv6,悄然替换的HTTP2.0,以及2017年审核必备的HTTPS,都旗帜鲜明的体现了Apple对于新技术推进的姿态,虽然给开发者带来了多多少少的麻烦和不确定性,但肉体抗拒的我,在心底里还是钦佩的。

HTTPS对于互联网安全的重要性,到今天还是被严重低估的。一些带有侥幸心理的开发团队或许会认为,有些产品信息本身并不重要,即使被窃听也不会带来多少影响,这是典型的不摔跤不感到疼的心理。所有用户的数据都是重要的,用户购买过的商品,浏览过的文章,发表过的评论,去过的地方,每天行走的步数等等,都可以通过大样本数据分析,发掘出更深层次的信息和隐私,HTTPS应该成为一种本能习惯。

关于HTTPS的部署和实践,已有不少优质文章分享了。Peak君还想一提的是,HTTPS也无法保证绝对的安全,有些细节还需要深入探究。比如如何避免中间人攻击,replay attack等。据说现在有些机构在私底下偷偷记录互联网的流量,等有朝一日RSA或者ECC等算法被破解,那些看似安全的HTTPS流量或许都会被剥开展现,小则是个人隐私泄露,大则是一时动荡的社会事件了,这也是为什么HTTPS实践中会启用forward secrecy了。

总而言之,言而总之,拥抱HTTPS,就现在,同时持续深入补充安全方面的知识。

支付宝的社交战

今年春节的微信支付宝大战还没开场,支付宝就火急火燎的上演了一出校园生活圈的低俗戏码,这次的社交战在赚足了眼球之后,以公众的骂声,高层的道歉匆匆收尾。一出闹剧背后是移动互联网竞争对手之间不见兵刃的残酷厮杀,微信携泰山之势进军支付领域对支付宝造成的压力可想而知,这个行业的变化和颠覆之快实在超乎想象。

与此同时,支付宝一个名为蚂蚁森林的社交功能,开始在身边悄然弥漫开来。同事,朋友,电梯里的陌生人,身边有越来越多的人在收集这个所谓的绿色能量,在支付App里玩社交功能,使用社交App来支付商品,这种微妙的违和感,正是这个行业的魅力所在啊。

很多人认为支付宝的社交梦没戏,但这个行业没有不可能。我所期待的是,支付宝能光明敞亮的做产品来赢得市场,赢得用户打心底里的尊重。

Pin

今年年底的时候,iOS圈还发生了一件事,个人开发者钟颖Cyan的产品Pin,入围了App Store 2016年「年度十佳 App」。我也是Pin的用户,初次使用时被作者的执着和用心打动,一个个看似非大众的功能点都被深入挖掘和打磨。Peak君很能明白这种荣誉所带来的喜悦,也知道这其中所隐含的坚持和付出。

2011年Peak君还一腔热血的时候,也曾和朋友合作开发过一款iOS端的播放器App,还起了个热血的名字:RushPlayer。成绩最好的时候,做冰点活动(2.99降价为0.99)冲到过App Store收费下载总榜第3位,总收入排行榜第9位,那一刻的喜悦感现在都还记忆尤新。高名次排行,真金白银的收入,一些媒体的转载,都让无数奋战到凌晨2点的夜晚不值一晒。对于现在安分守己创业的自己来说,真是久远的回忆了。

Pin入榜对Peak君也是一种激励,或许来年也能沉下心,细心去雕琢一款个人App,也好在年底时给年初的自己一个交代,不至于靠写技术文章来缓解焦虑。

结束语

好啦,祥林嫂似的啰嗦了一大堆,不知道耐心看完的朋友有多少。2017新的一年里,Peak君也要打起精神好好干,要有更高质量的文章产出,要在2017年底前储备实实在在的成果,也祝各位能在技术硬实力上取得突破,最后感谢各位新老订阅读者的陪伴,以文会友,妙事一件。