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开发人员还是比较少的,希望大家都能一起来讨论讨论技术。共同提高

comments powered by Disqus