Récemment, le problème est survenu d'intégrer du code écrit uniquement en Swift dans un projet sur UE4. Dans le même temps, l'option "réécrivons rapidement tout en Objective C" n'a pas été envisagée. Je n'ai trouvé nulle part de solution toute faite, j'ai dû, comme cela arrive souvent, creuser à la fois en largeur et en profondeur. La tâche a été résolue avec succès et afin d'aider quelqu'un d'autre, j'ai décidé d'écrire un tutoriel.
Habituellement, si vous avez besoin d'intégrer un code spécifique à la plate-forme iOS / macOS, vous utilisez l'assembly de bibliothèque comme Framework, qui doit être statique. Le code lui-même est écrit en Objective C.En outre, la dépendance est écrite dans le script de construction du projet MyProject.Build.cs
, par exemple, comme ceci:
if (Target.Platform == UnrealTargetPlatform.IOS)
{
string ExtraPath = Path.GetFullPath(Path.Combine(ModuleDirectory, "../ThirdParty"));
PublicAdditionalFrameworks.Add(
new Framework(
"MyFramework",
ExtraPath + "/" + "MyFramework.framework.zip"
)
);
}
Pour Swift, vous pouvez essayer de suivre la même voie, mais il y aura un problème - la dépendance à certaines bibliothèques de langues. L'avertissement de lien ressemblera à ceci:
ld: warning: Could not find auto-linked library 'swiftFoundation'
ld: warning: Could not find auto-linked library 'swiftDarwin'
ld: warning: Could not find auto-linked library 'swiftCoreFoundation'
ld: warning: Could not find auto-linked library 'swiftCore'
ld: warning: Could not find auto-linked library 'swiftCoreGraphics'
ld: warning: Could not find auto-linked library 'swiftObjectiveC'
ld: warning: Could not find auto-linked library 'swiftDispatch'
ld: warning: Could not find auto-linked library 'swiftSwiftOnoneSupport'
Après cela, des erreurs standard suivront que certains symboles n'ont pas été trouvés dans les fichiers objets. Vous pouvez essayer de trouver où se trouve chaque bibliothèque mentionnée ci-dessus et spécifier le chemin d'accès à celle-ci via la touche L, mais j'ai décidé de passer au type dynamique Framework, qui chargera lui-même ces bibliothèques.
, iOS :
dyld: Library not loaded: @rpath/MyFramework.framework/MyFramework
Referenced from: /private/var/mobile/Containers/Bundle/Application/.../MyApp.app/MyApp
Reason: image not found
, UE4 Framework, . IOS Toolchain , IOSPlugin.
plist
, , :
<iosPListUpdates>
<addElements tag="dict" once="true">
<key>NSCameraUsageDescription</key>
<string>The camera is used for live preview.</string>
</addElements>
</iosPListUpdates>
copyDir
. , , :
<init>
<log text="Copy MyFramwork..."/>
<copyDir src="/.../MyFramework.framework" dst="$S(BuildDir)/Frameworks/MyFramework.framework" />
</init>
, init
. .
MyProject.Build.cs
:
using UnrealBuildTool;
using System.IO;
public class MyProject : ModuleRules
{
public MyProject(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
if (Target.Platform == UnrealTargetPlatform.IOS)
{
string ExtraPath = Path.GetFullPath(Path.Combine(ModuleDirectory, "../ThirdParty"));
PublicAdditionalFrameworks.Add(
new Framework(
"MyFramework",
ExtraPath + "/" + "MyFramework.framework.zip"
)
);
string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory, Target.RelativeEnginePath);
AdditionalPropertiesForReceipt.Add("IOSPlugin", Path.Combine(PluginPath, "MyProject_IOS_UPL.xml"));
}
}
}
Et le fichier est MyProject_IOS_UPL.xml
comme ceci:
<?xml version="1.0" encoding="utf-8"?>
<root>
<init>
<log text="Copy MyFramework..."/>
<copyDir src="/.../MyFramework.framework" dst="$S(BuildDir)/Frameworks/MyFramework.framework" />
</init>
</root>
Cette solution est une sorte de solution de contournement jusqu'à ce qu'il y ait un support de Framework dynamique normal dans UE4, mais j'en étais complètement satisfait.