Практика
Кроссплатформенный квест

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Стартовая ::
:: В избранное ::
:: Написать ::
Яндекс.Метрика


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

Итак, задача – разработать приложение для Android и iOS, способное считывать и распознавать QR Code, среда разработки – XE7. После некоторых поисков был найден компонент TKR Bar Code Scanner, который я и решил использовать для реализации данной задачи.

Но для начала нужно было добиться компиляции приложения на девайсы с вышеуказанными ОС, для чего пришлось немного покопаться в настройках проекта. Компиляция под Android работает, что называется "из коробки", а вот для iOS нужно выполнить пару действий в окне настроек проекта.

1. На вкладке Version Info нужно правильно заполнить поля CFBundleIdentifier и CFBundleSignature.


Значения можно посмотреть в своем аккаунте на developer.apple.com.


2. На вкладке Provisioning нужно установить Build Type в значение iOS Device – Debug и заполнить поле Developer Certificate (его значение аналогично полю CFBundleSignature).


Если все сделано правильно, приложение без проблем компилируется под любую из вышеуказанных ОС.

Следующим шагом на форму помещается компонент TKR Bar Code Scanner, после чего снова производится попытка собрать приложение. Android не преподнес никаких сюрпризов, все скомпилировалось и установилось без проблем, а вот при компиляции под iOS возникла неприятная ошибка:

[DCC Error] E2597 ld: cannot link directly with C:\Users\Decoding\Documents\Embarcadero\Studio\SDKs\
  iPhoneOS8.0.sdk/usr/lib/system/libdispatch.dylib. Link against the umbrella framework 'System.framework'
  instead. for architecture armv7

Решение этой проблемы нашлось в интернете и заключается в следующем: файл Macapi.Dispatch.pas копируется из RAD Studio в каталог проекта, подключается и немного модифицируется (меняется значение константы libdispatch):


const
  //libdispatch = '/usr/lib/system/libdispatch.dylib';
  libdispatch = '/usr/lib/libSystem.dylib';

Вновь пытаюсь скомпилировать приложение под iOS, убеждаюсь в том, что вышеупомянутая ошибка E2597 более не возникает, однако это не конец “сюрпризов”, так как теперь предстоит разобраться со следующей ошибкой, вот она:

[PAClient Error] Error: E0264 Unable to execute '"/usr/bin/codesign" --en
  "/Users/Evgeny/PAServer/scratch-dir/Decoding-iOS/ASI.app/Entitlements.plist"
  --deep -s "XXXXXXXXXX" -f "/Users/Evgeny/PAServer/scratch-dir/Decoding-iOS/ASI.app"' (Error 1)

К счастью проблема решается достаточно просто, хотя решение это несколько странно – нужно очистить поле Developer Certificate на вкладке Provisioning в настройках проекта (я упоминал о нем в начале статьи). Теперь проект без проблем компилируется под iOS, чего собственно я и добивался. Но радость моя оказалась не долгой, ровно до того момента, как я решил вновь проверить работоспособность этого решения под Android. Ошибка, которой ругнулась на меня RAD Studio, выглядит следующим образом:

[DCC Error] E2597 c:\Program Files (x86)\Embarcadero\RAD Studio\15.0\PlatformSDKs\android-ndk-r9c\
  toolchains\arm-linux-androideabi-4.6\prebuilt\windows\bin\arm-linux-androideabi-ld.exe: error: cannot find -lSystem

  c:\Program Files (x86)\Embarcadero\RAD Studio\15.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\
    prebuilt\windows\bin\arm-linux-androideabi-ld.exe: C:\0\Android\Debug\Macapi.Dispatch.o:
    in function Macapi::Dispatch::dispatch_queue_create(char*, NativeInt):Macapi.Dispatch
    (.text._ZN6Macapi8Dispatch21dispatch_queue_createEPc9NativeInt+0x4): error: undefined reference to 'dispatch_queue_create'

  c:\Program Files (x86)\Embarcadero\RAD Studio\15.0\PlatformSDKs\android-ndk-r9c\toolchains\arm-linux-androideabi-4.6\
    prebuilt\windows\bin\arm-linux-androideabi-ld.exe: C:\0\Android\Debug\Macapi.Dispatch.o:
    in function Macapi::Dispatch::dispatch_release(NativeInt):Macapi.Dispatch
    (.text._ZN6Macapi8Dispatch16dispatch_releaseE9NativeInt+0x4): error: undefined reference to 'dispatch_release'

[DCC Fatal Error] F2588 Linker error code: 1 ($00000001)

Не трудно догадаться, что проблема вызвана манипуляциями с файлом Macapi.Dispatch.pas. Этот модифицированный файл нужен для компиляции под iOS, но он мешает собрать приложение под Android. Это наводит на мысль о необходимости модификации файла проекта следующим образом:

program Project1;

{$R *.res}

uses
  System.StartUpCopy,
  FMX.Forms,
  Unit1 in 'Unit1.pas' {Form1}
  {$IFDEF IOS}
  , Macapi.Dispatch in 'Macapi.Dispatch.pas'
  {$ENDIF};

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Ну вот, почти добрались до финала. На самом деле, на данном этапе приложение компилируется и устанавливается под обе поддерживаемые мобильные ОС, но есть еще один момент, о котором стоит упомянуть. Похоже, в XE7 есть ошибка, связанная с использованием директив условной компиляции в файле проекта. Если мы дибавим в проект новый модуль ("File" -> "New" -> "Unit - Delphi"), то файл проекта примет следующий, не пригодный для компиляции, вид:

program Project1;

uses
  System.StartUpCopy,
  FMX.Forms,
  {$IFDEF IOS}
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas';

uses
  System.StartUpCopy,
  FMX.Forms,
  Unit1 in 'Unit1.pas' {Form1}
  {$IFDEF IOS}
  , Macapi.Dispatch in 'Macapi.Dispatch.pas'
  {$ENDIF};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Аналогичная ошибка будет и при удалении модулей из проекта. Учитывайте этот момент, так как при всяком изменении состава модулей проекта файл проекта придется приводить в порядок ручками.

Вот, пожалуй, и все. Таким образом и был пройден этот небольшой квест, и если Вы вдруг столкнетесь с аналогичной ситуацией, надеюсь приведенное здесь решение поможет Вам так же, как помогло оно мне. Успехов в программировании!

При использовании материала - ссылка на сайт обязательна