Mac应用开发-启程

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

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

** 2016-08-11 **

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

首先是音乐播放问题,对于第一次开发来说,我是在网上找了好多的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开发人员还是比较少的,希望大家都能一起来讨论讨论技术。共同提高

comments powered by Disqus
粤ICP备14034266号
Built with Hugo
主题 StackJimmy 设计