最近和一些小伙伴一起合伙做了个小玩具,大家感觉还是满开心的,网站是parld音乐聚汇(推广下哈)。其中Mac客户端下载地址
目前的Mac客户端功能还很简单,但是已经不影响使用了,制作过程中遇到了各种问题,发现在网上找Mac开发的相关资源实在是太难,所以我也同步写一点吧,分享给大家
** 2016-08-11 **
由于项目搁浅,现分享下当时的macOS端代码,objective-c代码Git-oschina,GitHub 代码技术都比较老了,欢迎指教。
首先是音乐播放问题,对于第一次开发来说,我是在网上找了好多的demo来测试,所以选择了AudioStreamer,其次,需要做状态栏应用,所以找了一段代码 {% codeblock lang:objc %} NSMenu *menu;
_statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength] ;
[_statusItem setImage:[NSImage imageNamed:@“start”]]; [_statusItem setHighlightMode:YES]; [_statusItem setTitle:@" 音乐汇聚"];
menu = [[NSMenu alloc] initWithTitle:@“音乐汇聚”]; [menu addItemWithTitle:@“上一首” action:@selector(pre) keyEquivalent:@""]; [menu addItemWithTitle:@“下一首” action:@selector(next) keyEquivalent:@""]; [menu addItemWithTitle:@“更新音乐池” action:@selector(updateMusic) keyEquivalent:@""]; [menu addItemWithTitle:@“关于” action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; [menu addItemWithTitle:@“退出” action:@selector(exit:) keyEquivalent:@""]; [menu addObserver:view forKeyPath:@“123” options:NSKeyValueObservingOptionNew context:nil]; [_statusItem setMenu:menu]; {% endcodeblock %} 之后需要做的就是逻辑了,获取歌单,播放歌单。 后期的版本又添加了Mac笔记本的媒体播放键功能,同样是找了一段代码,封装好的,如果想了解原理也可自行下载。SPMediaKeyTap。 加入之后需要修改主程序 添加继承NSApplication的类 {% codeblock lang:objc %}
-
(void)sendEvent:(NSEvent *)theEvent { // If event tap is not installed, handle events that reach the app instead BOOL shouldHandleMediaKeyEventLocally = ![SPMediaKeyTap usesGlobalMediaKeyTap];
if(shouldHandleMediaKeyEventLocally && [theEvent type] == NSSystemDefined && [theEvent subtype] == SPSystemDefinedEventMediaKeys) { [(id)[self delegate] mediaKeyTap:nil receivedMediaKeyEvent:theEvent]; } [super sendEvent:theEvent]; } {% endcodeblock %} ${PRODUCT_NAME}-Info.plist文件中Principal class字段修改为重写的NSApplication
并在主AppDelegate添加按键映射 {% codeblock lang:objc %} -(void)mediaKeyTap:(SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event; { NSAssert([event type] == NSSystemDefined && [event subtype] == SPSystemDefinedEventMediaKeys, @“Unexpected NSEvent in mediaKeyTap:receivedMediaKeyEvent:”); // here be dragons… int keyCode = (([event data1] & 0xFFFF0000) » 16); int keyFlags = ([event data1] & 0x0000FFFF); BOOL keyIsPressed = (((keyFlags & 0xFF00) » 8)) == 0xA; int keyRepeat = (keyFlags & 0x1);
if (keyIsPressed) {
NSString *debugString;
debugString = [NSString stringWithFormat:@"%@", keyRepeat?@", repeated.":@"."];
switch (keyCode) {
case NX_KEYTYPE_PLAY:
if (_isPlay) {
[self pauseMusic];
}
else{
[self playMusic];
}
break;
case NX_KEYTYPE_FAST:
[self nextMusic];
break;
case NX_KEYTYPE_REWIND:
[self lastMusic];
break;
default:
break;
// More cases defined in hidsystem/ev_keymap.h
}
}
} {% endcodeblock %} 还要添加一个开机自启动的配置,同样可以使用LaunchAtLoginController,只需要将Check控件的value绑定到LaunchAtLoginController里面的launchAtLogin变量上即可
以上就是第一个初级版本所用到的技术,比较简单,但是还是蛮实用的。 而从今天开始,打算重构做第二版本,支持Mac悬浮窗,拖拽文件上传,悬浮窗下拉主窗体,目前基本功能的技术难点已经基本完成,后续会继续发表博客。
在如今Mac已经越来越多的情况下,Mac开发人员还是比较少的,希望大家都能一起来讨论讨论技术。共同提高