王中周的技术博客

Stay hungry,stay foolish.

WWDC2014之App Extensions学习笔记

wwdc_banner_promo

一、关于App Extensions

extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制。

extension的出现,为用户提供了在其它应用中使用我们应用提供的服务的便捷方式,比如用户可以在Todaywidgets中查看应用展示的简略信息,而不用再进到我们的应用中,这将是一种全新的用户体验;但是,extension的出现可能会减少用户启动应用的次数,同时还会增大开发者的工作量。

WWDC2014之iOS使用动态库

苹果的开放态度

WWDC2014上发布的Xcode6 beta版有了不少更新,其中令我惊讶的一个是苹果在iOS上开放了动态库,在Xcode6 Beta版的更新文档中是这样描述的:

Frameworks for iOS. iOS developers can now create dynamic frameworks. Frameworks are a collection of code and resources to encapsulate functionality that is valuable across multiple projects. Frameworks work perfectly with extensions, sharing logic that can be used by both the main application, and the bundled extensions.

详情见官方文档New Features in Xcode 6 Beta

framework是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用,作为一名Cocoa/Cocoa Touch程序员每天都要跟各种各样的Framework打交道。Cocoa/Cocoa Touch开发框架本身提供了大量的Framework,比如Foundation.framework/UIKit.framework/AppKit.framework等。需要注意的是,这些framework无一例外都是动态库。

iOS进程间通信之CFMessagePort

iOS系统是出了名的封闭,每个应用的活动范围被严格地限制在各自的沙盒中。尽管如此,iOS还是提供了若干进程间通信机制,CFMessagePort就是其中之一。

从类名可以看出,CFMessagePort属于Core Foundation层的东西,其实现部分是开源的,代码在可以在苹果的开源代码库中找到。

使用方式

1、消息接收者

CFMessagePort端口消息的接收者需要实现以下功能:

1.1 注册监听

消息接收者需要通过以下方式注册消息监听:

1
2
3
4
5
6
7
8
9
10
11
-(void)startListenning
{
  if (0 != mMsgPortListenner && CFMessagePortIsValid(mMsgPortListenner))
  {
      CFMessagePortInvalidate(mMsgPortListenner);
  }
    mMsgPortListenner = CFMessagePortCreateLocal(kCFAllocatorDefault,CFSTR(LOCAL_MACH_PORT_NAME),onRecvMessageCallBack, NULL, NULL);
    CFRunLoopSourceRef source = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, mMsgPortListenner, 0);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes);
    NSLog(@"start listenning");
}

iOS模拟器Custom Location被重置解决方案

问题说明

在做地图类应用时,经常需要用到位置模拟功能。iOS模拟器提供了该功能,我们可以设置指定的经纬度,选中模拟器后,按照以下菜单层次进入即可设置:

1
Debug --> Location --> Custom Location

但是该功能存在的问题是设置完经纬度每次重新run程序,或者重启模拟器的时候都有可能使之前设置的Location状态从Custom Location变成None,导致设置的经纬度信息无效。

因此经常需要重新选择Custom Location,对于每天需要run程序n次的我们来说苦不堪言…

解决方案

好在Xcode的target设置项中提供了设置位置信息的方法,允许我们使用GPX文件来设置自定义位置信息,步骤如下:

加密你的SQLite

关于SQLite

SQLite是一个轻量的跨平台的开源的数据库引擎,它的在读写效率消耗总量延迟时间整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS、Android)。

然而免费版的SQLite有一个致命缺点:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。比如国内某团购iOS客户端的DB缓存数据就一览无余:

Xcode设置项之Architectures和Valid Architectures

iPhone指令集

本文所讲的内容都是围绕iPhone的CPU指令集(想了解ARM指令集的同学请点击这里),现在先说说不同型号的iPhone都使用的是什么指令集:

1
2
3
4
ARMv8/ARM64 = iPhone 5s, iPad Air, Retina iPad Mini
ARMv7s = iPhone 5, iPhone 5c, iPad 4
ARMv7  = iPhone 3GS, iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3, iPad Mini  
ARMv6  = iPhone, iPhone 3G, iPod 1G/2G

设置你想支持的指令集

Xcode中关于生成二进制包指令集相关的设置项有以下三个:

自定义你的Octopress博客

SEO

  • 增加统计工具

博客搭建好了以后,大家一定很想知道每天都有多少的访问量。现在有很多工具都可以帮助我们做这件事,比如Google Analytics百度统计CNZZ 等。

其中Google Analytics是Octopress自带的统计工具,使用方式也非常简单,只需要到Google Analytics申请一个app id,填写到_config.yml文件中的google_analytics_tracking_id后面即可。但Google Analytics存在翻墙的麻烦,而且百度统计功能也挺齐全,完全能满足我的需求,就选择了百度统计

集成百度统计方式非常简单:

只需到百度统计官方网站申请一个账号,将获取的代码添加到source/_includes/custom/footer.html中,重新部署即可。

github优秀开源项目大全-iOS

前言

  1. 本文旨在搜集github上优秀的开源项目

  2. 本文搜集的项目都是用于iOS开发

  3. 本文会持续更新…

完整客户端

github的iOS客户端,目前开源代码是V1版本,V2版本在appstore上可以下载

使用XMPP协议的IM开源软件,很强大,在appstore上可以下载

让Octopress博客在多台Mac上同时使用

前阵子在公司电脑上配置好了Octopress博客,但是想在家里的Mac上使用,开始以为简单的将仓库clone就可以了,不幸的是我想的太简单。后来在网上看到了前面列出的第一篇文章,终于解决问题。

一、Octopress目录结构

Octopress的仓库目录下有两个branch,sourcemaster

  1. source分支下保存Octopress的源代码,我们需要用他们生成博客,该分支保存在Octopress本地仓库的根目录下;

  2. master分支下保存生成的博客内容,该分支在Octopress本地仓库的根目录下一个叫_deploy得文件夹中。该文件夹是以下划线开头的,会在执行git push origin source命令时被忽略,这也是为什么一个目录中能同时存在两个不同分支的文件夹的原因。

开始写blog啦

这是我的第一篇日志,以后多多关注!