开发沉思录iOS Swift && Objective-C程序员

填平macOS和iOS之间的鸿沟

2017-01-31  本文已影响1858人  MarkNote

tags:开发随笔

mac and iOS

虽然mac存在了很多年之后才有了iOS,但是对很多程序员而言,可能是先熟悉了 UIKit之后才去熟悉AppKit。

我自己也是这样。在开发了MarkNote之后,我想把MarkNote的笔记体验延伸到mac。

有没有工具或者库可以直接将iOS应用转换为macOS应用

最初我只是想让iOS版本的MarkNote照搬过来,于是我想看看是否有捷径可走。最理想的情况下,有一个工具,直接把iOS上的代码转换一下,就可以在mac下运行。或者直接在mac上给iOS应用提供一个runtime?

查了一下之后,发现真有人有类似的想法。

这些库之所以夭折,在很大程度上是因为其复杂程度远远超过看起来的那样。桌面应用和移动应用的机制有很大的不同。虽然UIKit和AppKit共享了很多概念,但是API依然有很大的不同。比如UIView和 NSView虽然看起来很像,但是实现细节和使用上有很多不同。

MarkNote的macOS实现策略

虽然Chameleon看起来很有意思,但是我最终没有采用这个方案。一来我担心其局限性的制约,二来我找到了现在看来效果非常好的策略。

我的设计策略总结起来是以下两点:

我采用了以下的办法来提高复用:

project

其中:
MarkNoteParserOC 是Obj-C版的markdown 解析器,已经开源
MarkEditor是语法高亮编辑器,支持iOS和macOS。不仅为mac版和iOS版的MarkNote使用,同时也是�InstantCoder的代码编辑器。其一个早期版本也已经开源
MarkNoteEngine是笔记管理和�iCloud同步的核心库,为mac版和iOS版的MarkNote使用。
MarkNotes是mac版的MarkNote。
MarkNote是iOS版的MarkNote。

target
#if !TARGET_OS_IPHONE
- (void)openWithCompletionHandler:(void (^)(BOOL success))completionHandler;
#endif
#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#define BaseTextView UITextView
#else
#import <Cocoa/Cocoa.h>
#define BaseTextView NSTextView
#endif

这样,我后面也就直接用BaseTextView好了。比如

@interface BaseTextView(Editor)

MarkNote IOS版在2015年5月上线,mac版在2015年11月上线。之后两个版本都分别更新了十多次。上面所描述的策略和方法,使得我的代码维护起来清晰而简单。

上一篇下一篇

猜你喜欢

热点阅读