0

Ich erstelle eine WinRT-App (Windows 8.1 und Windows Phone 8.1), in der ich ein AdDuplex-Anzeigensteuerelement auf einer seiner Seiten platziert habe.AdDuplex Ad Control wird weiterhin angezeigt, obwohl es zusammenbricht

Der Benutzer der App kann wählen, die Anzeige (mit einem IAP) zu entfernen. Wenn dies der Fall ist, setze ich die Visibility des AdDuplex-Anzeigensteuerelements auf der Seite ViewModel auf Collapsed.

Dieser Teil funktioniert gut; jedoch, nach einiger Zeit, , während der Benutzer immer noch auf der Seite ist, wird AdDuplex-Anzeigensteuerung plötzlich wieder sichtbar und startet Anzeigen von Anzeigen.

Am Anfang dachte ich, das das Verhalten des IAP ist, wenn CurrentAppSimulator verwenden, obwohl es keinen Sinn für mich gemacht hat, da ich nichts im Code, der auf Visible reagiert Änderungen zu lizenzieren und damit die Einstellung der Steuerung zurück . Doch testete ich license.IsActive für meine "Noad“ Produkt und bekam true, was darauf hinweist, dass die Lizenz gültig ist

Das Folgende ist eine vereinfachte Teil meines Codes.

MyPage.xaml

<ad:AdControl 
    AdUnitId="{StaticResource AdUnitId}" 
    AppKey="{StaticResource AdAppKey}" 
    IsTest="True" 
    CollapseOnError="True" 
    Visibility="{Binding IsNoAdPurchased, Converter={StaticResource BooleanToVisibilityInvertedConverter}}"/> 

MyPageViewModel.cs

private async void RemoveAd() 
{ 
    this.IsNoAdPurchased = await this.storeService.PurchaseProductAsync(Products.NoAd); 
} 

StoreService.cs

#if DEBUG 
using StoreCurrentApp = Windows.ApplicationModel.Store.CurrentAppSimulator; 
#else 
using StoreCurrentApp = Windows.ApplicationModel.Store.CurrentApp; 
#endif 

public sealed class StoreService 
{ 
    public async Task<bool> PurchaseProductAsync(string productId) 
    { 
     try 
     { 
      var purchase = await StoreCurrentApp.RequestProductPurchaseAsync(productId); 
      return purchase.Status == ProductPurchaseStatus.Succeeded || purchase.Status == ProductPurchaseStatus.AlreadyPurchased; 
     } 
     catch (Exception) 
     { 
      // The purchase did not complete because an error occurred. 
      return false; 
     } 
    } 
} 

Antwort

0

Dies war ein Problem mit AdDuplex Ad Control und wurde in Version 9.0.0.13 behoben.

Hinweis: Vergessen Sie nicht, IsTest auf false einzustellen, um das "Produktions" -Verhalten zu sehen.

0

machte ich eine Demo von Ihnen folgen und Sie können sich darauf beziehen.

XAML Teil:

<Page.Resources> 
    <local:MyConverter x:Key="myconverter"></local:MyConverter> 
</Page.Resources> 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <Windows81:AdMediatorControl x:Name="AdMediator" HorizontalAlignment="Left" Height="250" Id="AdMediator-Id-FA61D7FD-4F5F-445D-AB97-DB91618DBC70" Margin="557,287,0,0" VerticalAlignment="Top" Width="300" Visibility="{Binding IsVisible,Converter={StaticResource myconverter}}" /> 
    <Button Name="btn1" Content="Remove ad" Click="RemoveAd" Visibility="Visible" /> 
</Grid> 

Code hinter:

