Перейти к содержанию
Fire Monkey от А до Я

Дениска

Пользователи
  • Постов

    23
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Дениска

  1. C недавних пор мой старый метод открытия файлов в другом приложении перестал работать на ipad mini и iphone6. Оказалось что Apple ещё с ios 7 представил свой способ передачи файлов Airdrop, он же предоставляет возможность открывать файл в различных приложениях аналогично кнопке Open in. Итак код:

     

    uses
      {$IFDEF IOS}
        iOSapi.UIKit,
        iOSapi.Foundation,
        iOSapi.CoreGraphics,
        FMX.Helpers.iOS,
        Macapi.Helpers,
        Macapi.ObjectiveC
      {$ENDIF};
    procedure Share(const AControl: TControl; filepath: string);
    var
      objects: NSMutableArray;
      controller : UIActivityViewController;
      popoverController: UIPopoverController;
      url: NSURL;
    
      procedure ShowForPhone;
      var
        Window: UIWindow;
      begin
        Window := SharedApplication.keyWindow;
        if (Window <> nil) and (Window.rootViewController <> nil) then
          Window.rootViewController.presentModalViewController(controller, True);
      end;
    
      procedure ShowForPad;
      var
        Window: UIWindow;
        PopoverRect: CGRect;
        AbsolutePos: TPointF;
      begin
        Window := SharedApplication.keyWindow;
        if AControl <> nil then
        begin
          AbsolutePos := AControl.LocalToAbsolute(PointF(0, 0));
          if AControl.Scene <> nil then
            AbsolutePos := AControl.Scene.LocalToScreen(AbsolutePos);
          PopoverRect := CGRectMake(AbsolutePos.X, AbsolutePos.Y, AControl.Width, AControl.Height);
        end
        else
          PopoverRect := CGRectMake(0, 0, 0, 0);
        popoverController := TUIPopoverController.Alloc;
        popoverController.initWithContentViewController(controller);
        popoverController.presentPopoverFromRect(PopoverRect, Window.rootViewController.View, UIPopoverArrowDirectionAny, True);
      end;
    
      procedure ShowActionsSheet;
      begin
        if IsPad then
          ShowForPad
        else
          ShowForPhone;
      end;
    
    begin
      url := TNSURL.Wrap(TNSURL.OCClass.fileURLWithPath(StrToNSStr(filepath)));
      objects := TNSMutableArray.Create;
      objects.addObject((url as ILocalObject).GetObjectID);
      try
        if objects.count > 0 then
        begin
          controller := TUIActivityViewController.alloc;
          controller.initWithActivityItems(objects , nil);
          ShowActionsSheet;
        end;
      finally
        objects.release;
        objects := nil;
      end;
    end;

    Возможно Вы найдёт для себя что-то лишнее или нагромождённое, но заметьте, этот код подходит и для телефона и для планшета и сделан для быстрого  понимания происходящего. Он был "заимствован" и модифицирован из самой RAD Studio из модуля FMX.MediaLibrary.IOS 395 строка. Оригинал же позволял передавать лишь String и TBitmap. Если же Вам нужно передавать именно их, Вы можете открыть этот модуль "C:\Program Files\Embarcadero\Studio\17.0\source\fmx\FMX.MediaLibrary.iOS.pas" и найти в оригинале как это делается.

     

  2. Надеюсь ссылка не будет противоречить правилам форума. 

     

    phi, C++Builder and RAD Studio 10 Seattle

     

    30398 PAServer Hotfix RAD Studio 10 Seattle

     

    Спасибо огромное. Абракадабравцы не дают скачивать незаригестрированным

  3.  

     

    как я понял, так вы можете указать зависимости только от статичных библиотек

    Лично я этого почему-то не понял. Embarcadero об этом не говорит

     

     

    как и когда вы загружаете динамические библиотеки?
     Я их нигде не загружаю. У меня есть функция FakeLoader, но с помощью неё я линкую только статическую библиотеку. У меня вопрос следующего плана: есть ли возможность как-нибудь использовать dylib библиотеки на IOS, если того требует сторонняя SDK? Или, может быть, существует обходной путь.
  4. Господа! Тема очень важная.

    Как использовать сторонние нативные (написанные на Obj-C) фреймворки и SDK в Firemonkey (не дописана).

     

    Имеется SDK, включающий статическую библиотеку, заголовок к ней и кучу классов упрощающих работу с библиотекой.

    1. libSDK.a
    2. SDK.h
    3. class1.h
    4. class1.m
    5. class2.h
    6. class3.m
    7. ...
    8. classN.h
    9. classN.m

    Чтобы упростить себе жизнь, немного покопавшись:

    1. www.youtube.com/watch?v=f7lxkv-sZA0
    2. www.youtube.com/watch?v=5cnY8WNKRwg
    3. ...

    я собрал из этой кучи файлов одну статическую библиотеку MyLib.a.

    (Кому нужно знать как это делается, спрашивайте. Это отдельная тема.)

     

    Как заверяют разработчики этого SDK, для использования этой библиотеки необходимо подключить пару нативных фреймворков и две динамические библиотеки:

    • SystemConfiguration.framework
    • CoreTelephony.framework
    • libstdc++.dylib
    • libz.dylib

    Фреймворки стандартные и уже реализованы в RAD Studio, а библиотеки присутствуют в скачиваемом IOS SDK по пути:

    C:\Users\Username\Documents\Embarcadero\Studio\SDKs\iPhoneOS9.0.sdk\usr\lib.

     

    Embarcadero "побеспокоилась" о подключении сторонних статических библиотек. Создаётся функция (пример взят из сканера баркодов):

     

    implementation

      procedure FakeLoader(произвольное имя); cdecl; external 'MyLib.a' name 'OBJC_CLASS_$_MyClass'; 

     

    Реальная польза этой функции для меня остаётся загадкой, кроме того, что без неё приложение не увидит библиотеки и при попытки обратится к классу выдаст: "ObjectiveC class MyClass could not be found".

     

    Для начала я создал на XCode libHelloWorld.a (думаю не нужно говорить, что она делает).

    Немного покопавшись:

    1. ridingdelphi.blogspot.com/2014/01/the-quest-to-migrate-ios-squarecam-app_3169.html
    2. blog.blong.com/2013/05/delphi-for-ios-some-notes.html

    написал хедер HelloWorld.pas, в котором описал классы и функции хранящиеся в этой библиотеке. Подключил pas в uses  в проекте и всё заработало.

    (Кому нужно знать как это делается, спрашивайте. Это отдельная тема.).

    Решил теперь подключить мою MyLib.a, которую я создал из основе SDK, можно сказать конвертировал. Но она требует две динамические библиотеки, что в случае с HelloWorld не требовалось.

     

    Как подсказывает Embarcadero, мне нужно дописать в мой FakeLoader директиву dependency. Итого:

     

    procedure FakeLoader; cdecl; external 'MyLib.a' name 'OBJC_CLASS_$_MyClass'
      dependency 'libstdc++.dylib', 'libz.dylib';

     

    Но вот тут и нужна Ваша помощь!

     

    Я помещал эти библиотеки прямо в проект, указывал абсолютные пути из MacPC и из моего PC, копировал оригинальные библиотеки из MacPC, писал их с расширением и без, с префиксом "lib" и без. IDE твердит одно:

     
       [DCC Error] E2597 ld: library not found for -llibz.dylib
       [DCC Error] E2597 ld: library not found for -llibstdc++.dylib

     

    Без этих библиотек моя статическая библиотека MyLib.a не компилируется с ошибками:

     
        Error: "blablabla", referenced from: lalalala in MyLib.a(Class1.o);  lalalala in MyLib.a(Class1.o); 
        Error: "qwertyuui", referenced from: olololo in MyLib.a(Class2.o);  olololo in MyLib.a(Class2.o); 
        Error: "abracadabra", referenced from: abcdefjgh in MyLib.a(Class3.o);  abcdefjgh in MyLib.a(Class3.o); 
      ...
     
    Кто сталкивался? Кто знает чем помочь? Пишите. Сейчас мой проект простаивает из-за этой проблемы.

     

  5.  

    Всем доброго дня.
     
    Кто встречался с такой проблемой, помогите разобраться...
    При запуске на телефоне (Meizu MX4 на Flyme(Android 5.0.1)) в режиме разработки также при сборке подписанной версии любой программки, возникает следующая ошибка:
     
    При активации Edit, либо вылетает программа, либо виснет... либо все таки включается клавиатура, но раз на раз..
    пробовал на Sony Z3, на LG G2 там все ок.. как часы. А вот у меня ошибки постоянные.  

     

    Запусти LogCat. Посмотри какие ошибки пишет? У меня тоже после обновления Galaxy Tab до 5.1 проблема при запуске с определённой ориентацией экрана

    getStack: Window{16a35e14 u0 d0 com.xxx.android/com.embarcadero.firemonkey.FMXNativeActivity} couldn't find taskId=45

  6. XE8 Ent.

    Установил Lockbox 2 и 3 с помощью Getit.

    Оба работают на всех платформах кроме ios64.

    Это и меня ошибка или в библиотеках???

    Какая ошибка? У меня тоже не компилировался, показывал ошибку в библиотеках. Я исправил, сейчас работает на ios64

  7. на OnClose формы делаем так: 

     
    procedure TForm2.OnClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action := TCloseAction.caFree;
    end;
     
    и освобождаем форму не Free, а DisposeOf:
     
    Form2 := TForm2.Create(nil);
    Form2.ShowModal;
    Form2.DisposeOf;
  8. implementation
    
    
    uses
      IOUtils
      {$IFDEF IOS}
      ,iOSapi.Foundation, FMX.Platform.Ios, iOSapi.UIKit, Macapi.Helpers
      {$ENDIF}
      ;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      fpath: string;
    begin
      fpath:= TPath.GetDocumentsPath + PathDelim + 'filename.extention';
      OpenIn(fpath);
    end;
    
    
    procedure TForm1.OpenIn(path: string);
      {$IFDEF IOS}
    var
      controller : UIDocumentInteractionController;
      URL: NSURL;
      {$ENDIF}
    begin
      {$IFDEF IOS}
      URL := TNSUrl.Wrap(TNSUrl.OCClass.fileURLWithPath(StrToNSStr(path)));
      controller := TUIDocumentInteractionController.Wrap(
      TUIDocumentInteractionController.OCClass.interactionControllerWithURL(URL));
      controller.presentOpenInMenuFromRect(
          WindowHandleToPlatform(self.Handle).View.frame,
          WindowHandleToPlatform(self.Handle).View,true);
      {$ENDIF}
    end;
  9. Коллега устанавливал на виртуалку Win 7 XE8 - у него всё заработало. У меня же на планшете 4.4.2работает дебаг, а на телефоне 4.2.2 - нет. Я просто стянул его виртуалку и работаю на ней. Походу раз на раз не приходится. Пробуйте устанавливать заново и заново.

  10. А как вы подключаете телефон, к виртуальной машине и USB пробрасываете во внутрь?

    В vmware есть технология, позволяющая подключать периферийные устройства, аналогично подключению принтера или фотика. Давай ближе к сути. Знаешь, что может быть не так? Кстати проверил на симуляторе версии апи 5.0 - лезет ошибка и дебагер запускается. А на симуляторе ниже 5.0 дебагер молчит, но приложение запускается без ошибки.

  11. На виртуальной машине установил XE8 параллельно с XE7. Создал тестовое приложение с ошибкой. Запустил по F9 на телефоне. Отладчик не запускается, ошибку не отлавливает. На Win и  iOS работает. 

     

    Скажите мне, что у Вас работает отладка на андроиде и это не баг XE8, чтоб я вздохнул с облегчением.

  12. Я решил это 2 способами!!

     

    Закрытие приложения по кнопке "Home":

     

    нужно в "...\iOSDevice\Release\myapp.info.plist" после строки "<string>ResourceRules.plist</string>" добавить строку "<key>UIApplicationExitsOnSuspend</key><true/>".

     

    Закрытие приложения по кнопке из приложения:

     

    procedure TForm1.Button1Click(Sender: TObject);

    begin
      Halt(0); //аварийное завершение
    end;
     
     
    Удачи =)
  13. У меня XE7 update1. Я нашёл ещё одну причину такого поведения. Проблема решена. В мобильных платформах вместо Free или Close нужно использовать DisposeOf. 

    http://fire-monkey.ru/topic/10-kak-pravilno-udaliat-kontroly-v-runtime/

  14. Пустое приложение. У меня есть формы: А и B.

    А по кнопке создаёт и показывает B и сразу самоуничтожается:

     

    B := TB.Create(nil);
    B.Show;
    A.Free;
     
    B в свою очередь делает обратное:
     
    A := TA.Create(nil);
    A.Show;
    B.Free;
     
    На Win32 платформе в диспетчере задач память по мере открытия форм не растёт. В iOS 6.1.1 iPhone 3 проследить память я не смог, но после 5-10 открытий форм приложение падает. Вероятнее всего растёт хип (heap). 
     
    Почему тогда не работает FREE?? Как правильно освободить память и уничтожить форму в iOS???
     
    Я нашёл ответ. Если на форме есть картинки, то их нужно: Image1.Bitmap.Assign(nil);
  15. http://fire-monkey.ru/topic/950-xe7-ios-vazhno-vladeltcam-xe7-ne-obnovliat-ios-do-versii-813/

     

    В версии 8.1.3 изменился запуск приложения.

    Величайшее спасибо. Спустя 4 часа лазания от ссылки к ссылке и метода тыка я запустил таки на ios 8.2 своё приложение.

    Это мне помогло - http://blogs.embarcadero.com/ao/2013/05/24/39472

    Только вместо кода:

     

    <?xml version="1.0" encoding="UTF-8"?>

    <plist version="1.0">

    <dict>

    <key>application-identifier</key>

    <string>12345ABCDE.com.example.myapp</string>

    <key>aps-environment</key>

    <string>development</string>

    <key>get-task-allow</key>

    <true/>

    </dict>

    </plist>

     

    я вставил:

     

    <?xml version="1.0" encoding="UTF-8"?>

    <plist version="1.0">

    <dict>

    <key>application-identifier</key>

    <string>12345ABCDE.com.example.myapp</string>

    <key>get-task-allow</key>

    <true/>

    </dict>

    </plist>

  16. Создаю пустой проект в конфигурации AdHoc на девайсе с версией ios 6.1. Великолепно запускается.

     

    Беру ipa и пытаюсь установить его на девайс с версией ios 8.2 (вышедшей 11 марта 2015). Не устанавливается. Просто висит "установка...", а на девайсе иконка с прогрес баром установки доходит до 60-80% и сбрасывается. Потом просто висит иконка из iTunes.

    Этот же пустой проект на девайсе ios 8.2 билдится, но не устанавливается с ошибкой "Unable to install package e800003a".

     

    Что я не так делаю? Скажите как надо так?

     

    PS: все provisioning profiles присутствуют на обеих устройствах. Оба девайса в них добавлены. Мин. версия в проекте ios 6.0.

  17. Мне нужно получить имена (или пути с именами) всех картинок, которые можно просмотреть через галерею (photo library). После, используя эту информацию, получить bitmap определённой картинки.

×
×
  • Создать...