如何从__NSCFType解析NSString值?

时间:2015-08-11 17:54:28

标签: objective-c cocoa

我正在尝试获取OSX10的所有启动(登录)应用程序。为此,我编写了这段代码(如下所示):

-(NSMutableArray*)getStartUpApplicaitonPaths{
    // Get the LoginItems list.
    LSSharedFileListRef loginItemsRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
    if (loginItemsRef == nil) return nil;
    // Iterate over the LoginItems.
    NSArray *loginItems = (__bridge NSArray *)LSSharedFileListCopySnapshot(loginItemsRef, nil);

    NSMutableArray* data = [NSMutableArray arrayWithArray:loginItems];

    return data;
}

从上面的代码我得到一个__NSCFType对象的NSMutableArray。当我试图通过转换数组的对象来获取路径时

NSString* file = [NSString stringWithFormat:@"%@", [startupFiles objectAtIndex:0]];

我得到的结果如下:

  

BundleBinding [0x103]网址:   文件:///Applications/iTunes.app/Contents/MacOS/iTunesHelper.app/   包标识符:com.apple.iTunesHelper iTunesHelper

我需要从上面给出的字符串中解析和Identifier的URL。请帮忙。

1 个答案:

答案 0 :(得分:1)

对象类型为:LSSharedFileListItem,仅在头文件中记录。

以下是一些可能有用的代码,它将NSLog()所有文件名:

NSURL *itemURL = [[NSBundle mainBundle] bundleURL];
CFURLRef URLToToggle = (__bridge CFURLRef)itemURL;

LSSharedFileListRef loginItems = LSSharedFileListCreate(kCFAllocatorDefault, kLSSharedFileListSessionLoginItems, /*options*/ NULL);
if (loginItems) {
    UInt32 seed = 0U;
    Boolean found;

    CFArrayRef currentLoginItems = LSSharedFileListCopySnapshot(loginItems,
                                                                &seed);
    const CFIndex count = CFArrayGetCount(currentLoginItems);
    for (CFIndex idx = 0; idx < count; ++idx) {
        LSSharedFileListItemRef item = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(currentLoginItems, idx);
        CFURLRef outURL = NULL;

        const UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
#if (__MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10)
        outURL = LSSharedFileListItemCopyResolvedURL(item, resolutionFlags, /*outError*/ NULL);
        if (outURL == NULL) {
            if (outURL)
                CFRelease(outURL);
            continue;
        }
#else
        OSStatus err = LSSharedFileListItemResolve(item, resolutionFlags, &outURL, /*outRef*/ NULL);
        if (err != noErr || outURL == NULL) {
            if (outURL)
                CFRelease(outURL);
            continue;
        }
#endif
        found = CFEqual(outURL, URLToToggle);
        NSLog(@"%@", outURL);
        CFRelease(outURL);
    }

    CFRelease(currentLoginItems);
    CFRelease(loginItems);
}

我的实例输出:

  

文件:///Volumes/User/dgrassi/Library/PreferencePanes/MouseLocator.prefPane/Contents/Resources/MouseLocatorAgent.app/
  文件:///Applications/iTunes.app/Contents/MacOS/iTunesHelper.app/
  文件:///Applications/Dropbox.app/
  文件:///Library/PreferencePanes/Screens%20Connect.prefPane/Contents/MacOS/Screens%20Connect.app/
  文件:///Library/Application%20Support/EyeTV/EyeTV%20Helper.app/   file:///Applications/Carbon%20Copy%20Cloner.app/Contents/Library/LoginItems/CCC%20User%20Agent.app/

这来自seafile-client