如何调试Xamarin watchOS链接器错误

时间:2019-05-14 18:50:10

标签: c# xamarin xamarin.forms xamarin.ios apple-watch

我正在使用Xamarin Forms开发iOS应用程序,为此我创建了一个核心模型,所有应用程序功能均围绕该模型运行。

我想提供一个简单的watchOS应用程序,该应用程序允许用户随时在此模型的单个实例上进行操作。我已经实现了一些代码,以使用WCSession(通过此WCSessionManager Class)在watchOS App中更新模型。我还重用了一些代码来实现Xamarin Forms项目中的计时器。

但是,在构建解决方案时遇到链接器错误。我认为可能是因为我从我的watchOS项目中引用了我的Xamarin Forms项目,但这可能是不允许的。这是错误:

/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 个答案:

答案 0 :(得分:1)

您不应将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; }
    }
}

然后,您可以在引用该库的每个平台上使用它。