Mac应用开发-启程

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

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

2016-08-11

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

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

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的类
- (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添加按键映射

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

文章目录

最近访客