1. Xcode6中批量添加矢量图

    1. Xcode6添加矢量图的问题

    Xcode6中支持添加矢量图,然后在编译期Xcode6自动生成@2x和@3x的图片,可是添加的过程有些繁琐。
    首先,直接把矢量图拖到 xcassets文件中是不行的,添加的步骤:

    1. xcassetsNew Image Set
    2. 选中生成的asset,在右侧的 Image Set中将属性修改为 Vectors
    3. 将矢量图拖进来,再修改asset文件名称

    由此可见,需要批量添加矢量图的时候,会非常繁琐。

    2. 解决之道

    每一个图片都对应一个带后缀 imageset的文件夹,内有 Contents.json文件,对于普通的png而言,它的内容一般是:

    {
      "images" : [
        {
          "idiom" : "universal",
          "scale" : "1x",
          "filename" : "ButtonFillBlue.png"
        },
        {
          "idiom" : "universal ...
    Tagged as : iOS
  2. Optional of swift

    Intro

    This is a category of study&&notes of swift, program and so on during the study of [Developing iOS8 Apps with Swift] on the iTunes U.
    此系列为学习stanford课程:Developing iOS8 Apps with Swift过程中,对语言,程序设计,编程能力等部分的学习和记录。

    Optional

    The simple way to declare a optional value:

    var testString: String?
    

    It means ...

    Tagged as : swift iOS
  3. Compare of Testflight&&Enterprise Distribution

    前言

    应要求整理的分发方式比较。可惜了有enterprise的我们,还是没有充分利用enterprise的特点。
    下面从是否需要review,UDID以及下载方式进行比较,最后简单介绍利用dropbox进行wireless下载in-house app的过程。

    1 Compare

    First of all, a simple comparing of Tesftflight and Enterprise distribution is listed below.

    Type TestFlight Enterprise
    Review by Apple Required NO
    Device UDID Required NO
    Download TestFlight iOS App(iOS8) Custom Server

    2 Testflight distribution

    2.1 Review

    It ...

    Tagged as : iOS distribution
  4. 个人App发布前的测试

    前言

    假期里原本想好好的放松,多看几本书,多运动,不曾想一半的时间花费在修改bug上了。算上假期前提交的版本,整个春节期间发布了3个小版本的更新,申请了2次紧急提交审核。其中经历不可谓不惊心动魄,虽然未必对下载量有所帮助,但至少也让用户感觉到:这大过年的也在更新,也是蛮拼的了:-)。

    测试流程

    言归正传,春节期间提交的紧急修复起因都是程序出了严重的bug,而且都是在修复某个bug的过程中引入的bug。这说明即使是个人开发者,对于提交前的测试流程必须要重视。不管是养成一个好习惯,或者是开发出较高质量的程序,完备的测试是不可或缺的。下面结合自身的情况,把相应的测试守则完备下,督促自己执行。

    功能设计和实现阶段

    在分解App的功能的设计阶段,或者在实现功能的阶段,根据功能点,撰写相应的测试内容。具体来说就是针对每一个功能点,设计测试步骤;功能复杂的时候测试步骤也要细化。这里尤其要注意的是务必覆盖所有的功能点。此外,针对边界情况的测试,基本也包含在此阶段。

    模块化集成阶段

    当完成几个模块后,可以着手集成测试,这个阶段主要侧重运行时模块之间的运行情况。有时候单独的功能使用没有任何问题,但是当和其他模块功能一起使用的过程中,会发生问题。

    测试环境

    发布前的App必须完整经历Ad hoc版本的测试,因为developer模式下有些bug不会产生。这一点,相信很多人都深有体会 ...

    Tagged as : iOS 测试
  5. 过去一周的思考

    简介

    过去的一周可以算是波澜起伏,主要关于两方面:一个是app的下载,另一个是app的发布。

    app的下载

    ASO是一个至今不得窥其入门的东西,某个收费的app自上线至今约3个月的时间保持平均每天3个的下载节奏。期间在app中集成的分享平台中发过带app的tag的链接(主要是国外的分享平台),这种方式可以引起用户的注意,可以算是营销的一种方式。只是一个人势单力薄,无法做到每天的更新。这种方式和app的下载互为因果,因为很难单纯的通过这种方式提高下载量,相反这种推广的效果还取决于app的下载基数。因此,我认为这属于“锦上添花”增加用户基数型的营销模式。
    虽然推广没有花费大力气,但是本周还是发生了下载量突变的情形。5-10日之间下载量分别是个位数,2位数,3位数,3位数,2位数,个位数。至此,恢复以往的平静。在此期间,做到分类付费和畅销排名前三。虽然之前也油锅这样的经历,但这次的app是收费的,意义不同寻常。此外,这样的一个过山车的表现也很让我诧异。是什么导致下载量突然的上升呢?我搜索了一下相关的分享平台,没有大量的使用app的痕迹。通过Appannie的变化追踪来看,我倾向于Apple调整了app的排名算法(如果这些下载量不是黑卡造成的话)。线索就在于5日以及之前的排名已经落后到不知什么地步,而后突然就排名上升。考虑到下载量在相应的category中中规中矩,评价几乎没有的情况,才做出算法调整的判断。
    这个 ...

    Tagged as : iOS
  6. Xcode6制作iOS Framework

    简介

    最近需要用到Framework,在Xcode6上实践了一下,虽然制作原理没有变化,但在Xcode6中操作还是有一些不一样。我遇到的问题在raywenderlich上都有解决。
    使用过第三方如统计之类工具的,对framework不会陌生。所以framework最大的一个好处就是提供接口但隐藏代码,在开发SDK过程中经常使用。

    静态库模板

    选择如下的静态模板创建工程,当然也可以在已有工程下创建新的target。这里可以看到Xcode6中新加了Cocoa Touch Framework,但是这里我们还是选择静态库模板。
    static_template

    添加文件

    Framework本身包含库头文件和静态库,所以首先我们要把需要打包成framework的文件添加的工程,注意添加的时候确认target对象是否正确。接下来,查看文件引用了哪些系统库,在build phase->Link Binary With Libraries中将系统库添加进去,通常会添加Foundation或是UIKit库。然后添加相应的代码,添加的时候注意target是库对象。再在build phase->Headers中找到头文件,将需要设置为public的文件拖到Public一榄。 这时build一下,可以发现已经生成一个.a文件了。但此时还没有完成framework的制作: 1 ...

    Tagged as : iOS framework
  7. [Tips]NSTimer对Target的强引用

    NSTimer对Target的强引用

    这是一个老坑,虽然app发生错误后经过一些调试很快定位到NSTimer,还是觉得有必要记录下。

    + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo
    

    其中,API文档中清楚地解释到:

    The object to which to send the message specified by aSelector when the timer fires. The timer maintains a strong reference to target until it (the timer) is ...

    Tagged as : objc iOS
  8. VOIP:pjsip的编译和使用

    1pjsip简介

    pjsip是免费开源的多媒体通信库,纯c编写,可移植性非常好,支持多种协议,多种编/解码方式。对iOS的后台支持的很好(按文档的所说),v2.3已经支持iOS上的视频传输。鉴于此,pjsip是实现VOIP比较好的选择。

    2pjsip编译

    可移植性(portable)是pjsip宣称的一大特性。在iOS上的使用方法,有详细的使用手册,这里会简单的记录下需要注意的地方。

    2.1 准备

    编译首先需要有源码,请到这里查看。对于想直接使用pjsip的建议直接下载release的稳定版本,win系统请下zip格式,其余的请下tar格式。
    源码下载好后,进入其中的./pjlib/include/pj/,创建文件config_site.h, 内容如下:

    #define PJ_CONFIG_IPHONE 1
    #include <pj/config_site_sample.h ...
    Tagged as : iOS pjsip
  9. MVVM模式初探

    Author: Charles Zhu
    Summary: 设计模式

    MVC的无奈

    MVC结构是学习iOS开发的人最先学习的一种开发模式,apple提倡以MVC为中心的开发模式。因为它很好的解构了应用场景中相关而又各自独立的部分:视图,视图控制器和数据模型。在MVC的世界里,控制器负责将模型中的数据以内容的形式展现到视图中,同时也把视图上产生的数据变化传递给模型从而将这种变化持久化。于是,在稍微复杂的app中,控制器中的内容会很庞大:网络操作,数据存储,手势响应等等。几乎可以确定,如果app需要添加新功能,超过一半的新增代码是添加在控制器中,这样不可避免的造成控制器的冗余以及大段无法重用的重复代码。
    在开始MVVM时,我们可以稍稍考虑下现有MVC的问题。

    视图

    毋庸置疑,视图的作用很重要,但在设计中,视图是否需要和控制器,数据模型同等的地位呢?要知道绝大多数情况下,视图是不会重用的,往往“耦合”在视图控制器中,所以往往代码中有几个view controller,就能知道程序会有几个页面。此外,视图中的UI元素也是直接作为变量存在在控制器代码中,因为只有这样才方便刷新。很显然,视图控制器就可以代表视图本身。

    控制器

    控制器需要把模型代表的数据以合适的形式显示在视图上,这样免不了需要处理(当然也有不需要处理的简单情况 ...

    Tagged as : iOS mvvm mvc pattern

Page 2 / 3