Создание комплекта приложений OSX

Если Вы собираетесь сделать вещи тот путь, Вы хотите разделить свою логику и дизайн, верный.

, Но Вы не должны использовать Присяжного острослова, чтобы сделать это.

Приоритет о мышлении. Я видел, что люди делают шокирующие вещи в Присяжном острослове, и это в конечном счете превращается в людей, разрабатывающих сайты в [1 116] Присяжный острослов, и затем некоторый умник решит, что они должны записать, движок шаблонов в Присяжном острослове (Никогда не недооценивают потенциал немой идеи).

, Если Вы повреждаете свой код в две части и вынуждаете себя придерживаться стандарта, тогда Вы получите намного лучшую производительность.

PageLogic.php

<?php 

  $pageData = (object)(array());  // Handy trick I learnt. 

  /* Logic Goes here */


 $pageData->foo = SomeValue; 

 ob_start(); 
 require("layout.php"); 
 ob_end_flush();

Layout.php

 <html>
   <!-- etc -->
   <?php for ( $i = 1; $i < 10; $i++ ){ ?>
    <?php echo $pageData->foo[$i]; ?>
   <?php } ?>
   <!-- etc -->
</html>

PHP был записан как механизм шаблонной обработки, таким образом, Вы, по крайней мере, должны попытка для использования его для ее разработанной задачи прежде, чем оценить, необходимо ли копаться в Присяжном острослове.

<час>

, Кроме того, если Вы решаете использовать механизм шаблонной обработки, попытка получает тот, который выходит из HTML [1 117] значение по умолчанию , и Вы "отказываетесь" вместо, "подписываются". Вы сохраните себя много головных болей XSS. Присяжный острослов слаб в этом отношении, и из-за этого, существует много довольных-naГЇve шаблоны, записанные в нем.

{if $cond}
    {$dangerous_value}
{else}
    {$equally_dangerous_value}
{/if}

обычно, как идут шаблоны Присяжного острослова. Проблемой является $dangerous_value, может быть произвольный HTML, и это просто приводит к даже [еще 1118] плохие методы кодирования с непрослеживаемым запутанным кодом везде.

Любой шаблонный язык Вы рассматриваете , должен угождать этому беспокойству. например:

{$code_gets_escaped} 
{{$code_gets_escaped_as_a_uri}}
{{{$dangerous_bare_code}}}

Таким образом, Ваши потенциальные дверные проемы для эксплуатации являются легко заметными в шаблоне, в противоположность дверному проему к эксплуатации, являющейся ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ поведение.

80
задан Yogi 20 October 2009 в 19:59
поделиться

3 ответа

Существует два способа создания пакета приложений на MacOSX - легкий и ужасный.

Легкий способ - это просто использовать XCode. Готово.

Проблема в том, что иногда вы не можете этого сделать.

В моем случае я создаю приложение, которое создает другие приложения. Я не могу предположить, что у пользователя установлен XCode. Я также использую MacPorts для сборки библиотек, от которых зависит мое приложение. Мне нужно убедиться, что эти dylibs идут в комплекте с приложением перед его распространением.

Отказ от ответственности: Я совершенно не имею права писать этот пост, все, что в нем написано, было получено от Apple. было почерпнуто из документации Apple, разбор существующих приложений и методом проб и ошибок. Это работает для меня, но, скорее всего, неправильно. Пожалуйста, напишите мне, если у вас есть какие-либо исправления.

Первое, что вы должны знать, это то, что пакет приложений - это просто каталог.
Давайте рассмотрим структуру гипотетического foo.app.

foo.app/
    Contents/
        Info.plist
        MacOS/
            foo
        Resources/
            foo.icns

Info.plist - это обычный XML-файл. Вы можете редактировать его с помощью текстового редактора или приложения Property List Editor, которое поставляется в комплекте с XCode. (Он находится в каталоге /Developer/Applications/Utilities/).

Основные элементы, которые вам нужно включить:

CFBundleName - название приложения.

CFBundleIcon - файл иконки, который должен находиться в каталоге Contents/Resources. Используйте приложение Icon Composer для создания иконки. (Оно также находится в каталоге /Developer/Applications/Utilities/). Вы можете просто перетащить png в его окно, и оно автоматически сгенерирует для вас mip-уровни.

CFBundleExecutable - Имя исполняемого файла, который предположительно находится в подпапке Contents/MacOS/.

Существует множество других опций, перечисленные выше - лишь необходимый минимум. Вот документация Apple Info.plist файле и Структура пакета приложений.

