Nano Hash - криптовалюты, майнинг, программирование

Xamarin SKPaymentQueue AddPayment, выбрасывающее исключение

В моем приложении Xamarin, когда я вызываю этот метод

private void MakePayment (SKProduct product)
{
    SKPayment payment = SKPayment.PaymentWithProduct (product);
    SKPaymentQueue.DefaultQueue.AddPayment (payment);
}

Я получаю такую ​​ошибку:

Не удалось выполнить маршалинг объекта Objective-C 0x14607110 (тип: SKPaymentTransaction). Не удалось найти существующий управляемый экземпляр для этого объекта или создать новый управляемый экземпляр (поскольку тип «MonoTouch.StoreKit.SKPaymentTransaction []» не имеет конструктора, который принимает один аргумент IntPtr).

Я не уверен, что у меня что-то настроено неправильно или есть проблема в моем коде или Xamarin.

Вот код для Observer

internal class CustomPaymentObserver : SKPaymentTransactionObserver
{
    private InAppPurchase inAppPurchase;

    public CustomPaymentObserver (InAppPurchase inAppPurchase)
    {
        this.inAppPurchase = inAppPurchase;
    }

    public override void UpdatedTransactions (SKPaymentQueue queue, SKPaymentTransaction[] transactions)
    {
        Console.WriteLine ("UpdatedTransactions");
        foreach (SKPaymentTransaction transaction in transactions) {
            switch (transaction.TransactionState) {
            case SKPaymentTransactionState.Purchased:
                inAppPurchase.CompleteTransaction (transaction);
                break;
            case SKPaymentTransactionState.Failed:
                inAppPurchase.FailedTransaction (transaction);
                break;
            default:
                break;
            }
        }
    }

    public override void PaymentQueueRestoreCompletedTransactionsFinished (SKPaymentQueue queue)
    {
    }

    public override void RestoreCompletedTransactionsFailedWithError (SKPaymentQueue queue, NSError error)
    {
    }
}

Вот полная трассировка стека:

System.Exception: Failed to marshal the Objective-C object 0x17ecb680 (type: SKPaymentTransaction). Could not find an existing managed instance for this object, nor was it possible to create a new managed instance (because the type 'MonoTouch.StoreKit.SKPaymentTransaction[]' does not have a constructor that takes one IntPtr argument).
at MonoTouch.ObjCRuntime.Runtime.MissingCtor (IntPtr ptr, IntPtr klass, System.Type type, MissingCtorResolution resolution) [0x00046] in /Developer/MonoTouch/Source/monotouch/src/ObjCRuntime/.pp-Runtime.cs:352
at MonoTouch.ObjCRuntime.Runtime.ConstructNSObject[NSObject] (IntPtr ptr, System.Type type, MissingCtorResolution missingCtorResolution) [0x00000] in :0
at MonoTouch.ObjCRuntime.Runtime.GetNSObject (IntPtr ptr, System.Type target_type, MissingCtorResolution missingCtorResolution, System.Boolean& created) [0x00073] in /Developer/MonoTouch/Source/monotouch/src/ObjCRuntime/.pp-Runtime.cs:514
at MonoTouch.ObjCRuntime.Runtime.GetNSObjectWrapped (IntPtr ptr, IntPtr type_ptr, System.Boolean& created) [0x0000c] in /Developer/MonoTouch/Source/monotouch/src/ObjCRuntime/.pp-Runtime.cs:686
at at (wrapper native-to-managed) MonoTouch.ObjCRuntime.Runtime:GetNSObjectWrapped (intptr,intptr,int&)
at at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:void_objc_msgSend_IntPtr (intptr,intptr,intptr)
at MonoTouch.StoreKit.SKPaymentQueue.AddPayment (MonoTouch.StoreKit.SKPayment payment) [0x00014] in /Developer/MonoTouch/Source/monotouch/src/StoreKit/.pp-SKPaymentQueue.g.cs:109
at IOS.Util.IAP.InAppPurchase.ReceivedResponse (MonoTouch.StoreKit.SKProductsRequest request, MonoTouch.StoreKit.SKProductsResponse response) [0x0001d] in /Users/aaron/Projects/budget-ease-xamarin/IOS/Util/IAP/InAppPurchase.cs:43
at at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/.pp-UIApplication.cs:38
at IOS.Application.Main (System.String[] args) [0x00008] in /Users/aaron/Projects/budget-ease-xamarin/IOS/Main.cs:16

  • SKPaymentTransaction[] используется в UpdatedTransactions методе SKPaymentTransactionObserver, можете ли вы опубликовать свой код для наблюдателя? 19.12.2013
  • Я добавил код наблюдателя и полную трассировку стека. Однако, похоже, это не доходит до наблюдателя. 19.12.2013
  • Похоже, это связано с поведением компоновщика в проекте. Я изменил его на "Не связывать", и теперь я не получаю эту ошибку. Должен ли я иметь его на "Не связывать"? 19.12.2013
  • Я бы просто использовал Link SDK Assemblies Only, вы все связывали? 20.12.2013
  • Я использовал только сборки Link SDK, и похоже, что компоновщик удалял конструктор, упомянутый в сообщении об ошибке. Я не знаю почему, но удаление Xamarin и MonoTouch и переустановка, похоже, устранили это. 21.12.2013

Ответы:


1

Здесь произошло то, что экземпляр C # вашего CustomPaymentObserver получил сборщик мусора, в то время как его собственный («Objective-C») экземпляр остался. Когда уведомление было наконец доставлено, собственный объект попытался вызвать теперь мертвый объект C # и вылетел из вашего приложения.

Чтобы обойти это, оставьте ссылку на свой CustomPaymentObserver, например. в вашем AppDelegate, чтобы он оставался живым.

Я не уверен, что это где-то задокументировано для Xamarin.iOS (не удалось найти что-то при быстром просмотре), но я считаю, что это очень похоже на Xamarin.Droid (например, http://developer.xamarin.com/guides/android/advanced_topics/garbage_collection/)

21.01.2015

2

Я не совсем уверен, что было причиной этого. Я подумал, что это, возможно, связано с компоновщиком. Но я полностью удалил Xamarin со своего Mac (включая все вещи MonoTouch) и переустановил все, и теперь он работает.

19.12.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..