Facebook-sdk-for-unity: خطأ عند إنشاء مشروع Unity إلى Xcode (لم تتم محاذاة وظيفة arm64 بمقدار 4 بايت)

تم إنشاؤها على ١٥ ديسمبر ٢٠٢٠  ·  18تعليقات  ·  مصدر: facebook/facebook-sdk-for-unity

قائمة تدقيق

بيئة

صِف بيئة التطوير الخاصة بك هنا ، مع إعطاء أكبر قدر ممكن من التفاصيل. إذا كان لديك ، فتأكد من تضمين:

  • إصدار محرر الوحدة: 2020.1.0f1
  • إصدار Unity SDK: 8.1.1
  • منصة التثبيت والإصدار: iOS | إصدار Android (؟)

الأهداف

قم ببناء المشروع بسلاسة من الوحدة وبنائه وتشغيله من Xcode.

عينات وتفاصيل التعليمات البرمجية

أنا أستخدم Firebase SDK في مشروعي. لقد قمت بعمل مصادقة البريد الإلكتروني / كلمة المرور وكانت الخطوة التالية هي تنفيذ تسجيل الدخول إلى Facebook. كل شيء سار بشكل جيد ويبدو أنه يعمل ، نظرًا لعدم وجود أخطاء في وحدة التحكم واتبعت جميع خطوات التوثيق. تبدأ المشكلة عند إنشاء المشروع ومحاولة تشغيله من خلال Xcode.

قرأت كل شيء يتعلق بأخطاء مماثلة ولم يحلها شيء. الخطأ الذي أواجهه هو:

إظهار الرسائل الأخيرة
رمز غير محدد: _OBJC_CLASS _ $ _ GKLocalPlayer

ld: تحذير: وظيفة arm64 ليست محاذاة 4 بايت: _unwind_tester من / المستخدمين/XXX/XXX/XXX/XXX/YYYY/Build_iOS/Libraries/libiPhone-lib.a(unwind_test_arm64.o)
رموز العمارة arm64:
"_OBJC_CLASS _ $ _ GKLocalPlayer" ، مُشار إليه من:
objc-class-ref في libFirebaseCppAuth.a (credential_ios_ XXX.o)
ld: لم يتم العثور على رمز (رموز) للعمارة arm64
clang: خطأ: فشل الأمر linker مع رمز الخروج 1 (استخدم -v لرؤية الاستدعاء)

[تعديل]
شيء واحد لاحظته هو أنه عندما أقوم بتشغيل "pod --version" داخل مجلد "Build_iOS" ، فإنه يعيد 1.10.0.

bug

التعليق الأكثر فائدة

تضمين التغريدة

انها عملت!! لا أستطيع شكرك بما فيه الكفاية!

لم أكن لأدرك أبدًا أنني كنت أقوم بإضافة إطار العمل في المكان الخطأ.

بالنسبة لأي شخص يعاني من هذه المشكلة أيضًا ، اتبع الخطوات الموضحة أعلاه التي قدمها

هذا هو المكان الذي تحتاج فيه إلى إضافة Gamekit.framework:

photo_2020-12-16 22 53 42

ولا تنس تحرير الكود داخل ملف "FIRGameCenterAuthProvider.m".

ال 18 كومينتر

هل لدى أي شخص معلومات عن هذا الموضوع؟

أنا عالق في هذه المشكلة لمدة يوم تقريبًا دون أن أتمكن من حلها. نقدر بعض المساعدة!

مرحبًا ، نعم ، لقد أصلحت هذا لتطبيقنا.
تحتاج إلى تضمين GameKit.framework
إذا واجهتك مشكلة في البحث عن GKLocalPlayer ، فهناك ملف واحد في Facebook sdk ، لا يمكنك تذكر الاسم. قم بالتعليق على كل ما يتعلق بـ GKLocalPlayer ، قد لا يعمل الاحتياطي أو في الواقع من المرجح أن Firebase يشير مباشرة إلى GKLocalPlayer

تضمين التغريدة

شكرًا على الرد ، على الرغم من أنني قرأت بالفعل بعض الموضوعات ذات الاقتراحات المماثلة ولم تعمل معي.

إذا لم تكن مشكلة كبيرة بالنسبة لك ، فهل يمكن أن تعطيني تعليمات أكثر تفصيلاً حول ما نجح معك؟

Nicokkam أعتقد أنه يجب عليك إزالة تسمية الخطأ لأن هذا على الأرجح خطأ Firebase SDK بدلاً من خطأ Facebook SDK.
كنت أكتب هذا بالفعل عندما رأيت تعليقك. من هنا تبدأ

