Cocoa学习

我的Cocoa/Cocoa Touch学习笔记

检测iOS的网络可用性并打开网络设置

今天接到个需求,要求程序能够检测网络可用性,并在没有网络可用的时候能够弹出对话框,并允许用户点击按钮打开网络设置。

这个问题,我首先想到的就是用一个方法检测网络可用性,然后用UIApplicationopenURL方法打开某个特殊URL,就可以进入设置了。于是,我迅速地建了个测试项目,写了个简单的实现,如下:

模拟低速网络,测试iOS程序的表现

因为没有考虑程序在低速网络下的表现,昨天在测试公司的一个程序的时候出了点丑,于是痛定思痛,要解决模拟低速网络连接的问题。遗憾的是iOS Simulator并没有提供模拟低速网络的功能。

经过一番STFW之后,发现原来苹果从Xcode 4.1开始提供了一款叫做“Network Link Connector”的工具。但是如今我已经升级到Xcode 4.3.2,用SpotLight搜索了一番之后也没有发现系统里已经安装了这样的一个工具。

又经过一番搜索,我发现原来“Network Link Connector”是一个prefPane程序,从Xcode 4.3开始已经不再默认包含在程序里了,而是需要从developer.apple.com/download上单独下载,它位于“Hardware IO Tools”的一个包中。

跳动Dock图标的实现

OS X程序,在执行后台任务的时候,有时需要通过跳动Dock图标来提示用户进行操作或某项操作已经执行完成。方法很简单,NSApplication有一个-requestUserAttention:的方法可以跳动Dock图标。

下面是实例代码:

1
2
3
4
5
6
7
8
//跳动一次
- (void)bounceOnce:(id)sender {
    [NSApp requestUserAttention:NSInformationalRequest];
}
//总是跳动,直到用户干预为止
- (void)bounceAlways:(id)sender {
    [NSApp requestUserAttention:NSCriticalRequest];
}

FYI: NSApp是一个指向当前运行的程序实例的全局变量,等同于调用:[NSApplication sharedApplication]

示例代码已经上传到github,有兴趣的可以看看。不过记得在测试示例程序的时候,点击按钮后就让程序进入后台运行。5秒钟后就能看到效果了。

在Sandbox的程序中加入Growl支持

Growl是一个知名的第三方消息提示框架,几乎是Mac装机必备的软件。虽然从Growl 1.3开始,Growl变成了收费软件,但是它依然是Mac App Store收费榜名列前茅的软件。虽然从OS X 10.8 Mountain Lion开始,OS X将加入Notification Center的支持,但是现在距离OS X 10.8发布依然有一段时间,而且,OS X 10.8之前的Mac OS X要退出历史舞台还有很长的路。

我曾经撰写过关于Growl的文章,因此关于Growl.framework的基本使用的内容我在本文中不再赘述了,大家可以去回顾一下。基本上就是:

  • 下载Growl SDK
  • 解压,添加Framework目录下的Growl.framework到项目中;
  • 添加一个plist文件,名为:Growl Registration Ticket.growlRegDict,添加合适的值(不详述);
  • 增加一个Copy Build Phase,设置为Framework,把Growl.framework加入进去;
  • 在代码中实现GrowlApplicationBridgeDelegate的方法;
  • 发布Growl Notification。

在iOS 4中自定义BarButtonItem

在iOS 5中已经有了自定义UIBarButtonItem背景的API。但是在iOS 4中,自定义BarButtonItem背景就复杂很多了。其中最典型也最容易实现的一种是方法是试用UIBarButtonItem-initWithCustomView:方法,传递一个自定义UIButton对象进去。

在深入讨论自定义UIBarButtonItem,让我们来先解决自定义UIButton的一个问题:那就是Button的标题的长度是变化的,我们应该通过什么方法让背景图片适应标题长度的变化呢?

下面是解决方案: