如何将Cocoa应用程序分解为可重用的功能部件



假设我想将应用程序分解为功能部分。例如,客户数据管理部分、文本格式化部分、发票部分。我更喜欢这样简单但完整的应用程序。

此外,假设我想设计零件,这些零件可以在新的或其他应用程序中被重用。例如,客户数据部分可以用于CRM解决方案,也可以用于发票应用程序。

我正在寻找类似复合文档架构的东西。

问题

  • 我应该使用哪个Apple/Cooa技术来创建这样的功能部件
  • 是否可以将数据存储和UI包含在函数部分中
  • 如果为true,如何在另一个应用程序中使用一个应用/部件的UI
  • Cocoa是否存在这样的基础设施/框架/技术

可能更简单的问题

假设我有两个应用程序ABB为一些与B相关的数据提供了一个编辑器。假设B的编辑器完全包含在NSView子类中。因此,编辑控件完全包含在子类中。

  • 我可以以某种方式让B的NSView的子类实时出现在A的窗口中吗

我的目标是而不是A中实时嵌入B任意内容。通过某种通用协议对CCD_ 8和CCD_。

感兴趣的

我知道Cocoa的分布式对象技术,它允许应用程序相互通信,即使它们运行在不同的计算节点上。但是由于DO只是提供了一个传输机制,所以它不能解决我的高级分解问题。

虽然应用程序可以注册要从其他应用程序调用的URL方案,但它们没有提供足够的功能,因为URL是从调用者到被调用者的一种方式。看看这里和这里。

Apple提供了此插件体系结构文档,但主要关注一个应用程序自己的插件。此外,苹果的CFPlugin文档可能也很有趣(仍然有效?)。

Matt Gallagher简要概述了Cocoa中倾听、观察和通知的五种方法中的各种选择。除了通过NSDistributedNotificationCenter发送通知外,所有选项都是应用程序本地选项。因此,Apple文档Notification Programming Topics很有意思,但更多的是作为一种l低级别对象传输机制

我敢肯定,几年前,一组软件开发人员/公司试图在Cocoa级别实现某种动态数据交换。他们的框架并非来自苹果。不幸的是,我不记得他们框架的名字了。

如何在OS X上的现有NSView中打开新应用程序?

受…的影响

我的问题受到安卓SDK的意图的影响。引文:

‘Intent提供了一种在不同应用程序中的代码之间执行后期运行时绑定的功能。它最重要的用途是在活动的启动中,可以被认为是活动之间的粘合剂。它基本上是一个被动的数据结构,包含对要执行的操作的抽象描述

关系非常松散

  • 网络相关:InfoQ关于对象网络的文章:链接我们的API
  • Dave Winer 1993年的一篇关于IOA的文章,IOA是一种交互式对象体系结构

如果您使用的是OSX Lion 10.7,您应该尝试查看XPC服务。您可以在同一个Xcode项目中拥有不同的XPC服务和可执行的主应用程序。其想法是将您的设计模块化,并使每个服务都具有自己的系统权限。您还应该能够在项目之间共享这些XPC服务。应用程序通过Grand Central Dispatch通过进程间通信与XPC服务进行通信。

事实上,如果你正在创建一个打算在应用商店销售的应用程序,苹果鼓励你使用XPC进行权限分离。有一个苹果沙盒教程可以帮助你开始一个使用XPC的示例项目,如果你从一开始就遵循这个教程,你就会得到一个很好的例子

https://developer.apple.com/library/mac/#documentation/Security/Conceptual/AppSandboxDesignGuide/AppSandboxInDepth/AppSandboxInDepth.html#//apple_ref/doc/uid/TP40011183-CH3-SW2

当然,权限分离并不是为了使用这些服务而中断应用程序的唯一原因。我认为这很适合你想要达到的目标。我认为将UI放入服务中是可能的,但我从未尝试过。我认为,无论用户界面如何,服务和应用程序之间的来回对话都应该是一样的。

创建XPC服务https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html

每个"部分"都可能构成一个框架或库。框架是一种特殊的库,它将动态链接的代码、标头和资源封装到一个bundle中;库是动态或静态链接的,本质上是一个裸露的二进制文件。

一个框架或库可以包含应用程序所能包含的几乎任何代码,并且应用程序可以在其中调用任何代码。有关更多信息,请参阅ADC上的动态库编程指南。

如果你想要的是可以加载到另一个应用程序中以访问你的应用程序(全部或部分)的东西,那么在Mac OS X上,这仍然可以通过框架/库来实现。在iOS上,这是不可能的,因为进程间的通信非常有限,但独立的静态库仍然是代码共享的一种选择。

最新更新