分类存档: OS X & iOS

[笔记] Objective-C 中模拟泛型及 Xcode 格式化代码插件

记录一些 iOS & OS X 开发过程中学到或有趣的东西。

Objective-C 中模拟泛型

今天看到的一个辅助代码,可以在 Objective-C 代码中添加泛型的支持:

泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部份,那些部份在使用前必須作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。(via )

泛型一般出现在 .NET、Java 或 C++ 的代码里面。

在 Objective-C 里面,像数组之类的容器,在取单个元素时,返回类型都是 id,这个时候如果要使用返回对象的一些属性,就需要先转换一下类型,或者使用 getter 方法来获取。

如果用了泛型之后,就很方便了,可以直接以 arr.lastObject.prop 的方式来访问。

使用了上面这个代码使 Objective-C 支持泛型后,就可以像下面这样写代码了:

generics example

这个辅助代码是一个大宏,给 Objective-C 添加泛型支持是以以下几个方面来做到的,例如给 MyClass 添加泛型支持来说明:

  1. 定义一个 MyClass 的 Protocol
  2. 给各个容器类(例如 NSArray、NSMutableArray、NSSet)添加 Category,重新定义各个容器操作方法的返回值和参数类型
    1. 获取单个元素的方法返回值类型修改为 MyClass *
    2. 返回容器的方法返回值类型修改为 NSArray<myclass> *
    3. 参数类型同样处理


阅读全文 »

在 Sandboxed Mac App 中嵌入第三方可执行文件

之前开源了 一个 gitstats 的 GUI 应用 GitStatX,在提交到 GitHub (GitStatX) 之后,又准备提交到 Mac App Store。

在提交到 Mac App Store 之后,出现了一些问题,程序中包含的第三方可执行文件没有签名,导致苹果拒绝了提交的程序包:

App sandbox not enabled – The following executables must include the “com.apple.security.app-sandbox” entitlement with a Boolean value of true in the entitlements property list. Refer to the App Sandbox page for



阅读全文 »

开源 GitStatX:一个 gitstats 的 GUI 应用程序

GitStatX 是一个 gitstatx 的 GUI 应用程序,用于方便在 Mac OS X 中使用 gitstats。

一般情况下,如果要在 Mac OS X 上使用 gitstats,需要自行安装 gnuplot,而这需要使用 macports 或者 homebrew,通常这会比较费时间,并且只能使用命令行来使用 gitstats 生成所对应 git 仓库的报告。

GitStatX 提供了一个 GUI 来使用 gitstats,具备以下功能:

  • 同时管理多个项目
  • 使用分组来归类各个项目
  • 标识项目类型
  • 自动生成报告
  • 导出仓库的活动报告

截图

项目主页

仓库地址

下载

查看所有下载

授权

本软件及代码以 GPLv3 授权发行。

相关代码

  • 使用 bootstrap 样式的 gitstats:


阅读全文 »

Developer ID Application 在 Mac OS X 10.7.5 下不能启动的问题

记录一下最近发布阿里旺旺 for Mac 3.0.1 时碰到的问题。

阿里旺旺在发布到 labs.etao.com 时,为了兼容 Mac App Store 版本,也要加上 Sandbox 支持,所以 App 是使用 Developer ID Application 方式发布的。

但是有一些人在拿到新版本后,却没办法运行程序,总是会提示以下错误:

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes: 0x0000000000000001, 0x0000000000000000

Application Specific Information:
dyld: launch, running initializers
/usr/lib/libSystem.B.dylib
xpchelper reply message validation: code signature invalid
The code signature is not 


阅读全文 »

[Tips] 适配 iOS App 到 iPhone 5 和 iOS 6

iPhone 5 和 iOS 6 正式发布后,iOS 开发者们就要开始做 iPhone 5 和 iOS 6 的适配工作了 :)

在迁移我自己的几个 iOS App 过程中,发现了老的 Xcode 工程代码在 iOS 6 中无法响应屏幕旋转的问题,在这里记录一下。顺便记录一下怎样适配 iOS App 到 iPhone 5 给还不知道怎么做的朋友们。

适配 iPhone 5 的 4 寸屏幕


iOS App LetterBox Mode

iPhone 5 的屏幕分辨率为 640×1136,默认情况下,老的 iOS App 会以上下加两条黑边的模式来运行,程序实际占用的分辨率还是 640×960,保证了原有的 iOS App 在不修改的情况下也可以正常运行。…

阅读全文 »

Mac OS X 中实现支持任意位置拖动的不规则窗体

Mac OS X 中实现支持任意位置拖动的不规则窗体

在开发 Mac OS App 时,根据视觉设计师的需要,有些时候会要实现一些不规则的窗口。一般不规则窗口都不包含 Mac OS X 标准窗口的标题栏,这样用户就没有办法通过拖动标题栏来拖动窗口。

为了能让用户拖动一个无标题栏的窗口,我们就需要自己去处理这个移动窗口的过程。另外,由于窗口有可能是不规则的,那么同样就没有办法拖动窗口边缘来改变窗口大小了,同样需要自己进行处理。

