创业团队 iOS 开发的小技巧

真的是好久好久没有发文章了,其实攒了不少篇草稿:深入浅出 AFNetworking、如何阅读 crash 文件、UIKit response chain 等等,但是基本上,还没放出来,国内外的大大们写了同样的内容,而且基本上我想表达的都说了,写得还比我写得好。

但作为一个有输出的男人,还是要写点什么的。但我能分享给大家的除了创业经验,作合伙人的经验,也就剩下这种提升单兵作战能力的,歪门邪道小技巧了。于是,这里就准备开坑写这个系列。不过我这里推荐的基本上都是国内服务,但是大可放心,我完全没有收任何好处费,大伙儿批判的看就好了

躲避敏感审核点——友盟在线参数

作为一个 iOS 开发,每个版本的 Boss 从来不是产品狗的各种奇怪的 feature,最可怕的莫过于以各种奇怪的被拒绝。常见的解决方式就是,给苹果看到的时候,是xx后的版本。过了审核之后,就把xx卸载了。

对于大团队来说,他们有足够的人力物力造轮子,这种刚需肯定是由自己服务器来控制的。但是对于像礼物说这种,仅仅只有四个人的开发团队(iOS / Android / 后端 / 前端),造轮子的时间是绝对没有的。友盟在线参数绝对是个非常好的选择。不过这个功能藏的比较深,不是特别好找。

其实,在线参数并不只是提交审核用。不知道大家有没有记得去年 iOS 7 越狱的事情,太极的商店被封在了官方越狱安装包里面。事情败露了之后,对方直接远程关掉了太极这个模块。这里就是用的同样的思路。

