0%

由于项目的正式网络环境的 host 是走域名,能支持 https ,测试网络环境的 host 是走 IP ,无法支持 https ,导致在做 ATS 支持的时候,遇到一个问题:在 debug 过程需要切换网络环境的时候,也需要手动去开启或者关闭 ATS 。为了节省这些时间,写了一个脚本去解决这个问题,让 ATS 根据网络环境的值自动去开启或者关闭。下面将会列出具体步骤。

Read more »

在为『掌拍』iOS 客户端设计数据库的时候,大幅度使用了 CoreData 中的『Entity Inheritance』这个特性,由此很好地解决了多个实体有共同 property 的问题,而特别借助实体类化(由实体生成对应的类)后的动态性,解决了数据动态传递的问题。这之后,对『Entity Inheritance』算是有了经验,但是还没有归纳总结,现在总结如下:

Read more »

从2013.6月中旬到2013.12月,连续参与设计和开发了两个产品(一个是掌拍,另一个是网球圈),并独立完成了这两个产品的 iOS 客户端开发,期间可谓获益良多,一番反省总结归纳,得益主要在『沟通』『产品设计』『技术』这三方面。

沟通

如何才能有效地沟通呢?

  1. 就事论事,理性讨论,拒绝个人情绪,特别是不良情绪。

  2. 以『发现问题,解决问题』为沟通目的。

  3. 坚决把讨论的问题限定在指定范围内,拒绝越界、跑题!

  4. 准备充分,准备好:『问题』、『论据』、『解决方案』(至少得清楚自己想讨论的是什么问题)。

以上就是我在参与第一个产品开发时,和负责人『吵架』n 次,失败 n 次后得到的经验和教训。此人是搞营销运维的,口头能力甚强,好几次和他讨论问题的时候,就被他用『偷换概念』+『跑题』这两招击败o(╯□╰)o;然后有几次是被他的市场经验打败(这招『扬长避短』甚是好用的,→_→)。。。

而最重要的教训就是发现一旦带着个人情绪进行讨论的时候,很容易擦枪走火,问题不但没解决,还让彼此都不爽。影响工作~~囧rz

产品设计

产品设计方面的感悟主要是:

  1. 从『问题』本身出发(由于想解决一个这么样的问题,所以才做了这么样的一个产品)。

  2. 做你需要的而不是做你想要的(focus on what you need rather than what you want)。

  3. 为产品设计一套完整的(最好是完善甚至是完美的)『游戏规则』。如果规则模糊不清晰,一来会导致业务流程上产生 bug,二来不利于开发人员的开发。

    PS:但是规则对用户而言应该是是友善的、简单可行的。

  4. 先确定业务,再确定功能,继而确定界面,最后根据业务、功能、界面UI等需求确定技术方案。

  5. 『和谐』。产品(主要指客户端)应该有统一的风格,一是 UI 的风格一致,如 颜色、色调、背景图、指示器、文字字体等各种元素应该有一致的风格;二是交互方式的风格一致,如统一使用一种方式(点击或者滑动)来切换视图,各种交互语言(UI 中的文本语言以及提示用户操作、网络超时、任务失败等各种提示语)的风格要一致。

  6. 『理所当然』。让用户使用你的产品的时候会觉得『理所当然,就该如此』,像在网速快的时候,一些交互操作应该可以考虑不提示用户交互的进度吧?

Read more »

我的编译环境:

Mac OS X 10.9 + Command Line Tools(XCode 4.6.3)

编译步骤:

一、安装依赖工具

  1. 安装 git、svn(不过,一般Xcode自带安装好了)

  2. 安装depot_tools

    a. 在指定目录下执行(我选择在 /Developer ):

    1
    svn co http://src.chromium.org/svn/trunk/tools/depot_tools

    b. 把depot_tools 添加到 PATH(环境变量)中:

    1
    sudo vim /private/etc/paths

    然后往打开的文件添加 depot_tools 的路径(我添加的是:`/Developer/depot_tools )

二、下载源代码以及生成项目文件

1.下载源代码

1
2
3
4
mkdir webrtc_src
cd webrtc_src
gclient config http://webrtc.googlecode.com/svn/trunk
giclaient sync —force //如果中途中断了,再次执行该命令

2.生成 iOS 项目文件

1
2
3
cd trunk
export GYP_GENERATORS="xcode" //设置环境配置
./build/gyp_chromium --depth=. -DOS=ios -Dtarget_arch=arm -Dinclude_tests=0 -Denable_protobuf=0 all.gyp

(其它生成例子:./build/gyp_chromium --depth=. -DOS=ios -Dtarget_arch=arm -Dinclude_tests=0 -Denable_protobuf=0 -Denable_video=1 webrtc/webrtc.gyp

Read more »

在比较之前,你应该了解以下知识:

  1. Objcetive-C的函数调用机制
  2. Objective-C的对象模型
  3. Objective-C的动态特性

在阅读完毕,了解知道Objective-C 中的 Message、Object、Class、MetaClass、Method(SEL-IMP) 的重要概念后,现在开始比较!

下面是来自 WIKI 的对 static method 的定义

Static methods neither require an instance of the class nor can they implicitly access the data (or this, self, Me, etc.) of such an instance. A static method is distinguished in some programming languages with the static keyword placed somewhere in the method’s signature.

In statically typed languages such as Java, static methods are called “static” because they are resolved statically (i.e. at compile time) based on the class they are called on and not dynamically as in the case with instance methods which are resolved polymorphically based on the runtime type of the object. Therefore, static methods cannot be overridden.

从定义可以看出,Objective-C 的 class method 根本不是 static method,而实际上,Objective-C 也不存在 static method!(尽管 class method 因为用法而看似 static method,但它们是有本质的差别的。)

那么它们的区别是?(出于好奇心,我们假设下 Objective-C 中有 static method → →)

Read more »