Попытка интегрировать Google AdMob в игру libgdx на iOS приводит к "framework not found GoogleUtilities" - PullRequest
0 голосов
/ 09 июля 2020

Я хочу включить рекламу Google в свою игру libgdx. В android это работает просто. Однако в iOS есть некоторые сложности:

Я обновил файл Info.plist.xml своим рекламным идентификатором. Затем я добавил следующие записи в файл robovm. xml:

в элемент <frameworks>:

<!--AdMob-->
<framework>GoogleAppMeasurement</framework>
<framework>GoogleMobileAds</framework>
<framework>GoogleUtilities</framework>
<framework>nanopb</framework>

перед элементом <frameworks>:

<frameworkPaths>
    <path>libs</path>
</frameworkPaths>

В основном файле gradle.build я добавил запись allProjects.ext.robopodsVersion = "2.2.3" и добавил в раздел проекта iOS implementation "com.mobidevelop.robovm:robopods-google-mobile-ads-ios:$robopodsVersion", чтобы этот раздел выглядел так:

project(":ios") {
    apply plugin: "java-library"
    apply plugin: "robovm"


    dependencies {
        implementation project(":core")
        implementation "com.mobidevelop.robovm:robopods-google-mobile-ads-ios:$robopodsVersion"
        api "com.mobidevelop.robovm:robovm-rt:$roboVMVersion"
        api "com.mobidevelop.robovm:robovm-cocoatouch:$roboVMVersion"
        api "com.badlogicgames.gdx:gdx-backend-robovm:$gdxVersion"
        api "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-ios"
        api "com.badlogicgames.gdx:gdx-box2d-platform:$gdxVersion:natives-ios"

    }
}

Затем я загрузил googlemobileadssdkios.zip и поместите его содержимое в папку libs проекта iOS. Содержимое ios / libs выглядит следующим образом:

|- nanopb.xcframework
    |- Info.plist
    |- ios-armv7_arm64
        |- ...
    |- ios-i386_x86_64-simulator
        |- ...
    |- ios-x86_64-maccatalyst
        |- ...
|- PromisesObjC.xcframework
    |- Info.plist
    |- ios-armv7_arm64
        |- ...
    |- ios-i386_x86_64-simulator
        |- ...
    |- ios-x86_64-maccatalyst
        |- ...
|- Licenses
    |- ...
|- GoogleUtilities.xcframework
    |- Info.plist
    |- ios-armv7_arm64
        |- ...
    |- ios-i386_x86_64-simulator
        |- ...
    |- ios-x86_64-maccatalyst
        |- ...
|- GoogleMobileAds.framework
    |- GoogleMobileAds
        |- ...
    |- Headers
        |- ...
    |- Modules
        |- ...
|- GoogleAppMeasurement.framework
    |- GoogleAppMeasurement
        |- ...
    |- Modules
        |- ...

Итак, вкратце: под каждым каталогом .xcframework, помимо этого файла Info.plist, находятся каталоги os-armv7_arm64, ios-i386_x86_64-simulator и ios-x86_64-maccatalyst .

Когда я пытаюсь запустить приложение на симуляторе из Android Studio (используя плагин robovm android studio idea-2.3.10-SNAPSHOT.zip), я получаю следующую ошибку:

[ERROR] 09:12:34.831 ld: framework not found GoogleUtilities
[ERROR] 09:12:34.832 clang: error: linker command failed with exit code 1 (use -v to see invocation)
[ERROR] Couldn't compile app

У меня было подозрение, что это как-то связано с xcframework, которые используются GoogeUtilities, и было подтверждено открытой проблемой https://github.com/MobiVM/robovm/issues/468, которая в основном говорит о том, что в настоящее время нет поддержки xcframworks, но связывается для выпуска https://github.com/MobiVM/robovm/pull/483, который короткими словами описывает, что теперь variant можно указать в элементе элемента <frameworkPaths>.

Теперь для меня вопрос: как продолжить работу с библиотеками и как определить варианты пути, чтобы он мог работать как на устройстве iOS, так и в симуляторе?

1 Ответ

0 голосов
/ 09 июля 2020

Это решило проблему для меня:

В файле robovm.xml замените элемент <frameworkPaths> следующей частью:

<frameworkPaths>
    <path variant="device">arm_libs</path>
    <path variant="simulator">sim_libs</path>
</frameworkPaths>

Обратите внимание, что (также в robovm.xml file) в разделе frameworks мне пришлось добавить следующую часть:

<framework>PromisesObjC</framework>

Используя оболочку в подпроекте ios, создайте два каталога: arm_libs и sim_libs

Go в каталог arm_libs и выполните следующие команды:

cp -r ../libs/GoogleUtilities.xcframework/ios-armv7_arm64/GoogleUtilities.framework .
cp -r ../libs/GoogleAppMeasurement.framework .    
cp -r ../libs/GoogleMobileAds.framework .     
cp -r ../libs/PromisesObjC.xcframework/ios-armv7_arm64/PromisesObjC.framework .
cp -r ../libs/nanopb.xcframework/ios-armv7_arm64/nanopb.framework .            
cp -r ../libs/Licenses . 

Go в каталог sim_libs и выполните следующие команды:

cp -r ../libs/GoogleUtilities.xcframework/ios-i386_x86_64-simulator/GoogleUtilities.framework .
cp -r ../libs/GoogleAppMeasurement.framework .                                                 
cp -r ../libs/GoogleMobileAds.framework .     
cp -r ../libs/Licenses .
cp -r ../libs/PromisesObjC.xcframework/ios-i386_x86_64-simulator/PromisesObjC.framework .
cp -r ../libs/nanopb.xcframework/ios-i386_x86_64-simulator/nanopb.framework .

Это дает следующую структуру:

|- arm_libs
    |- GoogleAppMeasurement.framework
        |- ...
    |- GoogleMobileAds.framework
        |- ...
    |- GoogleUtilities.framework
        |- ...
    |- Licenses
        |- ...
    |- PromisesObjC.framework
        |- ...
    |- nanopb.framework
        |- ...
|- sim_libs
    |- GoogleAppMeasurement.framework
        |- ...
    |- GoogleMobileAds.framework
        |- ...
    |- GoogleUtilities.framework
        |- ...
    |- Licenses
        |- ...
    |- PromisesObjC.framework
        |- ...
    |- nanopb.framework
        |- ...

Теперь работает в симуляторе и на iPhone работает для меня.

...