Цель c привязка не загружается в xamarin формы ios - PullRequest
0 голосов
/ 03 апреля 2020

Я создаю свою первую цель c привязку библиотеки. Я слежу за этой документацией от Microsoft. Я успешно создал толстый двоичный файл из IronSource.framework , а также сгенерировал apidefinition и структуры, используя цель sharp ie и добавил к нему свой двоичный файл.

После этого я добавил библиотеку связывания на мой проект xamarin. ios. когда я пытаюсь создать новый экземпляр класса из открытого API, я получаю сообщение об ошибке.

Не удается найти тип или имя пространства имен IronSource (отсутствует директива using или ссылка на сборку?) Stock. iOS D: \ Резервная версия для Stock Adviser \ Версия 1.6 \ Код версии 37 \ StockAdviserCode \ Stock \ Stock \ Stock.iOS \ AdControlViewRenderer.cs

'AdControlViewRenderer.BannerWrapper' делает не реализовывать унаследованный абстрактный член 'ISBannerDelegate.DidClickBanner ()' Stock. iOS D: \ Резервная версия для Stock Adviser \ Версия 1.6 \ Код версии 37 \ StockAdviserCode \ Stock \ Stock \ Stock.iOS \ AdControlViewRenderer.cs

Я думаю, что моя цель c library и xamarin. ios project не связаны должным образом

Имя моего проекта Binding - IronSource, а мои формы xamarin ios имя проекта Stock. iOS

//APIDefinition
    using System;
    using Foundation;
    using ObjCRuntime;
    using UIKit;

namespace IronSource
{

    // @interface ISBannerView : UIView
    [BaseType(typeof(UIView))]
    interface ISBannerView
    {
    }

    // @protocol ISBannerDelegate <NSObject>
    [BaseType(typeof(NSObject))]
    [Model]
    interface ISBannerDelegate
    {
        // @required -(void)bannerDidLoad:(ISBannerView *)bannerView;
        [Abstract]
        [Export("bannerDidLoad:")]
        void BannerDidLoad(ISBannerView bannerView);

        // @required -(void)bannerDidFailToLoadWithError:(NSError *)error;
        [Abstract]
        [Export("bannerDidFailToLoadWithError:")]
        void BannerDidFailToLoadWithError(NSError error);

        // @required -(void)didClickBanner;
        [Abstract]
        [Export("didClickBanner")]
        void DidClickBanner();

        // @required -(void)bannerWillPresentScreen;
        [Abstract]
        [Export("bannerWillPresentScreen")]
        void BannerWillPresentScreen();

        // @required -(void)bannerDidDismissScreen;
        [Abstract]
        [Export("bannerDidDismissScreen")]
        void BannerDidDismissScreen();

        // @required -(void)bannerWillLeaveApplication;
        [Abstract]
        [Export("bannerWillLeaveApplication")]
        void BannerWillLeaveApplication();
    }
}

// my xamarin. ios

using System;
using CoreGraphics;
using Foundation;
using Stock.iOS;
using Stock.Services;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using IronSource;

[assembly: ExportRenderer(typeof(AdControlView), typeof(AdControlViewRenderer))]
namespace Stock.iOS
{

public class AdControlViewRenderer : ViewRenderer
{
    public AdControlViewRenderer()
    { }
    protected AdControlView AdViewControl => (AdControlView)Element;
    protected override void OnElementChanged(ElementChangedEventArgs<View> e)
    {
        base.OnElementChanged(e);
        if (e.OldElement != null || Element == null)
            return;

        IronSource ironSource = new IronSource();

        SetNativeControl();
    }

    private void SetNativeControl()
    {
        try
        {
            BannerWrapper bannerWrapper = new BannerWrapper(ViewController);

            IronSource.SetBannerDelegate(bannerWrapper);

            var bannerSize = new ISBannerSize("BANNER");
            IronSource.LoadBannerWithViewController(ViewController, bannerSize);
            var adview = bannerWrapper.BannerView();
            SetNativeControl(adview);
        }
        catch (Exception ex)
        {

        }
    }
}

public class BannerWrapper : ISBannerDelegate
{
    readonly UIViewController parent;
    ISBannerView bannerView = null;

    public bool DestroyBanner()
    {
        if (bannerView != null)
        {
            IronSource.DestroyBanner(bannerView);
            bannerView = null;
            return true;
        }
        return false;
    }

    public BannerWrapper(UIViewController viewController)
    {
        this.parent = viewController;
    }
    public override void BannerDidClick()
    {
    }

    public override void BannerDidDismissScreen()
    {
    }

    public override void BannerDidFailToLoadWithError(NSError error)
    {
    }

    public ISBannerView BannerView()
    {
        ISBannerView bannerView = new ISBannerView();
        nfloat y = this.parent.View.Frame.Size.Height - (bannerView.Frame.Size.Height / 2);
        if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
        {
            y -= this.parent.View.SafeAreaInsets.Bottom;
        }
        bannerView.Center = new CGPoint(this.parent.View.Frame.Size.Width / 2, y);

        return bannerView;
    }

    public override void BannerDidLoad(ISBannerView bnView)
    {
        InvokeOnMainThread(() =>
        {

            bannerView = bnView;

            nfloat y = this.parent.View.Frame.Size.Height - (bannerView.Frame.Size.Height / 2);
            if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
            {
                y -= this.parent.View.SafeAreaInsets.Bottom;
            }
            bannerView.Center = new CGPoint(this.parent.View.Frame.Size.Width / 2, y);

            this.parent.View.AddSubview(bannerView);

            bannerView.AccessibilityLabel = "bannerContainer";

        });

    }

    public override void BannerWillLeaveApplication()
    {
    }

    public override void BannerWillPresentScreen()
    {
    }
}
}

Любая помощь приветствуется

1 Ответ

0 голосов
/ 10 апреля 2020

Итак, я смог заставить его работать, добавив толстый двоичный файл в Xamarin. ios и изменил тип сборки с «Не копировать» на «Копировать всегда», а затем добавил компоновщик в этот толстый двоичный файл, используя -cxx -gcc_flags "-L${ProjectDir} -lIronSource -force_load ${ProjectDir}/IronSource.a

Я использовал это Репозиторий GitHub для руководства.

В целом, чтобы настроить IronSoruce, мне пришлось добавить dll в ссылках, нативный фреймворк в нативную ссылку, толстый бинарный файл в projectdir и добавьте компоновщик в толстый бинарный файл.

...