1. 首先,创建一个Bundle工程
2. 新建一个类,作为iTunes调用插件的入口
例如,我新建了一个叫PluginController的类
3. 新建一个Window.xib和DemoWindowController类用来展示插件是否被调用起来了
4. 代码实现
DemoWindowController.m 仅实现了init方法
- (id)init
{
self = [super initWithWindowNibName:@"Window" owner:self];
if (self) {
// Initialization code here.
}
return self;
}
PluginController.m 定义了两个静态方法initialize()和finalizer(),分别在iTunes启动和退出时被调用。iTunes是怎么去找插件的入口和出口呢? 关键就在__attribute__ ((constructor)) 和 __attribute__ ((destructor)) 这两个GCC编译器扩展 。initialize()主要目的是弹出示例窗口,这样我们就知道插件有没有被调用起来。finalizer()方法是用来iTunes退出时关闭示例窗口,释放资源。
#import "PluginController.h"
#import "DemoWindowController.h"
@implementation PluginController
@end
static DemoWindowController *windowController;
//__attribute__ 这个关键字是GCC 编译器对标准的扩展,它用来修饰函数属性,变量属性,类型属性
//__attribute__ ((constructor)) 所修饰的方法会在 main() 之前执行
//iTunes启动后执行这个方法
__attribute__ ((constructor))
static void initialize(){
NSLog(@"Start");
windowController = [[DemoWindowController alloc] init];
[windowController.window makeKeyAndOrderFront:nil];
}
//__attribute__ ((destructor)) 所修饰的方法会在main()执行结束之后执行
//iTunes退出后执行这个方法
__attribute__ ((destructor))
static void finalizer() {
[windowController.window close];
[windowController release];
}
5. 添加PkgInfo文件
做完上面所述步骤后,编译生成Bundle文件放入iTunes插件目录(下面会做介绍),启动iTunes发现根本文法启动。比较下别人做的iTunes插件,发现Bundle的Contents目录下有一个PkgInfo文件,而我编译出的Bundle文件没有,所以我就把那个PkgInfo拷过来试试,居然成功了。各位可以从我下面放的源码中找到这个文件。
添加的资源文件会默认放在Resources目录下,但是我们需要放在Contents目录下,所以还需要做点配置。 请注意看下面的Subpath,我用两个点(..),就是表示Resources目录的上层目录(Contents目录)。
编译后,打开Bundle的内容,可以看到Contents目录下有Pkginfo文件了。
6. 拷贝编译后的Bundle放在iTunes插件目录下
在终端执行命令:
open ~/Library/iTunes/iTunes\ Plug-ins/ 打开iTunes插件目录,将生成的bundle(即iTunesPluginDemo.bundle)文件拷贝到这个目录下。
然后,打开iTunes,会发现示例窗口跟着弹出来了,退出iTunes,示例窗口也会随之关闭。
最后,奉上所有源码:
iTunesPluginDemo.zip