Search code examples
androidiosdelphidelphi-xe8

Multi-Device Application with platform specific inclusions in the uses clause for Delphi XE8


I have an mobile application written in Delphi XE8 that I can deploy to either Android or iOS from two separate projects. The only reason for maintaining separate projects is the different destination platforms have different "uses" sections that will not compile ...

With ANDROID as the destination :

uses 
  ...
  FMX.Layouts, FMX.ListView,
  FMX.PhoneDialer,
  IdURI,
  Androidapi.JNIBridge,
  Androidapi.JNI.Provider,
  AndroidApi.Jni.GraphicsContentViewText,
  Androidapi.JNI.Net,
  Androidapi.JNI.JavaTypes, Androidapi.JNI.Telephony,
  AndroidAPI.Helpers,
  AndroidApi.Jni.App,
  Androidapi.IOUtils, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, Data.DBXDataSnap, IPPeerClient, ... ;

With IOS as the destination :

uses 
...
  FMX.Layouts, FMX.ListView,
  FMX.PhoneDialer,
  ///// iOS Only ///////////
  MacApi.Helpers, iOSapi.UIKit,
  ///// iOS Only ///////////
  IdURI, IdSSLOpenSSLHeaders_Static,
  System.IOUtils,
  IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, Data.DBXDataSnap, IPPeerClient, ... ;

I have tried placing {ifdef IOS} uses ... {Else} uses .... {EndIf IOS} to define two separate uses statements for two different destination platforms, but that would not compile.

Any helpful advice would be greatly appreciated. -- ImageBASE


Solution

  • As TLama pointed out, it appears you're missing the $ character. Without it, these are treated merely as comments. What you should do is...

    {$IFDEF IOS}
    ...
    {$ELSE}
    ...
    {$ENDIF}
    

    Or:

    {$IFDEF IOS}
    ...
    {$ENDIF}
    {$IFDEF ANDROID}
    ...
    {$ENDIF}
    

    For example:

    uses 
    ...
      FMX.Layouts, FMX.ListView,
      FMX.PhoneDialer,
      {$IFDEF IOS}
      ///// iOS Only ///////////
      MacApi.Helpers, iOSapi.UIKit,
        {$IFDEF CPUARM}
      // iOS Devices Only
      IdSSLOpenSSLHeaders_Static,
      // iOS Devices Only
        {$ENDIF}
      ///// iOS Only ///////////
      {$ENDIF}
      {$IFDEF ANDROID}
      ///// Android Only ///////////
      Androidapi.JNIBridge,
      Androidapi.JNI.Provider,
      AndroidApi.Jni.GraphicsContentViewText,
      Androidapi.JNI.Net,
      Androidapi.JNI.JavaTypes, Androidapi.JNI.Telephony,
      AndroidAPI.Helpers,
      AndroidApi.Jni.App,
      Androidapi.IOUtils,
      ///// Android Only ///////////
      {$ENDIF}
      IdURI,
      System.IOUtils,
      IdBaseComponent, IdComponent, IdTCPConnection,
      IdTCPClient, IdHTTP, Data.DBXDataSnap, IPPeerClient, ... ;