因为要处理鼠标点击事件,因此我们先创建一个继承于 NSWindow 的类 JWBorderlessWindow,以下代码都是此类的代码实现。

初步实现

//
//  JWBorderlessWindow
//
//  Created by Xu Jiwei on 12-9-3.
//  Copyright (c) 2012 xujiwei.com. All rights reserved.
//
 
@implementation JWBorderlessWindow
 
- (BOOL)canBecomeKeyWindow {
    return


阅读全文 »

在 Ubuntu 中使用 GNUstep 搭建 Objective-C 开发环境

GNUstep 介绍见

安装相关程序

直接 apt-get install 搞定。

  • build-essential
  • gnustep
  • gnustep-devel
  • gnustep-examples
  • gobjc
  • gobjc++

设置环境变量

为了方便使用 GNUstep 的各种编译工具,需要先在 .bashrc 中导入 GNUstep 的脚本。

# Setup GNUstep
GNUSTEP_MAKEFILES=/usr/share/GNUstep/Makefiles
export GNUSTEP_MAKEFILES
source $GNUSTEP_MAKEFILES/GNUstep.sh

编写 Makefile

使用 Makefile 来编译 Objective-C App,注意 Makefile 的文件名为 GNUmakefile

include $(GNUSTEP_MAKEFILES)/common.make

APP_NAME=HelloWorld
HelloWorld_OBJC_FILES=test.m 

include $(GNUSTEP_MAKEFILES)/application.make

这个是编译出 Mac OS …

阅读全文 »

在 Mac App 中支持全屏和文件版本控制

前言

在 Mac OS X 10.7 Lion 中,新增了两个特性对用户来说可能比较有用的特性,一个是全屏程序,一个是文件版本控制。

全屏程序可以使用户集中注意力到一个程序上,并且隐藏菜单栏、Dock 等不相关的界面元素,使得工作区最大化,更加有效地利用有限的屏幕空间。

文件版本控制可以让用户在不借助于 Time Machine、Git 或者 SVN 这些工具的时候,也可以轻松恢复文件到之前保存过的版本,防止一些误操作删除了重要内容。

全屏程序

全屏功能可以让程序以全屏方式显示,这样用户可以拥有最大的操作区域,并隐藏与程序无关的视觉元素。

在全屏方式下,Dock 和菜单栏都会自动隐藏,可以通过将鼠标移动到屏幕边缘的方式来重新显示 Dock 或者菜单栏。

目前全屏程序有一个问题是在使用双屏的情况下,有一个屏幕会无法使用,只能显示背景图片,而不能同时使用两个屏幕,或者将另外一个程序全屏在另一个屏幕。

另外,全屏程序切换是使用水平动画切换,对我来说可能动作太大,不是很习惯,这是题外话了。

要设置一个 App 支持全屏很简单,只需要设置对应 Window 的属性即可。

Full Screen 有两种模式,分别为 NSWindowCollectionBehaviorFullScreenPrimaryNSWindowCollectionBehaviorFullScreenAuxiliary,其中多数时候只需要使用 NSWindowCollectionBehaviorFullScreenPrimary 即可。

在设置 NSWindowCollectionBehaviorFullScreenPrimary 后,就会在相应的 Window 右上角显示一个全屏按钮,用户通过这个按钮就可以切换程序到全屏方式使用。

全屏模式切换菜单

有些时候,为了用户使用方便,需要设置一个快捷键,或者菜单来供用户进行全屏模式的切换,这时,只需要添加一个 NSMenuItem 到主菜单的 View 菜单中,将 selector …

阅读全文 »

iOS App 自定义 URL Scheme 设计

在 iOS 里,程序之间都是相互隔离,目前并没有一个有效的方式来做程序间通信,幸好 iOS 程序可以很方便的注册自己的 URL Scheme,这样就可以通过打开特定 URL 的方式来传递参数给另外一个程序。

例如在 iPad 上浏览网页,并且 iPad 已经安装了 淘宝 HD,那么就打开下面这个链接就会在淘宝 HD 中查看这个商品的详细信息,也可以方便的使用淘宝 HD 进行购买、收藏等操作。

在淘宝 HD 中查看商品“2012西藏卓明谷方舟登舰卡(船票)”

当然,如果你在 Mac OS X 中打开这个链接,或者在没有安装 淘宝 HD 的 iPad 中打开这个链接,会提示没有程序来打开这个链接。

配置

要为 iOS 程序添加自定义协议的支持是一件很方便的事,只需要在程序的 Info.plist 添加一个 URL types 节点就可以了。在这个节点里,可以设置这个程序所支持的自定义协议名称,像 http、ftp 这种,一般我们可以设置为程序英文名称,像淘宝客户端中就设置了 taobao,这样 taobao:// 这个形式的 URL 就会关联到淘宝客户端的 …

阅读全文 »

淘宝 for iOS 历程

这是在 [淘宝2011技术嘉年华](http://developerclub.taobao.com/) 上讲的关于淘宝 for iOS 开发过程的演示文稿。

View more presentations from ohdarling88.

— EOF —…

阅读全文 »