Как я могу отладить Xamarin watchOS Linker Error - PullRequest
1 голос
/ 14 мая 2019

Я разрабатываю приложение для iOS с использованием форм Xamarin, для которого я создал базовую модель, вокруг которой работают все функции приложения.

Я хотел бы включить простое приложение watchOS, которое позволяет пользователю одновременно работать с одним экземпляром этой модели. Я реализовал некоторый код для обновления модели в приложении watchOS с использованием WCSession (через этот WCSessionManager Class ). Я также повторно использовал некоторый код для реализации таймера из моего проекта Xamarin Forms.

Однако при создании моего решения я сталкиваюсь с ошибкой компоновщика. Я думаю, что это может быть потому, что я ссылался на мой проект Xamarin Forms из моего проекта watchOS, что может быть запрещено. Вот ошибка:

/Users/luketimothy/Projects/TodoQ/TodoQ.Watch/TodoQ.Watch.WatchOSExtension/MTOUCH: Error MT2001: Could not link assemblies. Reason: Error while processing references of 'TodoQWatchWatchOSExtension, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' (MT2001) (TodoQ.Watch.WatchOSExtension)

Файл, на который ссылается ошибка: MTOUCH. Я не уверен, что именно это, но единственное место в моем приложении watchOS, на которое я ссылался в своем коде Xamarin Forms, - это объект:

    using System;
    using System.Collections.Generic;
    using TodoQ.Models;
    using TodoQ.Utilities;
    using WatchConnectivity;
    using WatchKit;

    namespace TodoQ.Watch.WatchOSExtension
    {
        internal class TodoState
        {
            private TodoItem current;
            private ISessionTimer timer;

            public TodoItem Current { get => current; set { current = value; TaskUpdated(this, value); } }

            public event TaskUpdatedEventHandler TaskUpdated;
            public delegate void TaskUpdatedEventHandler(object sender, TodoItem current);

            public event TimerElapsedEventHandler TimerElapsed;
            public delegate void TimerElapsedEventHandler(object sender, TimerElapsedEventArgs current);

            public TodoState()
            {
                WCSessionManager.SharedManager.ApplicationContextUpdated += DidReceiveApplicationContext;

                timer = new PomodoroTimer();

                timer.ProgressUpdate += (object sender, ProgressUpdateEventArgs e) => 
                {
                    TimerElapsed(this, new TimerElapsedEventArgs() { Elapsed = e.Elapsed, EndTime = e.EndTime });
                };

                timer.MilestoneUpdate += (object sender, PomodoroStateID e) =>
                {
                    var audio_file = WKAudioFilePlayerItem.Create(WKAudioFileAsset.Create(new Foundation.NSUrl("ShortBreak.wav")));
                    var audio_player = WKAudioFilePlayer.Create(audio_file);
                    audio_player.Play();
                    WKInterfaceDevice.CurrentDevice.PlayHaptic(WKHapticType.Notification);
                };
            }

            public void DidReceiveApplicationContext(WCSession session, Dictionary<string, object> applicationContext)
            {
                var message = (TodoItem)applicationContext["FocusedItem"];
                if (message != null)
                {
                    Console.WriteLine($"Application context update received : {message.Heading}");
                    Current = message;
                }
            }

            public void StartTimer()
            {
                timer.StartSession();
            }
        }

        public class TimerElapsedEventArgs
        {
            public TimeSpan Elapsed;
            public TimeSpan EndTime;
        }
    }

Итак, мой вопрос. Если это должно быть разрешено, и ошибка является чем-то другим, могу ли я получить некоторую помощь в отслеживании того, что это за MTOUCH и почему он выдает эту ошибку? Если это не разрешено, каково рекомендуемое решение для обмена таким кодом между моим приложением для телефона и моим приложением для часов? Могу ли я положить его в PCL? Должен ли я копировать код между проектами?

1 Ответ

1 голос
/ 15 мая 2019

Вы не должны ссылаться на ваш проект WatchOS на проект Forms.Он должен быть добавлен непосредственно в проект iOS.

И если вы хотите определить общий код для повторного использования.Вы можете создать общую библиотеку: enter image description here

Добавить туда несколько открытых классов:

namespace UtiLibrary
{
    public static class UtiClass
    {
        public static List<Model> datas { get => new List<Model> { new Model { Name = "name" } }; }
    }

    public class Model
    {
        public string Name { set; get; }
    }
}

Затем вы можете использовать ее на каждой платформе, которая ссылается на эту библиотеку..

...