一、背景:(知乎、BugTags)
1、知乎iOS APP上有个功能,摇一摇反馈。觉得挺好用,自己想实现一个开源的。
(PS:其实知乎用的也是第三方的:Powered by instuBug)
知乎,摇一摇截图-1 知乎,摇一摇截图-2 知乎,摇一摇截图-32、网上有个第三方的:BugTags,不过BugTags是一整套:【客户端+服务器端】,使用他们的这个东西,数据是要上传到他们的服务器的。
另外BugTags还有一些缺陷。那就是该反馈功能——如果你是使用的他们的免费版的,功能会有时抽筋——其效果和你在本地代码中设置的不一样——向他们公司的客服询问过,因为其中的几个功能可以在服务器端配置,所以该系统每次随App使用时,都会向服务器请求配置数据,如果网络环境不好或者他们的免费版所在的服务器负载过重的时候,数据不能及时返回,你的本地配置就会抽筋。另外他们的免费版会限制很多功能,某些功能收费还不低。
BugTags-1 BugTags-2 BugTags-3 BugTags-4二、开发步骤:
1、产品需求:
a、基本需求:实现摇一摇截图功能;
b、扩展功能:
i、 对截图进行编辑、上传(服务器、邮箱、储存到本地)。
ii、用户可以自定义界面、自定义上传设置(上传到哪里:服务器?邮箱?还是储存到 本地。)。
2、功能分类:
3、开发步骤:
4、技术解析:
1、核心、精确捕捉到摇一摇事件。捕捉到事件后给出回调:回调方式:block、delegate、NotificationCenter。
2、在摇一摇事件回调中实现下一步操作,这一步操作和上一步和可以分离:低耦合。
3、不能冲突,原有的某个viewController中有特色的摇一摇功能(事件传递路径问题)。
4、全局响应。
5、摇一摇回调——到——截图成功回调——需要登录吗——编辑——反馈——上传。
5、扩展迭代:
1、response类的分层——几个地方都有的。
技术方案:选择及依据——这里你会看到,一个小小的需求能影响到整个技术方案的选型。如果已经做好的东西确实不能满足某个方案,那么只能把该方案全部推翻重做,其工作量是可想而知的。(关键因素:不能冲突,原有的某个viewController中有特色的摇一摇功能(事件传递路径问题));runtime检测当前类中是否有motionBegan等函数,或者event事件传递的hittest。自动检测,或是将要排除的类添加到数组中去。设置开关是否检测。
有关响应者链:(你可以网上搜索,很多例子的,但是自己要甄别)
http://www.jianshu.com/p/2e074db792ba
http://www.cocoachina.com/ios/20160113/14896.html
http://www.cocoachina.com/ios/20160108/14897.html
http://blog.csdn.net/st646889325/article/details/53167715?ref=myread
与此有关的Apple官方文档(UIResponder):
https://developer.apple.com/documentation/uikit/uiresponder?language=objc
运动事件(这里主要关注Shake事件)
CMMotionManager(使用物理硬件):
http://blog.csdn.net/ejialin/article/details/19511897
http://blog.csdn.net/Goods_boy/article/details/70240848
http://blog.csdn.net/SandyLoo/article/details/52692302
http://blog.csdn.net/sw_gegewu/article/details/51361915
MotionEvent(苹果封装好的运动事件):
http://blog.csdn.net/mazy_ma/article/details/51407191
http://blog.csdn.net/aaaa99996666/article/details/51459564
http://blog.csdn.net/haogaoming123/article/details/44856563
http://www.cnblogs.com/eagle927183/p/shakeandcutter.html
CMMotionManager(官方文档):
https://developer.apple.com/documentation/coremotion/cmmotionmanager?language=objc
Github上的资料:
https://github.com/hwzss/Shake_learn
+ (void)load函数相关:
http://www.jianshu.com/p/9368ce9bb8f9
http://www.cocoachina.com/ios/20161012/17732.html
http://liumh.com/2015/07/29/ios-load-and-initialize/#understand-load
目前的一个版本:
请看workplace中的工程shakeMotion。shakeMotion地址。
注意,这并不是一个简单的摇一摇,而是以此为入口,展开的一系列技术细节。
包括:窗口继承层次,Event响应链,controller栈的层次,runtime等等。
网友评论