由于团队小,测试经常不充分,乌龙事件常有发生。再加上审核周期非常长,好不容易上线了发现在某个系统版本号或某个特殊的设备型号测试的时候遗漏了,有重大的 Bug…但是又不可能下架,申请加急又要等一两天。短短的两天可以毁掉运营团队的全部努力,五星应用瞬间变成三星半(别问我为啥这么懂??),这个时候通过在线参数远程关掉就好了。只要修改掉对应的更新文案,对于用户来说不会出现太大的问题。(当然这个月的绩效没了是肯定。

所以我们在开发的时候应该,把新增的模块都加上动态开关。但这里注意一个问题,友盟的刷新在线参数的 API 不是同步请求,如果要想做到拿到在线参数再进入应用,需要监听UMOnlineConfigDidFinishedNotification,以及千万不要在 appdelegate 里面等这个通知而阻塞主线程,乖乖写一个一模一样的 Splash页面,因为虽说看起来没啥问题,但是在某些系统上会出现 SpringBoard 崩溃的问题(也不要问我为什么这么懂)。

推广运营诊断异常的好帮手——Scheme

  • 情景一:作为一个创业公司出品的应用,经常会面临运营团队、推广团队、商务拓展团队(虽说是用了团队这个词,但其实??)做一些奇奇怪怪的需求,比如点击 Banner 要跳到一个奇怪的地方:有可能是一个 WebView;有可能是别人家的 app 页面;有可能是 AppStore 的下载链接;有可能是 App 内部的某个特殊页面等等。打开方式也多种多样,例如需要先登录再打开,可能需要 navigation push,可能需要 present。
  • 情景二:某个热心用户和你说她遇到了Bug,程序无法正常运转。虽说这个时候用 adhoc 的方式,可以诊断问题,但是也有可能重装了就好了,失去了重要的样本信息。这个时候要是有方式打开调试模式就好了,例如浮动显示一个 Log 窗口、会 alert error、远程打印 log 之类。
  • 情景三:app 内部的某个 html5 小游戏要和原生代码做交互之类。

这个时候,整个 UI 页面全都用 Uri 来驱动就方便啦。有点像 Android 的 Intent,我只关心 target 和 extra。而不是需要跳转的时候。先 new 一下,然后 set 一大堆 property,再 navigaitonControler push,耦合度也降低了很多。

对于情景一,情景三就不必说了。相信大伙儿肯定都懂得,不懂的可以参考一下 HHRouter 这个库,这里说一下情景二。

这个做法,第一次见是在 OmniFocus 的手机版上见到的:

1
2
3
4
在 iPhone 下打开以下链接可以把语言切换为英语:
x-omnifocus-debug:set-default:AppleLanguages:(en)
如果要还原成系统语言,在 iPhone 下打开以下链接:
x-omnifocus-debug:reset-default:AppleLanguages

摘录自这篇文章

于是,我们也可以通过这样的方法,开启 Debug 模式。例如发给用户一个 liwushuo:///debug_mode 之类的东西。

时间: 2024-10-02 03:13:43

创业团队 iOS 开发的小技巧的相关文章

iOS开发 偷懒小技巧---自定义XCode代码片段

有句话说的好,聪明的程序员懂得"偷懒"来提升开发效率.我们在日常开发中,有一些代码片段会经常利用到,大家可能会觉得定义一些宏可以解决问题,但是遇到比如,UITableView的协议方法,或者写Demo时候想要快速的定义一个UIButton(当然,你用storyboard除外)呢? 好吧,先来介绍下什么是代码片段? 我们在XCode中输入if,选择ifelse后回车,出现 这个就是系统给我们已经定义好的代码片段,能够快速的完成我们想要的代码片段,来大大的提升程序员的编程效率,我们所要做的

iOS开发之 小技巧

转自 http://www.cocoachina.com/ios/20141229/10783.html TableView不显示没内容的Cell怎么办? 类似这种,我不想让下面那些空的显示. 很简单. 1 self.tableView.tableFooterView = [[UIView alloc] init]; 试过的都说好. 加完这句之后就变成了这样. 自定义了leftBarbuttonItem左滑返回手势失效了怎么办? 1 2 3 4 5 6     self.navigationIt

【解决方法】【技术】22个iOS开发的小技巧

1. TableView不显示没内容的Cell怎么办? 类似于图1,我不想让下面的那些空显示.很简单,添加"self.tableView.tableFooterView = [[UIView alloc] init];"试过都说好,加完这句之后就变成了图2的样子. 2. 自定义了leftBarbuttonItem左滑返回手势失效了怎么办? [cpp] view plaincopy self.navigationItem.leftBarButtonItem = [[UIBarButton

iOS开发的小技巧

转自简书:http://www.jianshu.com/p/50b63a221f09  http://www.jianshu.com/p/08f194e9904c 原作者:叶孤城___ self.tableView.tableFooterView = [[UIView alloc] init];试过的都说好. 加完这句之后就变成了这样. 自定义了leftBarbuttonItem左滑返回手势失效了怎么办? self.navigationItem.leftBarButtonItem = [[UIB

iOS开发---冷门小技巧

1.iOS 7后隐藏UITextField的光标 通常我们用UIPickerView作为我们的UITextField的inputView时,我们是需要隐藏光标的.当然,如果想换个光标颜色,也是这么处理. 1 textFiled.tintColor = [UIColor clearColor]; 这么处理的有个遗留问题是:通常我们使用UIPickerView作为UITextField的inputView时, 并不希望去执行各种菜单操作(全选.复制.粘帖),但只是去设置UITextField的tin

iOS开发一些小技巧

1.隐藏多余的tableView的cell分割线 self.tableView.tableFooterView= [[UIViewalloc]init]; 2.取消系统自带的返回字样 [[UIBarButtonItemappearance]setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) forBarMetrics:UIBarMetricsDefault]; 3.滑动时隐藏navigation self.navigationCon

iOS开发:小技巧积累

1.获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(MyAppDelegate*)[[UIApplication sharedApplication] delegate] MyMethodOrMyVariable]; 2.获得程序的主Bundle: NSBundle *bundle = [NSBundle mainBundle]; Bundle可以理解成一种文件夹,其内容遵循特定的框架. Main Bundle一种主要用途是使用程序中的资源文件,如图片.声音.pls

iOS开发:小技巧积累2

http://blog.sina.com.cn/s/articlelist_1935098904_1_1.html .获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(MyAppDelegate*)[[UIApplication sharedApplication] delegate] MyMethodOrMyVariable]; 2.获得程序的主Bundle: NSBundle *bundle = [NSBundle mainBundle]; Bundle可以理解成

iOS开发之小技巧积累

1.获取全局的Delegate对象,这样我们可以调用这个对象里的方法和变量: [(MyAppDelegate*)[[UIApplication sharedApplication] delegate] MyMethodOrMyVariable]; 2.获得程序的主Bundle: NSBundle *bundle = [NSBundle mainBundle]; Bundle可以理解成一种文件夹,其内容遵循特定的框架. Main Bundle一种主要用途是使用程序中的资源文件,如图片.声音.pls