أضف GameKit.framework إلى UnityFramework الخاص بك ، وقم ببناء المراحل .. اربط الثنائي بالمكتبات
اجعلها اختيارية

ابحث عن GKLocalPlayer
يجب أن تكون إحدى النتائج هي FIRGameCenterAuthProvider.m
افتح هذا الملف
انتقل إلى السطر 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. is used for checking whether the APP that consuming our SDK has linked GameKit.framework. If not, a OptionalLocalPlayer
* /// أضف هذا الرابط إلى السطر 41 .. علق على كل شيء في السطر 95إذا (اكتمال) {الانتهاء (لا شيء ، [FIRAuthErrorUtils gameKitNotLinkedError]) ؛}إرجاع؛/
...
// إلى السطر 95 أنت بحاجة إلى إزالة التعليقات المزدوجة بالرغم من ذلك ، استبدل بـ / * و * /
}

@نهاية

NS_ASSUME_NONNULL_END

* / `

تضمين التغريدة

أتلقى بعض الأخطاء في فعل ما اقترحته.

`/ *

  • حقوق الطبع والنشر 2018 Google
    *
  • مُرخصة بموجب ترخيص Apache ، الإصدار 2.0 ("الترخيص") ؛
  • لا يجوز لك استخدام هذا الملف إلا بما يتوافق مع الترخيص.
  • يمكنك الحصول على نسخة من الترخيص على
    *
  • http://www.apache.org/licenses/LICENSE-2.0
    *
  • ما لم يكن مطلوبًا بموجب القانون المعمول به أو تم الاتفاق عليه كتابةً ، البرنامج
  • يتم توزيعها بموجب الترخيص يتم توزيعها على أساس "كما هي" ،
  • بدون ضمانات أو شروط من أي نوع ، سواء كانت صريحة أو ضمنية.
  • راجع الترخيص للحصول على أذونات تحكم لغة معينة و
  • القيود بموجب الترخيص.
    * /

استيراد "FirebaseAuth / Sources / Public / FirebaseAuth / FIRGameCenterAuthProvider.h"

يستورد

استيراد "FirebaseAuth / Sources / AuthProvider / GameCenter / FIRGameCenterAuthCredential.h"

استيراد "FirebaseAuth / Sources / Utilities / FIRAuthErrorUtils.h"

استيراد "FirebaseAuth / Sources / Utilities / FIRAuthExceptionUtils.h"

NS_ASSUME_NONNULL_BEGIN

implementation FIRGameCenterAuthProvider

  • (نوع instancetype) init {
    [FIRAuthExceptionUtils
    liftMethodNotImplementedExceptionWithReason: @ "لا يُقصد بهذه الفئة أن تتم تهيئتها."]؛
    العودة لا شيء
    }

  • (باطل) getCredentialWithCompletion: (FIRGameCenterCredentialCallback) إكمال {
    / *يؤدي ربط GameKit.framework دون استخدامه على macOS إلى رفض App Store.وبالتالي ، فإننا لا نربط GameKit.framework بحزمة SDK الخاصة بنا مباشرةً.
    إذا لم يكن كذلك ، أسيتم جمع GameKitNotLinkedError .* /
    إذا (اكتمال) {
    الانتهاء (لا شيء ، [FIRAuthErrorUtils gameKitNotLinkedError]) ؛
    }
    إرجاع؛
    / *

    GKLocalPlayer * _Nullable OptionalLocalPlayer = [[NSClassFromString (@ "GKLocalPlayer") تخصيص] init]؛

    إذا (! OptionalLocalPlayer) {
    إذا (اكتمال) {
    الانتهاء (لا شيء ، [FIRAuthErrorUtils gameKitNotLinkedError]) ؛
    }
    إرجاع؛
    }

    __weak GKLocalPlayer * localPlayer = [[OptionalLocalPlayer class] localPlayer] ؛
    إذا (! localPlayer.isAuthenticated) {
    إذا (اكتمال) {
    إكمال (لا شيء ، [FIRAuthErrorUtils localPlayerNotAuthenticatedError]) ؛
    }
    إرجاع؛
    }

    [localPlayer createIdentityVerificationSignatureWithCompletionHandler: ^ (
    NSURL * publicKeyURL ، NSData * التوقيع ، NSData * salt ، uint64_t timestamp ،
    NSError * خطأ) {
    إذا (خطأ) {
    إذا (اكتمال) {
    إكمال (لا شيء ، خطأ) ؛
    }
    } آخر {
    إذا (اكتمال) {

    NSString *displayName = localPlayer.alias;
    

دفع التشخيص pragma clang

تم تجاهل تشخيص pragma clang "-Wdeprecated-ads"

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

pragma clang التشخيصي

    completion(credential, nil);
  }
}

}] ؛
}
** /
@نهاية

