标签存档: Objective-C

5 个原因让我重写 Mac Catalyst 应用

我写了一个名为 MermaidEditor 的 iOS App,这是一个用于编写 mermaid js 图表的编辑器,它使用 WKWebVIew 加载一个monaco 编辑器来编辑 mermaid js 图图的源代码,从而支持语法高亮和关键词自动完成。

在发布了 iOS 版本的 MermaidEditor 之后,我想把这个应用适配到 macOS 上,我认为在这里使用 Mac Catalyst 是一个很好的场景,这是苹果在 WWDC19 开始提供的一项技术,可以让我们的 iPad 应用在 macOS上 运行,只需要在 Xcode 中选中一个复选框就行了。

所以我用 Mac Catalyst 为 macOS 重新编译了 MermaidEditor,并向用户发布。但在一些版本之后,我决定用原生代码重写它。

为什么呢?

最低 macOS 版本要求

Mac Catalyst 要求的最低 macOS 部署目标版本是 macOS 10.15,所以如果我们的应用程序的目标版本早于 …

阅读全文 »

使用 Link Map 分析 iOS App 二进制文件体积

为什么要分析 App 文件体积?

作为一个 iOS 开发者,通常会需要关心 App 体积的大小,这将会是影响用户在 App Store 看到 App 时,是否决定下载的因素之一,如果 App 的体积太大,可能会使得用户放弃下载 App,特别是在用户使用蜂窝网络的时候。

对于一个 iOS App 来说,它的体积通常由以下几个部分组成:

  • 二进制可执行文件
  • 资源文件
  • 第三方 Framework

对于资源文件和第三方 Framework 来说,我们可以直接通过统计文件大小的方式来统计它们所占用的磁盘空间,但是对于二进制文件来说,我们该如何去统计它里面所包含的代码大小组成呢?

如何分析?

非常幸运的,Xcode 为我们提供了 Link Map 这样的一个统计文件来展示代码在经过编译之后,在可执行二进制文件中的实际占用体积大小,通过分析这个文件,我们就可以精确地知道,对应到每一个代码文件,它在最终生成的可执行二进制文件中所占的体积。

为了让 Xcode 能输出我们所需要的 Link Map 文件,需要在 Xcode 进入到工程的设置界面,选择需要输出 Link Map 的 Target,选择 Build Settings Tab,在搜索框中输入“link map”(注意 link …

阅读全文 »

[笔记] 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. 参数类型同样处理


阅读全文 »

在 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 …

阅读全文 »