尝试将Parse与跨平台Xamarin应用程序集成时遇到很多问题。最初,我能够使用Xamarin和MvvmCross创建Android应用程序并与Parse服务集成(通过在Xamarin中添加Parse组件来完成)。在开发iOS应用程序时,由于Parse当前不支持Xamarin PCL项目,因此在将Parse依赖项重构为Core PCL项目时遇到了问题。因此,没有可以添加到PCL项目的Parse NuGet包或Xamarin组件。我可以轻松地将Parse组件分别添加到iOS项目和Android项目,但这将需要在两个项目之间进行大量的代码重复。

我读过在Core项目中引用Parse.dll和Parse.NetFx45.dll使我能够在Core项目中使用Parse调用。我做到了,并且能够成功编译所有内容。但是,当我尝试使用ParseClient.Initialize("ApplicationID", "DotNetKey");在Core项目中初始化Parse时,在运行时会得到TypeInitializationException

问题是,将解析服务与Xamarin和MvvmCross跨平台应用程序集成的最佳方法是什么?我以为很多人会这样做,但是找不到参考/示例。绝对不应该在iOS和Android项目中重复执行代码。

最佳答案

这里有一些想法:

首先,如果当前正在项目之间手动复制解析代码更改,则可以通过编写运行脚本将某些文件克隆到其他项目来加快该过程。或者,您也可以编写一个grunt脚本,该脚本在检测到更改时自动复制文件。

现在,这是将解析代码存储在一个项目中但跨平台共享的另一种方法:

问题:我使用的是Shared Project而不是PCL来存放Xamarin.Forms和Parse代码。解析代码工作正常,但是在尝试在XAML的ContentPage中使用自己的自定义ContentView时遇到问题。我想要一个允许我的自定义ContentView以及我的Parse代码一起工作的解决方案-两者都来自同一项目。

解决方案:我现在改用PCL存放Xamarin.Forms和Parse代码。但是有一个小问题。在我解释这个问题之前,只知道它确实可以使用NO Parse代码重复(除了在每个平台的特定项目中使用的Parse初始化代码的一行)。

有什么收获?要注意的是,在您的可移植类库中,您必须根据当时要编译的内容来手动换入和换出Parse.iOS.dll或Parse.Android.dll。

它会增加文件大小吗?否。我使用共享项目(其中使用平台项目的Parse dll的参照资源)与可移植类库(其中您必须在平台项目以及PCL中添加对该dll的引用)对我的应用进行测试这样做没有发现应用文件大小的增加。

以下是当前为我工作的项目结构(为保密起见,项目名称已重命名)。 (仅供参考:我正在使用Xamarin for Mac。)

MyProject.iOS
 - Reference to Parse.iOS.dll
 - Reference to the Portable Class Library
MyProject.Android
 - Reference to Parse.iOS.dll
 - Reference to the Portable Class Library
Portable Class Library
 - Parse Code
 - Xamarin Forms Code
 - Reference to either Parse.iOS.dll or Parse.Android.dll


重要说明:换出PCL中的DLL时,我发现如果右键单击“引用”菜单下的DLL,然后单击“删除”,这会在我的项目中引起问题,因为该项目仍然存在,因此iOS项目将不再编译寻找Parse.Android.dll,反之亦然。我尝试清理解决方案,从解决方案的文件系统删除bin和obj文件夹无济于事。通过执行以下操作,我使它再次起作用:右键单击“引用”,单击“编辑引用”,然后取消选中一个Parse DLL,然后选中另一个。但是,此后,我再次尝试了“删除”方法,并且在编译时没有问题。谁知道,也许这个问题会再次为我解决。

这会变得烦人吗?根据您在平台之间切换的频率,DLL的手动交换可能会或可能不会很烦人。不管这有多烦人,它都比拥有重复的代码更糟。 (也许此交换过程可以使用脚本自动执行?我认为您必须卸载PCL并重新加载它,尽管如果您使用脚本修改.csproj。有人可以挑战吗?或者也许有办法根据要编译的平台对DLL进行条件引用。有人吗?

我希望这有帮助。如果您比目前正在做的事情更喜欢这些想法,请接受此作为答案,并让我们知道您决定采取哪种方式。

07-26 09:01
查看更多