NS_ASSUME_NONNULL_END
"

لست على دراية بـ Swift ، ربما لهذا السبب.

Nicokkam تحتاج إلى إزالة التعليقات .. لا يمكن أن يكون / * و / داخل / .. * /
أو يمكنك ببساطة إزالة كل الخطوط

من السطر 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` will be raised.
   **/
    if (completion) {
        completion(nil, [FIRAuthErrorUtils gameKitNotLinkedError]);
    }
    return;
}

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

NS_ASSUME_NONNULL_END


تضمين التغريدة

لقد أجريت هذه التغييرات ولم تحل المشكلة ... أفكر في استخدام بديل آخر لإدارة تسجيل الدخول إلى تطبيقي.

لكن شكرا على الاهتمام. إذا كان هناك شيء آخر يخطر ببالك ، فيرجى إبلاغي بذلك!

Nicokkam هل أضفت GameKit.framework أيضًا؟

نعم فعلت.

image

Nicokkam أنت تضيف GameKit.framework في مكان خاطئ .. أضفه إلى هدف UnityFramework ، وليس Unity-iPhone .. الذي يجب أن يفعل ذلك

Nicokkam أعتقد أنه يجب عليك إزالة تسمية الخطأ لأن هذا على الأرجح خطأ Firebase SDK بدلاً من خطأ Facebook SDK.
كنت أكتب هذا بالفعل عندما رأيت تعليقك. من هنا تبدأ

أضف GameKit.framework إلى UnityFramework الخاص بك ، وقم ببناء المراحل .. اربط الثنائي بالمكتبات
اجعلها اختيارية

ابحث عن GKLocalPlayer
يجب أن تكون إحدى النتائج هي FIRGameCenterAuthProvider.m
افتح هذا الملف
انتقل إلى السطر 34

  • (باطل) getCredentialWithCompletion: (FIRGameCenterCredentialCallback) إكمال {
    / *يؤدي ربط GameKit.framework دون استخدامه على macOS إلى رفض App Store.وبالتالي ، فإننا لا نربط GameKit.framework بحزمة SDK الخاصة بنا مباشرةً.
    إذا لم يكن كذلك ، أسيتم جمع GameKitNotLinkedError .* /
    إذا (اكتمال) {
    الانتهاء (لا شيء ، [FIRAuthErrorUtils gameKitNotLinkedError]) ؛
    }
    إرجاع؛
    }

@نهاية

NS_ASSUME_NONNULL_END

شكرا يعمل لي! مرة أخرى شكرا

تضمين التغريدة

انها عملت!! لا أستطيع شكرك بما فيه الكفاية!

لم أكن لأدرك أبدًا أنني كنت أقوم بإضافة إطار العمل في المكان الخطأ.

بالنسبة لأي شخص يعاني من هذه المشكلة أيضًا ، اتبع الخطوات الموضحة أعلاه التي قدمها

هذا هو المكان الذي تحتاج فيه إلى إضافة Gamekit.framework:

photo_2020-12-16 22 53 42

ولا تنس تحرير الكود داخل ملف "FIRGameCenterAuthProvider.m".

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

ما زلت أواجه نفس المشكلة. أنا أستخدم FirebaseAuth Email / Facebook / Google و FacebookSDK و GoogleMobileAds و Firebase Storage و Firestore.
لقد تابعت ما اقترحه snorrsi لكنه لا يعمل معي

كما أنني أستخدم unit2019.1.17 لهذا الغرض ولا أحصل على أي خيار لهدف UnityFramework. كيف أحصل على ذلك؟
أعتقد أنني بحاجة إلى استخدام unit2019.3 أو أعلى

https://www.fiverr.com/s2/3fee81076a
يمكنني مساعدتك في أي نوع من أخطاء xcode

الإصلاح المؤقت:

[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
    }

العودة إلى Firebase 6.16.1 أو الرجوع إلى Facebook 8.1.0 ، قم بإصلاحه وفقًا لهذا:
https://github.com/firebase/quickstart-unity/issues/908

الإصلاح المؤقت:

[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
    }

شكرًا على هذا ، أين يجب تضمين ذلك في مشروعي؟

اكتشفه! اضطررت إلى إضافة هذا البرنامج النصي إلى دليل Editor حتى يتم اختياره بواسطة عمليات الإنشاء

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

charanjeet5ingh picture charanjeet5ingh  ·  6تعليقات

laijingfeng picture laijingfeng  ·  6تعليقات

yasuohasegawa picture yasuohasegawa  ·  4تعليقات

michelleran picture michelleran  ·  4تعليقات

naklow12 picture naklow12  ·  6تعليقات