2

有人可以告诉我是否只是在伪代码中使用 CFBundleCopyExecutableURL(CFBundleRef) :

if (CFBundleCopyExecutableURL(MyCFBundleRef) == NULL) {NSLog(@"This app is not supported on this system")};

事实上,是否足以确认一个应用程序是否可以在本地硬件上运行?

我的应用程序的一部分向用户展示了他们的 OSX10.7 系统上的 Applications 文件夹列表,但我希望允许他们拖放(巧妙地!)放置在桌面之类的某个地方的其他应用程序。如果我可以仔细检查他们是否没有尝试引入旧的通用应用程序或通过将操作系统升级到 Lion 时留在他们系统上的类似应用程序,那将会很方便......

我使用了 Apple 提供的一些示例代码来检查标头和当前架构,但是在我尝试过的几个应用程序中失败了:尽管计算机能够运行该程序,但代码返回 false。要查看此代码,请使用“checkexecutablearchitecture”搜索 Xcode 文档,示例代码显示在结果中。我乐观地希望代码已经过时并且现在上面的简单检查就足够了。

谢谢你的帮助!

编辑:我想我已经找到了一个解决方案——当然适合我的场景。我现在正在使用如下的小方法:

-(BOOL)isURLExecutable:(NSURL*)appURL;
{
    CFURLRef bundleURL = CFURLCreateFromFileSystemRepresentation(NULL, (uint8_t*)[[appURL path] UTF8String], strlen((const char *)(uint8_t*)[[appURL path] UTF8String]), true);
    CFArrayRef archArrayRef = CFBundleCopyExecutableArchitecturesForURL(bundleURL);

    BOOL isI386 = [(NSArray*)archArrayRef containsObject:[NSNumber numberWithInt:kCFBundleExecutableArchitectureX86_64]] || [(NSArray*)archArrayRef containsObject:[NSNumber numberWithInt:kCFBundleExecutableArchitectureI386]];

    if (archArrayRef != NULL) {
        if (isI386) {
            return TRUE;
        }
        else {
            return FALSE;
        }
    }
    return FALSE;
}

如果有人可以建议我更好的方法,请做!

托德。

4

0 回答 0