我正在构建我的第一个目标c库绑定。我正在跟踪微软的这文档。我已经成功地从IronSource.framework中创建了一个fat二进制文件,并使用objective生成了apidefinition和structs,并将我的二进制文件添加到其中。
完成之后,我将绑定库添加到我的xamarin.ios项目中。当我试图从公开的API创建一个类的新实例时,我会得到一个错误。
无法找到类型或命名空间名称'IronSource‘(您是缺少使用指令还是程序集引用?)股票顾问的备份版本(版本1.6\版本代码37\StockAdviserCode\Stock\Stock\Stock.iOS\AdControlViewRenderer.cs 'AdControlViewRenderer.BannerWrapper‘)没有实现继承的抽象成员'ISBannerDelegate.DidClickBanner()’Stock.iOS D:股票顾问的备份版本\版本1.6\版本代码37\StockAdviserCode\Stock\Stock\Stock.iOS\AdControlViewRenderer.cs
我认为我的目标c库和xamarin.ios项目没有正确链接。
我的绑定项目名是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();
}
}//我的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()
{
}
}
}欢迎任何帮助。
发布于 2020-04-10 15:50:12
因此,我能够通过向Xamarin.ios添加胖二进制文件使其工作,并将构建类型从“不复制”更改为“始终复制”,然后使用-cxx -gcc_flags "-L${ProjectDir} -lIronSource -force_load ${ProjectDir}/IronSource.a将链接器添加到胖二进制文件中。
我用这 GitHub回购作为指导。
总的来说,为了设置IronSoruce,我必须在引用中添加dll,将本机框架添加到本机引用,将fat二进制添加到projectdir,并将链接器添加到fat二进制。
https://stackoverflow.com/questions/61001074
复制相似问题