Intégrer une interstitielle Tapjoy dans votre projet Xamarin
Je n’ai pas trouvé de SDK tout fait pour Tapjoy mais heureusement, il existe la possibilité de faire un projet de liaison (binding) qui permet de convertir un jar natif en dll.
Créez un projet Android de liaisons
Donc, la première chose à faire est de créer un nouveau projet Android de liaisons.
Inclure le jar de tapjoy
Et définir l’action de génération sur EmbeddedJar
Si vous essayez de compiler, vous aurez des erreurs. Il faut donc gérer les exceptions en définissant des règles dans le fichier metadata.xml du dossier transformations
<metadata> <attr path="/api/package[@name='com.tapjoy']/class [@name='TapjoyCache.CacheAssetThread']/method[@name='call' and count(parameter)=0]" name="managedName">BoolCall</attr> <attr path="/api/package[@name='com.tapjoy']/interface [@name='TJVideoListener']/method[@name='onVideoError']/parameter[@name='p0']" name="name">args</attr> </metadata>
Et ajouter une classe TapjoyCache.cs dans Additions
using System; namespace Com.Tapjoy { public partial class TapjoyCache { public partial class CacheAssetThread { public Java.Lang.Object Call() { return (Java.Lang.Object)this.BoolCall(); } } } }
Vous pouvez compiler votre projet de liaisons.
Google Play Service
Ajouter à votre projet android le package Google Play Service via la gestion des package nugget.
Implémenter Tapjoy via un dependency service
Etant donné que nous travaillons avec un projet cross plateform xamarin.form, jetravaille avec un dependency service. j’ai fait le travail d’implémentation pour Android, il faudrait répéter l’opération pour iOs.
Donc voici notre interface
namespace JitsXamarinTapjoy.Models.Dependency { public interface IInterstitialAd { void connect(); void open(); } }
Dans notre projet Android, voici les trois classes que j’ai implémentés. Il faut veillez à remplacer votre apiKey dans le code lors du connect.
[assembly: Xamarin.Forms.Dependency(typeof(Tapjoy))] namespace JitsXamarinTapjoy.Droid.PlatformSpecific { public class Tapjoy : IInterstitialAd { public void connect() { var context = Application.Context; Java.Util.Hashtable connectFlags = new Java.Util.Hashtable(); connectFlags.Put(Com.Tapjoy.TapjoyConnectFlag.EnableLogging, "true"); var connecttlistener = new TapjoyConnectListner(); Com.Tapjoy.Tapjoy.Connect(context, "Dv0iKe0ETDCkSQWTM639hAEC2oTgord0QvVlnQRmnwp4Cb6bTD_C2Rc6lkbJ", connectFlags, connecttlistener); } public void open() { var placementListener = new TapjoyPlacementListner(); var context = Application.Context; Com.Tapjoy.TJPlacement p = new Com.Tapjoy.TJPlacement(context, "videocado-tapjoy", placementListener); placementListener.SetPlacement(p); p.RequestContent(); } } } public class TapjoyConnectListner : Java.Lang.Object, Com.Tapjoy.ITJConnectListener { //public IntPtr Handle => throw new NotImplementedException(); public void OnConnectFailure() { String test = "test"; //throw new NotImplementedException(); } public void OnConnectSuccess() { String test = "test"; //throw new NotImplementedException(); } } public class TapjoyPlacementListner : Java.Lang.Object, Com.Tapjoy.ITJPlacementListener { private Com.Tapjoy.TJPlacement placement; public void SetPlacement(Com.Tapjoy.TJPlacement placement) { this.placement = placement; } public void OnContentDismiss(TJPlacement p0) { } public void OnContentReady(TJPlacement p0) { this.placement.ShowContent(); } public void OnContentShow(TJPlacement p0) { } public void OnPurchaseRequest(TJPlacement p0, ITJActionRequest p1, string p2) { } public void OnRequestFailure(TJPlacement p0, TJError p1) { } public void OnRequestSuccess(TJPlacement p0) { } public void OnRewardRequest(TJPlacement p0, ITJActionRequest p1, string p2, int p3) { } } }
Maintenant, nous pouvons implémenter l’apparition d’une interstitiel à partir du projet partagé au clique sur un bouton par exemple
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:JitsXamarinTapjoy" x:Class="JitsXamarinTapjoy.MainPage"> <StackLayout> <Label Text="Ouvrir une Interstitiel en cliquant sur le bouton" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" /> <Button x:Name="BtnConnect" Text="Connect"></Button> <Button x:Name="BtnOpen" Text="Open"></Button> </StackLayout> </ContentPage>
Et le code du form
public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); BtnConnect.Clicked += ConnectAdInt; BtnOpen.Clicked += OpenAdInt; } void ConnectAdInt(object sender, EventArgs args) { DependencyService.Get<Models.Dependency.IInterstitialAd>().connect(); } void OpenAdInt(object sender, EventArgs args) { DependencyService.Get<Models.Dependency.IInterstitialAd>().open(); } }
J’ai travaillé avec un bouton qui se connecte et un bouton pour l’apparition. Il suffit de faire la connexion au chargement de l’app.
Voici le résultat
Voir le code source sur github