public class Recording : INotifyPropertyChanged 
    { 
     private bool isVisible; 

     public Recording() 
     { 
     } 

     public bool IsVisible 
     { 
      get 
      { 
       return isVisible; 
      } 

      set 
      { 
       if (value != isVisible) 
       { 
        isVisible = value; 
        OnPropertyChanged("IsVisible"); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     public void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

    /// <summary> 
    /// An empty page that can be used on its own or navigated to within a Frame. 
    /// </summary> 
    public sealed partial class MainPage : Page 
    { 
     private Recording recording; 

     public MainPage() 
     { 
      this.InitializeComponent(); 
      Init(); 
      recording = new Recording(); 
      recording.IsVisible = false; 
      this.DataContext = recording; 

     } 

     private async void Init() 
     { 
      StorageFile proxyFile = await Package.Current.InstalledLocation.GetFileAsync("in-app-purchase.xml"); 
      await CurrentAppSimulator.ReloadSimulatorAsync(proxyFile); 
     } 

     public async Task<bool> PurchaseProductAsync(string productId) 
     { 
      try 
      { 
       var purchase = await CurrentAppSimulator.RequestProductPurchaseAsync(productId); 
       return purchase.Status == ProductPurchaseStatus.Succeeded || purchase.Status == ProductPurchaseStatus.AlreadyPurchased; 
      } 
      catch (Exception) 
      { 
       // The purchase did not complete because an error occurred. 
       return false; 
      } 
     } 

     private async void RemoveAd(object sender, RoutedEventArgs e) 
     { 
      recording.IsVisible = await this.PurchaseProductAsync("product2"); 
     } 


    } 

    public class MyConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, string language) 
     { 
      if (value is Boolean && (bool)value) 
      { 
       return Visibility.Collapsed; 
      } 
      else 
      { 
       return Visibility.Visible; 
      } 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, string language) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

Ich habe es getestet und nach dem Kauf des Produkts, wird die Anzeige nicht mehr zeigen.

Auch ich möchte Ihnen raten, eine andere Methode ohne Bindung zu verwenden.

XAML Teil:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <Windows81:AdMediatorControl x:Name="AdMediator" HorizontalAlignment="Left" Height="250" Id="AdMediator-Id-FA61D7FD-4F5F-445D-AB97-DB91618DBC70" Margin="557,287,0,0" VerticalAlignment="Top" Width="300" Visibility="Visible" /> 
     <Button Name="btn1" Content="Remove ad" Click="Button_Click" Visibility="Visible" /> 
</Grid> 

Code hinter:

namespace AdmediatorTest 
{ 
    /// <summary> 
    /// An empty page that can be used on its own or navigated to within a Frame. 
    /// </summary> 
    public sealed partial class MainPage : Page 
    { 
     public MainPage() 
     { 
      this.InitializeComponent(); 
      Init(); 

      LicenseInformation licenseInformation = CurrentAppSimulator.LicenseInformation; 
      if (!licenseInformation.ProductLicenses["product2"].IsActive) 
      { 
       btn1.Visibility = Visibility.Visible; 
      } 
      else 
      { 
       btn1.Visibility = Visibility.Collapsed; 
      } 
     } 

     private async void Init() 
     { 
      StorageFile proxyFile = await Package.Current.InstalledLocation.GetFileAsync("in-app-purchase.xml"); 
      await CurrentAppSimulator.ReloadSimulatorAsync(proxyFile); 
     } 

     private async void Button_Click(object sender, RoutedEventArgs e) 
     { 
      LicenseInformation licenseInformation = CurrentAppSimulator.LicenseInformation; 
      if (!licenseInformation.ProductLicenses["product2"].IsActive) 
      { 
       try 
       { 
        await CurrentAppSimulator.RequestProductPurchaseAsync("product2"); 
        if (licenseInformation.ProductLicenses["product2"].IsActive) 
        { 
         AdMediator.Visibility = Visibility.Collapsed; 
        } 
        else 
        { 
         AdMediator.Visibility = Visibility.Visible; 
        } 
       } 
       catch (Exception) 
       { 
        //rootPage.NotifyUser("Unable to buy " + productName + ".", NotifyType.ErrorMessage); 
       } 
      } 
      else 
      { 
       //rootPage.NotifyUser("You already own " + productName + ".", NotifyType.ErrorMessage); 
      } 
     } 
    } 
} 

Neben fand ich eine awesome video über Anzeige nach IAP entfernen und Sie können auch darauf verweisen.

+0

(1) Das Problem, mit dem ich konfrontiert bin, ist mit AdDuplex nicht AdMediator.Ich habe das letzte nicht versucht, (2) nicht sicher, warum Ihr Ratschlag ist, code-behind anstelle von ViewModels zu verwenden, und wie sie in dieser Situation anders sind, (3) "arbeitet an meiner Maschine" ist für mich nicht sehr hilfreich :), und (4) hier ist eine [Beispiel-App] (https://1drv.ms/u/s!AheKZK3B7g7Fi9xbYjD7_ucTXV2HRg), die das Problem reproduziert (versuchte mein Bestes, um es so ähnlich wie meine App zu machen). – TheBlueSky

Verwandte Themen