为你的MacOS App添加开机自启动(Swift)
猴子原创,欢迎转载。转载请注明: 转载自Cocos2Der-CSDN,谢谢!
原文地址: http://blog.csdn.net/cocos2der/article/details/52104828
关于Mac下如何给自己App添加开机自启动功能,你可以了解下Mac Developer Library中的说明。
There are two ways to add a login item: using the Service Management framework, and using a shared file list
Login items installed using the Service Management framework are not visible in System Preferences and can only be removed by the application that installed them.
Login items installed using a shared file list are visible in System Preferences; users have direct control over them. If you use this API, your login item can be disabled by the user, so any other application that communicates with it it should have reasonable fallback behavior in case the login item is disabled.
可以看出,Apple推荐了两种方式:Service Management framework 和 shared file list。
这两种方式有差别:
使用Service Management framework 在系统的登录项中是不可见的。只有卸载App才能移除登录项
使用 shared file list 在系统的登录项中是可见的。用户可以直接在面板上控制他们。(If you use this API, your login item can be disabled by the user, so any other application that communicates with it it should have reasonable fallback behavior in case the login item is disabled.) 原文还有一句大意是指这个API有隐患,所以在OS X 10.10系统上 API被大量Deprecated
下面我主要介绍的是使用Service Management framework 的方式添加开机自启动。
一、创建主工程
新建一个MainApp的osx工程App
二、添加自动启动Target
我们需要注册一个Helper Target App用来作为开机自启动我们的MainApp,点击Targets下面的加号.
添加一个新的OS X application。取名为MainAppHelper
三、设置配置属性
删除MainAppHelper中的windows,让它没有可展示的Window。
设置MainAppHelper的Info中Application is background only为YES
设置MainAppHelper中Build Setting下skip install为YES
在MainApp中添加CopyFile到Contents/Library/LoginItems
在MainApp中设置Build Setting 下Strip Debug Symbols During Copy为NO, 这个是默认的为No
分别开启MainApp和MainAppHelper的App Sandbox
四、添加启动代码
- 请根据你自己的实际情况添加startupAppWhenLogin函数到你MainApp主工程中,程序运行后根据情况调用开启或者关闭自启动, 注意其中的BundleID改为你自己的,以及主App的名称。如果不确定名称是否是自己的工程名,可以直接右键自己的ipa,显示包内容,看下里面的文件夹你就明白了。
func startupAppWhenLogin(startup: Bool) {
// 这里请填写你自己的Heler BundleID
let launcherAppIdentifier = "com.cocos2dev.MainApp.MainAppHelper"
// 开始注册/取消启动项
SMLoginItemSetEnabled(launcherAppIdentifier, startup)
var startedAtLogin = false
for app in NSWorkspace.sharedWorkspace().runningApplications {
if app.bundleIdentifier == launcherAppIdentifier {
startedAtLogin = true
}
}
if startedAtLogin { NSDistributedNotificationCenter.defaultCenter().postNotificationName("killhelper", object: NSBundle.mainBundle().bundleIdentifier!)
}
}
- 在MainAppHelper中,修改AppDelegate为如下代码:
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(aNotification: NSNotification) {
// Insert code here to initialize your application
let mainAppIdentifier = "com.cocos2dev.MainApp"
let running = NSWorkspace.sharedWorkspace().runningApplications
var alreadyRunning = false
for app in running {
if app.bundleIdentifier == mainAppIdentifier {
alreadyRunning = true
break
}
}
if !alreadyRunning {
NSDistributedNotificationCenter.defaultCenter().addObserver(self, selector: "terminate", name: "killhelper", object: mainAppIdentifier)
let path = NSBundle.mainBundle().bundlePath as NSString
var components = path.pathComponents
components.removeLast()
components.removeLast()
components.removeLast()
components.append("MacOS")
components.append("MainApp") //main app name
let newPath = NSString.pathWithComponents(components)
NSWorkspace.sharedWorkspace().launchApplication(newPath)
} else {
self.terminate()
}
}
func applicationWillTerminate(aNotification: NSNotification) {
// Insert code here to tear down your application
}
func terminate() {
// NSLog("I'll be back!")
NSApp.terminate(nil)
}
}
以上就是一个自启动App的做法。当然如果你上架Mac Store,建议你不要默认就开启自启动,放到设置中,让用户自己选择开启/关闭。
2016-8-4 更新
- 解决开启Sandbox后,请求网络数据出现
"The connection to service named com.apple.nsurlstorage-cache was invalidated."错误。勾选App Sandbox中Outgoing Connections(Client)
参考博客
Mac Developer Library
First OS X tutorial: How to launch an OS X app at login?
在SandBox沙盒下实现程序的开机启动
为你的MacOS App添加开机自启动(Swift)的更多相关文章
- linux添加开机自启动脚本示例详解
linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的; 一.在/etc/rc.local中添加如果不想将脚本粘来粘去,或创建链接什么的,则:step1. 先修改好脚本,使其所有 ...
- win8系统添加开机自启动软件的方法(转)
win8系统添加开机自启动软件的方法,把需要设置开机自启动的软件的快捷方式复制到下面任意路径就ok了.开机自启动路径如下:C:\ProgramData\Microsoft\Windows\Start ...
- Centos 下添加开机自启动服务和脚本
最近刚玩Centos7的系统,跟Centos6还是很多方面有改变的,这里记录一下怎么在Centos7下添加开机自启动脚本和服务的方法. 1.添加开机自启服务 我这里以docker 服务为例,设置如下两 ...
- Centos 下添加开机自启动服务和脚本【转】
最近刚玩Centos7的系统,跟Centos6还是很多方面有改变的,这里记录一下怎么在Centos7下添加开机自启动脚本和服务的方法. 1.添加开机自启服务 我这里以docker 服务为例,设置如下两 ...
- 在centos中添加开机自启动服务
将服务的shell脚本添加到/etc/rc.d的rc.local文件的最后面,需要在服务名称的前面加上其路径. 例如我要将httpd添加到开机自启动中,需要在rc.local添加如下代码 /usr/s ...
- [Winform]setupfactory打包时添加开机自启动的脚本
摘要 如果有这样的需求,需要软件开机自启动,该如何做呢?开机自启动的做法,就是修改注册表,将你的exe注册到注册表Run节点下. setupfactory 在安装的时候需要以管理员身份运行,这样可以保 ...
- chkconfig的原理 和添加开机自启动的办法
当我们使用 chkconfig --list的时候 都会又 123456 这样的级别. 当某个级别是 on 他就会开机启动,当他是off 的时候他就不会开机自启动. 那么这是什么原因呢?他的 原理是 ...
- Centos7 下添加开机自启动服务和脚本
1.添加开机自启服务 #设置jenkins服务为自启动服务 systemctl enable jenkins.service #启动jenkins服务 systemctl start jenkins. ...
- Centos7下shell脚本添加开机自启动
添加开机自启脚本,注意都需要用绝对路径 psubscribe.sh脚本中的内容: nohup /usr/bin/php -f /data/aliyun51015cn/redisChannel/psub ...
随机推荐
- ●UVA 10652 Board Wrapping
题链: https://vjudge.net/problem/UVA-10652 题解: 计算几何,Andrew求凸包, 裸题...(数组开小了,还整了半天...) 代码: #include<c ...
- CodeForces346 C. Number Transformation II
C. Number Transformation II time limit per test 1 second memory limit per test 256 megabytes input s ...
- Notepad++连接Centos
Notepad++设置 插件 -- > plugin Manager --> show plugin manager --> NppFtp 安装重启notepad++ 插件 --& ...
- Spring学习笔记6——注解方式测试
需要下载junit-4.12.jar和hamcrest-all-1.3.jar,将下载好的包导入到项目当中. 修改TestSpring, 并运行1. @RunWith(SpringJUnit4Clas ...
- Python作业之工资管理
作业之工资管理 工资管理实现要求: 工资管理系统 Alex 100000 Rain 80000 Egon 50000 Yuan 30000 -----以上是info.txt文件----- 实现效果: ...
- display:none
$("#loadimg").css("display",""); <span id="loadimg" clas ...
- jquery 实现图片无缝向左滚动
<script type="text/javascript" src="_pub/Script/jquery.js"></script> ...
- json转化为对象数组
1.ascx传值给aspx aspx页面 <%@ Page Title="" Language="C#" MasterPageFile="~/_ ...
- MultiTigger 绑定异常处理
异常产生环境: 在初始化一个窗口后,没有show出来.在此窗口中,有个控件,重写了控件模板,并加了MultiTrigger. 注意:俩个Condition,一个是从外面绑定过来的Tag,一个是Cont ...
- 0428css样式
CSS样式表|-引入的三种方式|--内联样式|----标签内部(空格style)|--内嵌样式|----<head></head>标签内部(<style></ ...