更改应用程序图标

时间:2014-09-16 02:25:30

标签: macos applescript

我正在尝试创建一个生成和应用程序(使用Applescript)的应用程序,到目前为止,我已经通过使用(do shell脚本“osacompile ...”)命令生成正常运行的应用程序。现在,我需要的是一个字符串,它将自动更改生成的应用程序的图标,因为我希望我自己的图标是新生成的应用程序的图标而不是默认的Applet图标。

有什么方法可以解决这个问题?

非常感谢。

埃里克

3 个答案:

答案 0 :(得分:1)

应用程序的图标基于应用程序包内的info.plist显示。有一个名为CFBundleIconFile的键,其值是资源文件夹中图标文件的名称。最简单的方法是保存为应用程序的AppleScript具有图标文件applet.icns,然后将其替换。或者,您可以将自己的图标文件添加到资源文件夹,删除osacompile创建的icns文件,并更改bundle中的info.plist文件。因为您没有示例代码(通常在StackOverflow上需要),所以我无法帮助您。

答案 1 :(得分:1)

假设您已创建了应用包,例如通过:

osascript -o Foo.app foo.applescript

然后您可以简单地覆盖现有的图标文件:

cp -f myicon.icns Foo.app/Contents/Resources/applet.icns

或复制新的图标文件,并更新Info.plist:

rm Foo.app/Contents/Resources/applet.icns
cp myicon.icns Foo.app/Contents/Resources/
plutil -replace CFBundleIconFile -string myicon.icns Foo.app/Contents/Info.plist

答案 2 :(得分:0)

使用来自firefox的privealaged javascript,这会创建带有自定义图标的应用程序,唯一的问题是,每当您点击应用程序时,它会抛出“身份不明的作者”并且不会运行。

但这至少告诉您如何设置自定义图标。感谢@djBazzieWazzie解释以上加上目录。

  _createShortcutMac : function(target, name, id, icon, location) {
      var desktop = dirSvc.get("Desk", Ci.nsIFile);
      this._createBundle(target, name, id, icon, desktop);
  }

  _createBundle : function(target, name, id, icon, location) {
    var contents =
    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
    "<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" +
    "<plist version=\"1.0\">\n" +
    "<dict>\n" +
    "<key>CFBundleExecutable</key>\n" +
    "<string>" + name + "</string>\n" +
    "<key>CFBundleIconFile</key>\n" +
    "<string>" + icon.leafName + "</string>\n" +
    "</dict>\n" +
    "</plist>";

    location.append(name + ".app");
    if (location.exists())
      location.remove(true);
    location.create(Ci.nsIFile.DIRECTORY_TYPE, 0755);

    location.append("Contents");
    location.create(Ci.nsIFile.DIRECTORY_TYPE, 0755);

    var info = location.clone();
    info.append("Info.plist");
    var stream = Cc['@mozilla.org/network/file-output-stream;1'].createInstance(Ci.nsIFileOutputStream);
    stream.init(info, PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE, 0600, 0);
    stream.write(contents, contents.length);
    stream.close();

    var resources = location.clone();
    resources.append("Resources");
    resources.create(Ci.nsIFile.DIRECTORY_TYPE, 0755);
    icon.copyTo(resources, icon.leafName);

    var macos = location.clone();
    macos.append("MacOS");
    macos.create(Ci.nsIFile.DIRECTORY_TYPE, 0755);

    var cmd = "#!/bin/sh\nexec " + target.path + " -webapp ID";
    var script = macos.clone();
    script.append(name);
    stream.init(script, PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE, 0755, 0);
    stream.write(cmd, cmd.length);
    stream.close();
  }