0

我最近在某些计算机上遇到了一个问题,其中NSBorderlessWindowMask全屏窗口的创建将显示在主屏幕上,而不是screen.frame我提供的。如果我用基本的窗口创建代码创建一个新的 Cocoa 程序,那么全屏窗口就会正确创建。但是,将原始程序的代码减少到工作最小程序的代码仍然会产生不正确的结果。

如果我然后通过在任何地方添加单个字符来更改捆绑标识符,那么也许从那时com.blah.Programcom.blah.tProgram程序可以正常工作。改回原来的包标识符,程序停止正常工作。

我删除了 的所有内容~/Library/Developer/Xcode/,确保没有使用 保存的首选项defaults delete [bundle identifier],删除了 中带有应用程序名称的任何内容~/Library/,然后重新启动计算机而行为没有改变。

所以总而言之,我有一个有问题的应用程序。我将代码减少到可以工作的最小代码,但仍然有问题。我更改了捆绑标识符,程序开始正常工作。我恢复了捆绑标识符,程序停止正常工作。

有问题的最小代码如下代替AppDelegate.m新 Cocoa 程序的默认值,其中单个按钮绑定到选择器pushbutton:

#import "AppDelegate.h"

@interface AppDelegate () {
    NSWindow *_fullScreenWindow;
}

@property (weak) IBOutlet NSWindow *window;
@end

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application
}

- (void)applicationWillTerminate:(NSNotification *)aNotification {
    // Insert code here to tear down your application
}

- (IBAction)pushbutton:(id)sender {
    [self fullScreenWindow];
}

- (void)fullScreenWindow {
    NSArray *screens = [NSScreen screens];
    NSScreen *screen = screens[1];
    NSRect screenFrame = [screen frame];
    NSRect frame = NSMakeRect(0,0,screenFrame.size.width,screenFrame.size.height);
    NSWindow *window = [[NSWindow alloc] initWithContentRect:screenFrame
                                                   styleMask:NSBorderlessWindowMask
                                                     backing:NSBackingStoreBuffered
                                                       defer:YES];
    [window orderFront:nil];
    [window setFrame:screenFrame display:YES animate:NO];

    _fullScreenWindow = window;
}

@end

该代码实际上是无关紧要的,因为无论捆绑标识符如何,我都可以使用NSZeroRectfor来解决问题initWithContentRect:,但是我想知道为什么捆绑标识符会导致给定代码出现此问题,以便我可以确定原始问题是否在某处我更大的代码,Cocoa API 中的一些东西,或者完全是外部的东西。

还有其他地方可以保存系统中的内容吗?其他程序是否可以使用我选择的捆绑标识符更改任何程序的行为,如果是,我将如何找到该程序?还有其他想法吗?

不确定它是否相关,但这与针对 OS X 10.10 的 Yosemite 10.10.2 上的 XCode 6.1.1 相关。

4

1 回答 1

0

我唯一能想到的就是应用程序 Info.plist 上的 Bundle Identifier。也许您可以直接编辑该文件并查看结果如何。

为此,您可以使用 plistbuddy:

/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/YourApplication.app/Contents/Info.plist

或者在脚本上使用它:

a=Finder; mdls -name kMDItemCFBundleIdentifier -raw "$(mdfind kMDItemContentType==com.apple.application-bundle | sed -E $'s|(.*/)(.*)|\\1\t\\2|' | grep -F $'\t'"$a".app -m1 | tr -d '\t')"

我强烈怀疑这与您的代码有关,我看不出是什么原因造成的。

如果您使用可加载捆绑包作为原始捆绑包内部功能的插件,可能会导致这种情况,这可能会对您的问题产生影响。由于您尝试做一个空白项目来对此进行测试,因此这可能不是问题。还是值得一看的。

检查所有资源的链接是否正确并找到,我已经看到链接可能对项目的某些设置产生一些意想不到的影响的实例。

我不认为另一个程序可能会影响或改变您选择的 Bundle Identifier 的行为,唯一可能的情况是两个 Bundle Identifiers 过于密切相关(即使这样也会非常令人惊讶)。

我希望这能给你一些帮助或关于这个问题的新想法。

于 2015-04-08T08:08:19.737 回答