我一直试图弄清楚如何使用脚本桥获取当前正在播放的歌曲的iTunes艺术作品.我已经达到了适用于某些歌曲的程度,但对于其他歌曲,我得到了一个SIGABRT.我不确定问题是什么,所以任何帮助都将不胜感激.这是我到目前为止:
- iTunesApplication * iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"];
- NSImage *songArtwork;
- iTunesTrack *current = [iTunes currentTrack];
- iTunesArtwork *artwork = (iTunesArtwork *)[[[current artworks] get] lastObject];
- if(artwork != nil)
- songArtwork = [artwork data];
- else
- songArtwork = [NSImage imageNamed:@"Image.tiff"];
- NSMenuItem *artworkMenuItem = [[NSMenuItem alloc] initWithTitle:@"" action:NULL keyEquivalent:@""];
- [songArtwork setSize:NSMakeSize(128,128)];
- [artworkMenuItem setImage:songArtwork];
- [Menu insertItem:artworkMenuItem atIndex:0];
我可以使用一些歌曲,并在菜单项中很好地显示艺术作品,但对于其他人我在线上获得了一个SIGABRT:
- [songArtwork setSize:NSMakeSize(128,128)];
控制台的输出如下:
- 2011-08-12 23:13:20.094 SongViewer[2146:707] -[NSAppleEventDescriptor setSize:]: unrecognized selector sent to instance 0x102827f70
- 2011-08-12 23:13:20.095 SongViewer[2146:707] An uncaught exception was raised
- 2011-08-12 23:13:20.096 SongViewer[2146:707] -[NSAppleEventDescriptor setSize:]: unrecognized selector sent to instance 0x102827f70
- 2011-08-12 23:13:20.097 SongViewer[2146:707] (
- 0 CoreFoundation 0x00007fff86f11986 __exceptionPreprocess + 198
- 1 libobjc.A.dylib 0x00007fff8b04cd5e objc_exception_throw + 43
- 2 CoreFoundation 0x00007fff86f9d5ae -[NSObject doesNotRecognizeSelector:] + 190
- 3 CoreFoundation 0x00007fff86efe803 ___forwarding___ + 371
- 4 CoreFoundation 0x00007fff86efe618 _CF_forwarding_prep_0 + 232
- 5 SongViewer 0x0000000100002a83 -[IPMenulet awakeFromNib] + 4483
- 6 CoreFoundation 0x00007fff86f089e1 -[NSObject performSelector:] + 49
- 7 CoreFoundation 0x00007fff86f08962 -[NSSet makeObjectsPerformSelector:] + 274
- 8 AppKit 0x00007fff8d9d9c27 -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1245
- 9 AppKit 0x00007fff8d9d01b9 loadNib + 322
- 10 AppKit 0x00007fff8d9cf6b6 +[NSBundle(NSNibLoading) _loadNibFile:naMetable:withZone:ownerBundle:] + 217
- 11 AppKit 0x00007fff8d9cf5d1 +[NSBundle(NSNibLoading) loadNibFile:externalNaMetable:withZone:] + 141
- 12 AppKit 0x00007fff8d9cf514 +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364
- 13 AppKit 0x00007fff8dc42355 NSApplicationMain + 398
- 14 SongViewer 0x0000000100001882 main + 34
- 15 SongViewer 0x0000000100001854 start + 52
- )
- 2011-08-12 23:13:20.098 SongViewer[2146:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException',reason: '-[NSAppleEventDescriptor setSize:]: unrecognized selector sent to instance 0x102827f70'
- *** First throw call stack:
- (
- 0 CoreFoundation 0x00007fff86f11986 __exceptionPreprocess + 198
- 1 libobjc.A.dylib 0x00007fff8b04cd5e objc_exception_throw + 43
- 2 CoreFoundation 0x00007fff86f9d5ae -[NSObject doesNotRecognizeSelector:] + 190
- 3 CoreFoundation 0x00007fff86efe803 ___forwarding___ + 371
- 4 CoreFoundation 0x00007fff86efe618 _CF_forwarding_prep_0 + 232
- 5 SongViewer 0x0000000100002a83 -[IPMenulet awakeFromNib] + 4483
- 6 CoreFoundation 0x00007fff86f089e1 -[NSObject performSelector:] + 49
- 7 CoreFoundation 0x00007fff86f08962 -[NSSet makeObjectsPerformSelector:] + 274
- 8 AppKit 0x00007fff8d9d9c27 -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1245
- 9 AppKit 0x00007fff8d9d01b9 loadNib + 322
- 10 AppKit 0x00007fff8d9cf6b6 +[NSBundle(NSNibLoading) _loadNibFile:naMetable:withZone:ownerBundle:] + 217
- 11 AppKit 0x00007fff8d9cf5d1 +[NSBundle(NSNibLoading) loadNibFile:externalNaMetable:withZone:] + 141
- 12 AppKit 0x00007fff8d9cf514 +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364
- 13 AppKit 0x00007fff8dc42355 NSApplicationMain + 398
- 14 SongViewer 0x0000000100001882 main + 34
- 15 SongViewer 0x0000000100001854 start + 52
- )
- terminate called throwing an exception(gdb)
如果有人知道可能出现什么问题,请告诉我!
解决方法
好的,我明白了.解决方案是使用API提供的NSData原始数据而不是NSImage.所以我用过:
- NSImage *songArtwork = [[NSImage alloc] initWithData:[artwork rawData]];
而不是
- songArtwork = [artwork data];