yandexmobile / yandex-ads-sdk-ios

Yandex Mobile Ads SDK iOS
https://yandex.com/dev/mobile-ads/
Other
40 stars 8 forks source link

target has transitive dependencies that include static binaries #126

Closed yabbi-sdk-developer closed 2 years ago

yabbi-sdk-developer commented 2 years ago

Добрый день. Я разрабатываю кастомный адаптер для медиации YandexMobileAds.

Подключаю через s.dependency 'YandexMobileAds'. Указываю s.source_files = 'YandexAdapter/Classes/**/*' для моих файлов.

При попытке сделать pod install получаю ошибку target has transitive dependencies that include static binaries. Долгими скитаниями по интнернету я выяснил, что ошибка возникает из-за того что библиотека статичная. При попытке подключения YandexMobileAds/Dynamic библиотеку YandexMobileAds Xcode вообще перестает видеть.

Далее я попытался подключить YandexMobileAds в качестве зависимости SPM в свой кастомный framework. Но на этом момент всплыла другая ошибка. При вызове метода present, с указанием моего UIViewController получаю ошибку Incorrect fullscreen view.

Ниже предоставляю код программы:

Рутовый UIViewController в тестовом приложении:


import UIKit
import YandexMobileAdsDynamicFramework

class ViewController: UIViewController {

    let instanse = YandexAdapter()

    @IBAction func load(_ sender: Any) {
        instanse.loadInterstitial()
    }

    @IBAction func show(_ sender: Any) {
        instanse.showInterstitial(self)
    }
}

Мой кастомный адаптер для YandexMobileAds


import UIKit
import YandexMobileAds

public class YandexAdapter: UIViewController {

    var interstitialAd: YMAInterstitialAd!

    public func loadInterstitial() {
        self.interstitialAd = YMAInterstitialAd(adUnitID: "R-M-DEMO-interstitial")
        self.interstitialAd.delegate = self;
        self.interstitialAd.load()
    }

    public func showInterstitial(_ rootViewController:UIViewController) {
        self.interstitialAd.present(from: rootViewController)
    }

}

extension YandexAdapter: YMAInterstitialAdDelegate {
    public func interstitialAdDidLoad(_ interstitialAd: YMAInterstitialAd) {
        print("Ad loaded")
    }

    public func interstitialAdDidFail(toLoad interstitialAd: YMAInterstitialAd, error: Error) {
        print("Loading failed. Error: \(error)")
    }

    public func interstitialAdDidClick(_ interstitialAd: YMAInterstitialAd) {
        print("Ad clicked")
    }

    public func interstitialAd(_ interstitialAd: YMAInterstitialAd, didTrackImpressionWith impressionData: YMAImpressionData?) {
        print("Impression tracked")
    }

    public func interstitialAdWillLeaveApplication(_ interstitialAd: YMAInterstitialAd) {
        print("Will leave application")
    }

    public func interstitialAdDidFail(toPresent interstitialAd: YMAInterstitialAd, error: Error) {
        print("Failed to present interstitial. Error: \(error)")
    }

    public func interstitialAdWillAppear(_ interstitialAd: YMAInterstitialAd) {
        print("Interstitial ad will appear")
    }

    public func interstitialAdDidAppear(_ interstitialAd: YMAInterstitialAd) {
        print("Interstitial ad did appear")
    }

    public func interstitialAdWillDisappear(_ interstitialAd: YMAInterstitialAd) {
        print("Interstitial ad will disappear")
    }

    public func interstitialAdDidDisappear(_ interstitialAd: YMAInterstitialAd) {
        print("Interstitial ad did disappear")
    }

    public func interstitialAd(_ interstitialAd: YMAInterstitialAd, willPresentScreen webBrowser: UIViewController?) {
        print("Interstitial ad will present screen")
    }
}

Прошу помощи с одной из этих проблем, идеально было бы увидеть пример где YandexMobileAds используется как зависимость cocoapods для другого pod-а, либо инструкцию по подключению динамической версии библиотеки. Возможно есть какое-то костыльное решение как конвертировать статическую библиотеку в динамическую?

Версия iOS - 12.0 Версия Xcode - 13.4.1 ПК: MacBook Air (M1, 2020), Версия macOS: 12.4

mobile-ads-github commented 2 years ago

Добрый день, подготовили пример с подключенным SPM и вашим кодом https://github.com/mobile-ads-github/spm_test - interstitial работает Интерстишл выдает ошибку Incorrect fullscreen view, потому что у вас не подключен YandexMobileAdsBundle.bundle в само приложение К сожалению сейчас это необходимо делать руками для корректной работы интерстишла (описано в документации), в будущем релизе оно будет происходить автоматически

Чтобы его добавить просто пронесите YandexMobileAdsBundle.bundle в фазу Copy Bundle Resources как на скриншоте Screenshot 2022-09-27 at 1 48 12 PM

yabbi-sdk-developer commented 1 year ago

Привет! Спустя месяц я смог решить проблему. Проблема была в том, что для делегации методов обратного вызова я использовал отдельный класс, наследованный от YMAInterstitialAdDelegate. В таком случае Instanse класса при вызове всегда будет nil, и колбеки не работают. Если делать все по вашей инструкции, и наследовать класс в котором происходит delegate - все работает! Спасибо за помощь!