Mac应用开发-启程

最近和一些小伙伴一起合伙做了个小玩具,大家感觉还是满开心的,网站是parld音乐聚汇(推广下哈)。其中Mac客户端下载地址

目前的Mac客户端功能还很简单,但是已经不影响使用了,制作过程中遇到了各种问题,发现在网上找Mac开发的相关资源实在是太难,所以我也同步写一点吧,分享给大家

2016-08-11

由于项目搁浅,现分享下当时的macOS端代码,objective-c代码Git-oschinaGitHub
代码技术都比较老了,欢迎指教。

首先是音乐播放问题,对于第一次开发来说,我是在网上找了好多的demo来测试,所以选择了AudioStreamer,其次,需要做状态栏应用,所以找了一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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];

之后需要做的就是逻辑了,获取歌单,播放歌单。
后期的版本又添加了Mac笔记本的媒体播放键功能,同样是找了一段代码,封装好的,如果想了解原理也可自行下载。SPMediaKeyTap。
加入之后需要修改主程序
添加继承NSApplication的类
1
2
3
4
5
6
7
8
9
10
- (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];
}

${PRODUCT_NAME}-Info.plist文件中Principal class字段修改为重写的NSApplication

并在主AppDelegate添加按键映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
-(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
}
}
}

还要添加一个开机自启动的配置,同样可以使用LaunchAtLoginController,只需要将Check控件的value绑定到LaunchAtLoginController里面的launchAtLogin变量上即可

以上就是第一个初级版本所用到的技术,比较简单,但是还是蛮实用的。
而从今天开始,打算重构做第二版本,支持Mac悬浮窗,拖拽文件上传,悬浮窗下拉主窗体,目前基本功能的技术难点已经基本完成,后续会继续发表博客。

在如今Mac已经越来越多的情况下,Mac开发人员还是比较少的,希望大家都能一起来讨论讨论技术。共同提高

文章目录