Кроме того, вот пример Info.plist.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleGetInfoString</key>
  <string>Foo</string>
  <key>CFBundleExecutable</key>
  <string>foo</string>
  <key>CFBundleIdentifier</key>
  <string>com.your-company-name.www</string>
  <key>CFBundleName</key>
  <string>foo</string>
  <key>CFBundleIconFile</key>
  <string>foo.icns</string>
  <key>CFBundleShortVersionString</key>
  <string>0.01</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundlePackageType</key>
  <string>APPL</string>
  <key>IFMajorVersion</key>
  <integer>0</integer>
  <key>IFMinorVersion</key>
  <integer>1</integer>
</dict>
</plist>

В идеальном мире вы могли бы просто бросить свой исполняемый файл в каталог Contents/MacOS/ и готово. Однако, если ваше приложение имеет какие-либо нестандартные зависимости dylib, это не сработает. Как и Windows, MacOS поставляется со своим собственным особым видом DLL Hell.

Если вы используете MacPorts для сборки библиотек, которые вы компонуете, местоположение dylibs будет жестко закодировано в вашем исполняемом файле. Если вы запустите приложение на машине, на которой dylibs находятся в точно таком же месте, оно будет работать нормально. Однако у большинства пользователей они не будут установлены; когда они дважды щелкнут по вашему приложению, оно просто упадет.

Перед распространением исполняемого файла вам нужно будет собрать все загружаемые им dylibs и скопировать их в пакет приложения. Вам также нужно будет отредактировать исполняемый файл так, чтобы он искал dylibs в нужном месте, т.е. там, куда вы их скопировали.

Ручное редактирование исполняемого файла звучит опасно, верно? К счастью, есть инструменты командной строки, которые помогут вам.

otool -L executable_name

Эта команда выведет список всех dylibs, от которых зависит ваше приложение. Если вы увидите те, которые НЕ находятся в папке System/Library или usr/lib, именно их вам нужно скопировать в пакет приложения. Скопируйте их в папку /Contents/MacOS/. Далее вам нужно будет отредактировать исполняемый файл, чтобы он использовал новые dylibs.

Во-первых, вам нужно убедиться, что вы соединяете с использованием флага -headerpad_max_install_names. Это гарантирует, что если путь к новым dylib будет длиннее, чем к предыдущим, для них найдется место.

Во-вторых, используйте инструмент install_name_tool для изменения каждого пути к dylib.

install_name_tool -change existing_path_to_dylib @executable_path/blah.dylib executable_name

В качестве практического примера, допустим, ваше приложение использует libSDL, и otool указывает его расположение как "/opt/local/lib/libSDL-1.2.0.dylib".

Сначала скопируйте его в пакет приложения.

cp /opt/local/lib/libSDL-1.2.0.dylib foo.app/Contents/MacOS/

Затем отредактируйте исполняемый файл, чтобы он использовал новое расположение (ПРИМЕЧАНИЕ: убедитесь, что вы собрали его с флагом -headerpad_max_install_names)

install_name_tool -change /opt/local/lib/libSDL-1.2.0.dylib @executable_path/libSDL-1.2.0.dylib foo.app/Contents/MacOS/foo

Фух, мы почти закончили. Теперь есть небольшая проблема с текущим рабочим каталогом.

Когда вы запускаете ваше приложение, текущей директорией будет директория выше той, в которой находится приложение. Например: Если вы поместите foo.app в папку /Applcations, то текущим каталогом при запуске приложения будет папка /Applications. А не /Applications/foo.app/Contents/MacOS/, как вы могли бы ожидать.

Вы можете изменить свое приложение, чтобы учесть это, или вы можете использовать этот волшебный маленький скрипт запуска, который изменит текущий каталог и запустит ваше приложение.

#!/bin/bash
cd "${0%/*}"
./foo

Убедитесь, что вы настроили файл Info.plist так, что CFBundleExecutable указывает на сценарий запуска, а не на предыдущий исполняемый файл.

Хорошо, теперь все готово. К счастью, как только вы узнаете все эти вещи, вы похороните их в сценарии сборки.

127
ответ дан 24 November 2019 в 09:54
поделиться

Есть несколько инструментов с открытым исходным кодом, которые помогают создавать пакеты приложений с зависимыми библиотеками для конкретных сред, например py2app для приложений на основе Python. Если вы не найдете более общего, возможно, вы сможете адаптировать его к своим потребностям.

2
ответ дан 24 November 2019 в 09:54
поделиться

Самое простое решение: создайте один раз проект Xcode, ничего не меняя (т.е. сохраните простое однооконное приложение, которое Xcode создает для вас), соберите его и скопируйте пакет, который он создал для вас. Затем отредактируйте файлы (в частности, Info.plist) в соответствии со своим содержанием и поместите свой собственный бинарник в каталог Contents/MacOS/.

8
ответ дан 24 November 2019 в 09:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: