Facebook-sdk-for-unity: Fehler beim Erstellen des Unity-Projekts in Xcode (arm64-Funktion nicht 4-Byte-ausgerichtet)

Erstellt am 15. Dez. 2020  ·  18Kommentare  ·  Quelle: facebook/facebook-sdk-for-unity

Checkliste

Umfeld

Beschreiben Sie hier Ihre Entwicklungsumgebung und geben Sie so viele Details wie möglich an. Wenn Sie sie haben, stellen Sie sicher, dass Sie Folgendes angeben:

  • Unity-Editor-Version: 2020.1.0f1
  • Unity SDK-Version: 8.1.1
  • Installationsplattform & Version: iOS|Android-Version (?)

Ziele

Erstellen Sie reibungslos ein Projekt aus Unity und bauen und führen Sie es aus Xcode aus.

Codebeispiele & Details

Ich verwende Firebase SDKs in meinem Projekt. Ich habe die E-Mail-/Passwort-Authentifizierung zum Laufen gebracht und der nächste Schritt war die Implementierung von Facebook SignIn. Alles hat gut funktioniert und es scheint zu funktionieren, da in der Konsole keine Fehler aufgetreten sind und ich alle Dokumentationsschritte befolgt habe. Das Problem beginnt beim Erstellen des Projekts und beim Versuch, es über Xcode auszuführen.

Ich habe alles über ähnliche Fehler gelesen und nichts hat es gelöst. Der Fehler, den ich erhalte, ist:

Aktuelle Nachrichten anzeigen
Undefiniertes Symbol: _OBJC_CLASS_$_GKLocalPlayer

ld: Warnung: arm64-Funktion nicht 4-Byte ausgerichtet: _unwind_tester from /Users/XXX/XXX/XXX/XXX/YYYY/Build_iOS/Libraries/libiPhone-lib.a(unwind_test_arm64.o)
Undefinierte Symbole für Architektur arm64:
"_OBJC_CLASS_$_GKLocalPlayer", referenziert von:
objc-class-ref in libFirebaseCppAuth.a(credential_ios_XXX.o)
ld: Symbol(e) für Architektur arm64 nicht gefunden
clang: error: Linker-Befehl mit Exitcode 1 fehlgeschlagen (verwenden Sie -v, um den Aufruf anzuzeigen)

[BEARBEITEN]
Eine Sache, die mir aufgefallen ist, ist, dass beim Ausführen von "pod --version" im Ordner "Build_iOS" 1.10.0 zurückgegeben wird.

bug

Hilfreichster Kommentar

@snorrsi

Es funktionierte!! Ich kann Ihnen nicht genug danken!

Mir wäre nie aufgefallen, dass ich das Framework an der falschen Stelle hinzugefügt habe.

Für alle, die auch dieses Problem haben, folgen Sie den obigen Schritten von @snorrsi und wenn es dasselbe ist, sollte es funktionieren.

Hier müssen Sie das Gamekit.framework hinzufügen:

photo_2020-12-16 22 53 42

Und vergessen Sie nicht, den Code in der Datei "FIRGameCenterAuthProvider.m" zu bearbeiten.

Alle 18 Kommentare

Hat jemand Informationen zu diesem Thema?

Ich stecke fast einen Tag mit diesem Problem fest, ohne es lösen zu können. Würde mich über etwas Hilfe freuen!

Hallo, ja, ich habe dies für unsere App behoben.
Sie müssen GameKit.framework einschließen
Wenn Sie mehr Probleme bei der Suche nach GKLocalPlayer haben, befindet sich eine Datei im Facebook-SDK, deren Name sich nicht mehr merken kann. Kommentieren Sie alles aus, was mit GKLocalPlayer zu tun hat, der Fallback funktioniert möglicherweise nicht oder es ist wahrscheinlicher, dass Firebase direkt auf GKLocalPlayer verweist

@snorrsi

Danke für die Antwort, obwohl ich bereits einige Themen mit ähnlichen Vorschlägen gelesen habe und sie bei mir nicht funktioniert haben.

Wenn es für Sie keine großen Probleme bereitet, könnten Sie mir genauere Anweisungen geben, was bei Ihnen funktioniert hat?

@Nicokkam Ich denke, Sie sollten die Fehlerbezeichnung entfernen, da dies höchstwahrscheinlich ein Firebase SDK-Fehler und
Habe das gerade aufgeschrieben, als ich deinen Kommentar gesehen habe. Hier kommt's

Fügen Sie GameKit.framework zu Ihrem UnityFramework hinzu, bauen Sie Phasen auf.. Verknüpfen Sie Binärdateien mit Bibliotheken
mach es optional

Suche nach GKLocalPlayer
Ein Ergebnis sollte FIRGameCenterAuthProvider.m sein
Öffne diese Datei
Gehe zu Linie 34

+ (void)getCredentialWithCompletion:(FIRGameCenterCredentialCallback)completion { /** Linking GameKit.framework without using it on macOS results in App Store rejection. Thus we don't link GameKit.framework to our SDK directly. optionalLocalPlayer is used for checking whether the APP that consuming our SDK has linked GameKit.framework. If not, a GameKitNotLinkedError` wird ausgelöst.
*/// Diesen Link in Zeile 41 einfügen .. alles in Zeile 95 auskommentierenwenn (Vervollständigung) {Vervollständigung(nil, [FIRAuthErrorUtils gameKitNotLinkedError]);}Rückkehr;/
...
// zu Zeile 95 Sie müssen jedoch doppelte Kommentare entfernen, ersetzen Sie sie durch / * und * /
}

@Ende

NS_ASSUME_NONNULL_END

*/`

@snorrsi

Ich bekomme einige Fehler, wenn ich das tue, was Sie vorgeschlagen haben.

`/*

  • Copyright 2018 Google
    *
  • Lizenziert unter der Apache-Lizenz, Version 2.0 (die "Lizenz");
  • Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden.
  • Eine Kopie der Lizenz erhalten Sie unter
    *
  • http://www.apache.org/licenses/LICENSE-2.0
    *
  • Sofern nicht gesetzlich vorgeschrieben oder schriftlich vereinbart, ist Software
  • unter der Lizenz vertrieben wird "AS IS" BASIS verteilt wird,
  • OHNE GEWÄHRLEISTUNGEN ODER BEDINGUNGEN JEGLICHER ART, weder ausdrücklich noch stillschweigend.
  • Siehe die Lizenz für die spezifische Sprache, die Berechtigungen regelt und
  • Einschränkungen unter der Lizenz.
    */

import "FirebaseAuth/Sources/Public/FirebaseAuth/FIRGameCenterAuthProvider.h"

importieren

import "FirebaseAuth/Sources/AuthProvider/GameCenter/FIRGameCenterAuthCredential.h"

import "FirebaseAuth/Sources/Utilities/FIRAuthErrorUtils.h"

import "FirebaseAuth/Sources/Utilities/FIRAuthExceptionUtils.h"

NS_ASSUME_NONNULL_BEGIN

@implementierung FIRGameCenterAuthProvider

  • (Instanztyp)init {
    [FIRAuthExceptionUtils
    raiseMethodNotImplementedExceptionWithReason:@"Diese Klasse soll nicht initialisiert werden."];
    Rückgabe null;
    }

  • (void)getCredentialWithCompletion:(FIRGameCenterCredentialCallback)completion {
    / *Das Verknüpfen von GameKit.framework, ohne es unter macOS zu verwenden, führt zur Ablehnung durch den App Store.Daher verknüpfen wir GameKit.framework nicht direkt mit unserem SDK.
    Wenn nicht, aGameKitNotLinkedError wird erhöht.* /
    wenn (Vervollständigung) {
    Vervollständigung(nil, [FIRAuthErrorUtils gameKitNotLinkedError]);
    }
    Rückkehr;
    /*

    GKLocalPlayer *_Nullable optionalLocalPlayer = [[NSClassFromString(@"GKLocalPlayer") alloc] init];

    if (!optionalLocalPlayer) {
    wenn (Vervollständigung) {
    Vervollständigung(nil, [FIRAuthErrorUtils gameKitNotLinkedError]);
    }
    Rückkehr;
    }

    __schwacher GKLocalPlayer *localPlayer = [[optionalLocalPlayer-Klasse] localPlayer];
    if (!localPlayer.isAuthenticated) {
    wenn (Vervollständigung) {
    Vervollständigung(nil, [FIRAuthErrorUtils localPlayerNotAuthenticatedError]);
    }
    Rückkehr;
    }

    [localPlayergeneriereIdentityVerificationSignatureWithCompletionHandler:^(
    NSURL *publicKeyURL, NSData *Signatur, NSData *Salz, uint64_t Zeitstempel,
    NSFehler *Fehler) {
    wenn (Fehler) {
    wenn (Vervollständigung) {
    Vervollständigung (Null, Fehler);
    }
    } anders {
    wenn (Vervollständigung) {

    NSString *displayName = localPlayer.alias;
    

Pragma-Klang-Diagnose-Push

Pragma-Klang-Diagnose ignoriert "-Wdeprecated-declarations"

    FIRGameCenterAuthCredential *credential =
        [[FIRGameCenterAuthCredential alloc] initWithPlayerID:localPlayer.playerID
                                                 publicKeyURL:publicKeyURL
                                                    signature:signature
                                                         salt:salt
                                                    timestamp:timestamp
                                                  displayName:displayName];

Pragma-Klang-Diagnose-Pop

    completion(credential, nil);
  }
}

}];
}
**/
@Ende

NS_ASSUME_NONNULL_END
`

Ich kenne Swift nicht, vielleicht deshalb.

@Nicokkam du musst die Kommentare entfernen .. darf nicht /* und / innerhalb / .. */ haben
Oder Sie entfernen einfach alle Linien

Ab Zeile 34 ändern Sie es in dies unten

+ (void)getCredentialWithCompletion:(FIRGameCenterCredentialCallback)completion {
  /**
   Linking GameKit.framework without using it on macOS results in App Store rejection.
   Thus we don't link GameKit.framework to our SDK directly. `optionalLocalPlayer` is used for
   checking whether the APP that consuming our SDK has linked GameKit.framework. If not, a
   `GameKitNotLinkedError` will be raised.
   **/
    if (completion) {
        completion(nil, [FIRAuthErrorUtils gameKitNotLinkedError]);
    }
    return;
}

<strong i="10">@end</strong>

NS_ASSUME_NONNULL_END


@snorrsi

Ich habe diese Änderungen vorgenommen und das Problem wurde dadurch nicht behoben ... Ich erwäge, eine andere Alternative zur Verwaltung der Anmeldung meiner App zu verwenden.

Aber danke für die Aufmerksamkeit. Falls Ihnen noch etwas einfällt, lassen Sie es mich bitte wissen!

@Nicokkam hast du auch GameKit.framework hinzugefügt?

Ja, habe ich.

image

@Nicokkam Sie fügen das GameKit.framework an der falschen Stelle hinzu.. fügen Sie es zum UnityFramework-Ziel hinzu, nicht zum Unity-iPhone.. das sollte es tun

@Nicokkam Ich denke, Sie sollten die Fehlerbezeichnung entfernen, da dies höchstwahrscheinlich ein Firebase SDK-Fehler und
Habe das gerade aufgeschrieben, als ich deinen Kommentar gesehen habe. Hier kommt's

Fügen Sie GameKit.framework zu Ihrem UnityFramework hinzu, bauen Sie Phasen auf.. Verknüpfen Sie Binärdateien mit Bibliotheken
mach es optional

Suche nach GKLocalPlayer
Ein Ergebnis sollte FIRGameCenterAuthProvider.m sein
Öffne diese Datei
Gehe zu Linie 34

  • (void)getCredentialWithCompletion:(FIRGameCenterCredentialCallback)completion {
    / *Das Verknüpfen von GameKit.framework, ohne es unter macOS zu verwenden, führt zur Ablehnung durch den App Store.Daher verknüpfen wir GameKit.framework nicht direkt mit unserem SDK.
    Wenn nicht, aGameKitNotLinkedError wird erhöht.* /
    wenn (Vervollständigung) {
    Vervollständigung(nil, [FIRAuthErrorUtils gameKitNotLinkedError]);
    }
    Rückkehr;
    }

@Ende

NS_ASSUME_NONNULL_END

Danke funktioniert bei mir! Nochmal danke

@snorrsi

Es funktionierte!! Ich kann Ihnen nicht genug danken!

Mir wäre nie aufgefallen, dass ich das Framework an der falschen Stelle hinzugefügt habe.

Für alle, die auch dieses Problem haben, folgen Sie den obigen Schritten von @snorrsi und wenn es dasselbe ist, sollte es funktionieren.

Hier müssen Sie das Gamekit.framework hinzufügen:

photo_2020-12-16 22 53 42

Und vergessen Sie nicht, den Code in der Datei "FIRGameCenterAuthProvider.m" zu bearbeiten.

Screenshot 2020-12-23 at 11 07 48 AM
Screenshot 2020-12-23 at 11 08 05 AM

Ich habe immer noch das gleiche Problem. Ich verwende FirebaseAuth Email/Facebook/Google, FacebookSDK, GoogleMobileAds, Firebase Storage und Firestore.
Ich habe das befolgt, was @snorrsi vorgeschlagen hat, aber es funktioniert nicht für mich

Außerdem verwende ich dafür unity2019.1.17 und erhalte keine Option für das UnityFramework-Ziel. Wie bekomme ich das hin?
Ich glaube, ich brauche Unity2019.3 oder höher

https://www.fiverr.com/s2/3fee81076a
Ich kann Ihnen bei jedem Typ-Xcode-Fehler helfen

Vorübergehende Korrektur:

[PostProcessBuild]
    public static void OnPostProcessBuildAddFirebaseFile(BuildTarget buildTarget, string pathToBuiltProject)
    {
        if (buildTarget == BuildTarget.iOS)
        {
            // Go get pbxproj file
            string projPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);

            // PBXProject class represents a project build settings file,
            // here is how to read that in.
            PBXProject proj = new PBXProject();
            proj.ReadFromFile(projPath);

            // Copy plist from the project folder to the build folder
            proj.AddFileToBuild(proj.GetUnityMainTargetGuid(), proj.AddFile("GoogleService-Info.plist", "GoogleService-Info.plist"));

            // Write PBXProject object back to the file
            proj.WriteToFile(projPath);
        }
    }

    const string GameKitFrameworkName = "GameKit.framework";
    [PostProcessBuild(101)]
    private static void PostProcessBuild_LinkGameKit(BuildTarget target, string buildPath)
    {
#if UNITY_EDITOR_OSX
        if (target == BuildTarget.iOS)
        {

            string projPath = PBXProject.GetPBXProjectPath(buildPath);
            PBXProject proj = new PBXProject();
            proj.ReadFromString(File.ReadAllText(projPath));

            // embed gamekit into Unity framework target because its used in the facebooksdk
            Debug.Log("Embedding gamekit frameworks into UnityFramework target...");
            string targetGuid = proj.GetUnityFrameworkTargetGuid();

            proj.AddFrameworkToProject(targetGuid, GameKitFrameworkName, true);
            proj.WriteToFile(projPath);
        }
#endif
    }

Wenn Sie zu Firebase 6.16.1 zurückkehren oder zu Facebook 8.1.0 zurückkehren, wird dies wie folgt behoben:
https://github.com/firebase/quickstart-unity/issues/908

Vorübergehende Korrektur:

[PostProcessBuild]
    public static void OnPostProcessBuildAddFirebaseFile(BuildTarget buildTarget, string pathToBuiltProject)
    {
        if (buildTarget == BuildTarget.iOS)
        {
            // Go get pbxproj file
            string projPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);

            // PBXProject class represents a project build settings file,
            // here is how to read that in.
            PBXProject proj = new PBXProject();
            proj.ReadFromFile(projPath);

            // Copy plist from the project folder to the build folder
            proj.AddFileToBuild(proj.GetUnityMainTargetGuid(), proj.AddFile("GoogleService-Info.plist", "GoogleService-Info.plist"));

            // Write PBXProject object back to the file
            proj.WriteToFile(projPath);
        }
    }

    const string GameKitFrameworkName = "GameKit.framework";
    [PostProcessBuild(101)]
    private static void PostProcessBuild_LinkGameKit(BuildTarget target, string buildPath)
    {
#if UNITY_EDITOR_OSX
        if (target == BuildTarget.iOS)
        {

            string projPath = PBXProject.GetPBXProjectPath(buildPath);
            PBXProject proj = new PBXProject();
            proj.ReadFromString(File.ReadAllText(projPath));

            // embed gamekit into Unity framework target because its used in the facebooksdk
            Debug.Log("Embedding gamekit frameworks into UnityFramework target...");
            string targetGuid = proj.GetUnityFrameworkTargetGuid();

            proj.AddFrameworkToProject(targetGuid, GameKitFrameworkName, true);
            proj.WriteToFile(projPath);
        }
#endif
    }

Danke dafür, wo sollte das in meinem Projekt enthalten sein?

Herausgefunden! Musste dieses Skript in ein Editor Verzeichnis hinzufügen, damit es von den Build-Prozessen aufgenommen wird

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen