编程实现iPhone 启动项(转载)
如果想让程序自动启动,则需要使用4个方法,一个用来获取启动项的列表,一个用于向里面增加启动项,一个用来从里面移除一个启动项,还有一个用来将里面的启动项解析为URL.
下面的方法用于获取启动项列表:
==================
LSSharedFileListCreate( CFAllocatorRef inAllocator, CFStringRef inListType, CFTypeRef listOptions ) |
==================
参数:
1. inAllocator - CFAllocatorRef,用于创建LSSharedFileListRef . 如果使用NULL则意思是采用默认的创建方法
2. inListType - 创建的列表类型 (在这里会是
kLSSharedFileListSessionLoginItems(当前用户的启动项列表) 或者
kLSSharedFileListGlobalLoginItems (所有用户的启动项列表)).
3. listOptions -其他选项,一般来说就是NULL啦~
==================
第二个方法会在启动项列表中插入一个新的启动项,如果该项已存在,则会根据 insertAfterThisItem 参数指定的位置移动项目
extern LSSharedFileListItemRef LSSharedFileListInsertItemURL( LSSharedFileListRef inList, LSSharedFileListItemRef insertAfterThisItem, CFStringRef inDisplayName, IconRef inIconRef, CFURLRef inURL, CFDictionaryRef inPropertiesToSet, CFArrayRef inPropertiesToClear ) |
==================
参数
1. inList - 我们想要插入启动项的列表.
2. insertAfterThisItem - 指定在哪插,kLSSharedFileListItemBeforeFirst表示最前,kLSSharedFileListItemLast表示最后
3. inDisplayName – 项目的显示明,如果是NULL的话则为应用程序的名字
4. inIconRef –项目的显示图标,如果是NULL的话则为应用程序的图标
5. inURL – 项目的URL,即程序XXX.app的完整地址,包括XXX.app
6. 另外两个你大可不管,留个NULL就好了
===================
第三个方法用于删除
extern OSStatus LSSharedFileListItemRemove( LSSharedFileListRef inList, LSSharedFileListItemRef inItem ) |
===================
参数:
1. inList – 我们想要删除启动项的列表.
2. inItem – 要删除的项
===================
最后一个方法用来解析启动项的 URL,用来检索启动项列表里的东西
extern OSStatus LSSharedFileListItemResolve( LSSharedFileListItemRef inItem, UInt32 inFlags, CFURLRef * outURL, FSRef * outRef ) |
===================
参数:
1. inItem – 我们想要解析的项.
2. inFlags – 只管留空(NULL)就好了.
3. outURL –想要输出的解析项的URL
4. outRef –原始项的 FSRef . 您就继续留空(NULL)吧
====================
那么到了这里我们就可以开始写代码啦~下面的例子让你的程序可以将自己添加到启动项(第一个方法)或者从中删除(第二个方法)
-(void) addAppAsLoginItem{ NSString * appPath = [[NSBundle mainBundle] bundlePath]; //获取程序的路径 // 比如, /Applications/test.app CFURLRef url = (CFURLRef)[NSURL fileURLWithPath:appPath]; // 创建路径的引用 // 我们只为当前用户添加启动项,所以我们用kLSSharedFileListSessionLoginItems // 如果要为全部用户添加,则替换为kLSSharedFileListGlobalLoginItems LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); if (loginItems) { //将项目插入启动表中. LSSharedFileListItemRef item = LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemLast, NULL, NULL, url, NULL, NULL); if (item){ CFRelease(item); } } CFRelease(loginItems); } -(void) deleteAppFromLoginItem{ NSString * appPath = [[NSBundle mainBundle] bundlePath]; //获取程序的路径 // 比如, /Applications/test.app CFURLRef url = (CFURLRef)[NSURL fileURLWithPath:appPath]; // 创建引用. LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); if (loginItems) { UInt32 seedValue; //获取启动项列表并转换为NSArray,这样方便取其中的项 NSArray *loginItemsArray = (NSArray *)LSSharedFileListCopySnapshot(loginItems, &seedValue); int i = 0; for(i ; i< [loginItemsArray count]; i++){ LSSharedFileListItemRef itemRef = (LSSharedFileListItemRef)[loginItemsArray objectAtIndex:i]; //用URL来解析项 if (LSSharedFileListItemResolve(itemRef, 0, (CFURLRef*) &url, NULL) == noErr) { NSString * urlPath = [(NSURL*)url path]; if ([urlPath compare:appPath] == NSOrderedSame){ LSSharedFileListItemRemove(loginItems,itemRef); } } } [loginItemsArray release]; } } |
====================
这就是全部了,那么祝你好运~
====================
后记:
这应该讲非常清楚了,我就不多说了,不过代码还是有可以改进的地方,比如说最后for循环那一段,其实可以用Obj-C中的快速枚举机制来替代,写成下面这个样子:
for(id itemRef in loginItemsArray){ if (LSSharedFileListItemResolve((LSSharedFileListItemRef)itemRef, 0, (CFURLRef*) &url, NULL) == noErr) { NSString * urlPath = [(NSURL*)url path]; if ([urlPath compare:appPath] == NSOrderedSame){ LSSharedFileListItemRemove(loginItems,itemRef); } } } |
这样既用到了Obj-C给的方便的方法,又省去了一个i变量,代码还显得更优雅,何乐而不为呢?
原文地址:http://cocoatutorial.grapewave.com/2010/02/creating-andor-removing-a-login-item/