Integration der Swift-Bibliothek in UE4

Vor kurzem trat das Problem auf, Code, der nur in Swift geschrieben wurde, in ein Projekt auf UE4 zu integrieren. Gleichzeitig wurde die Option "Lassen Sie uns schnell alles in Ziel C umschreiben" nicht berücksichtigt. Ich konnte nirgendwo eine fertige Lösung finden, ich musste, wie so oft, sowohl in der Breite als auch in der Tiefe graben. Das Problem wurde erfolgreich gelöst und um jemand anderem zu helfen, habe ich beschlossen, ein Tutorial zu schreiben.



Wenn Sie Code für die iOS / macOS-Plattform integrieren müssen, wird normalerweise die Bibliotheksassembly als Framework verwendet, das statisch sein muss. Der Code selbst wird in Ziel C geschrieben. Außerdem wird die Abhängigkeit im Projekterstellungsskript MyProject.Build.cswie folgt geschrieben :



if (Target.Platform == UnrealTargetPlatform.IOS)
{
    string ExtraPath = Path.GetFullPath(Path.Combine(ModuleDirectory, "../ThirdParty"));
    PublicAdditionalFrameworks.Add(
        new Framework(
            "MyFramework",
            ExtraPath + "/" + "MyFramework.framework.zip"
        )
    );
}


Bei Swift können Sie versuchen, den gleichen Weg zu gehen, aber es wird ein Problem geben - die Abhängigkeit von einigen Sprachbibliotheken. Die Linkwarnung sieht folgendermaßen aus:



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'


Dann gibt es Standardfehler, dass einige Symbole nicht in Objektdateien gefunden wurden. Sie können versuchen, herauszufinden, wo sich die oben genannten Bibliotheken befinden, und den Pfad zu ihr über die L-Taste angeben. Ich habe mich jedoch für den dynamischen Framework-Typ entschieden, der diese Bibliotheken selbst lädt.



, 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"));
        }
    }
}


Und die Datei ist MyProject_IOS_UPL.xmlwie folgt :



<?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>


Diese Lösung ist eine Art Problemumgehung, bis es in UE4 eine normale dynamische Framework-Unterstützung gibt, aber ich war damit vollkommen zufrieden.




All Articles