如何使 Parse 与 Xamarin 的 PCL 项目和 MvvmCross 一起工作?

How to make Parse work with Xamarin's PCL project and MvvmCross?

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

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

问题是,将 Parse 服务与 Xamarin 和 MvvmCross 跨平台应用程序集成的最佳方式是什么?我想很多人会这样做,但找不到 references/examples。在 iOS 和 Android 项目中复制代码绝对不是正确的方法。

因此,通过在所有 3 个项目(核心、iOS 和 Android 中引用 Parse.Android.dll,我在 Android 和 iOS 上都运行良好).是的,这听起来很奇怪,但这对我有用。只需转到 Parse download page 并在 Android 部分下载 Xamarin SDK。它也能创造奇迹!没有代码重复,没有混乱:)

为 Mvvmcross 创建一个解析插件不是最好的方法吗?您定义要使用的接口的位置。

并且在每个特定于平台的库中,您引用解析 dll 并调用该方法。所以在你的核心项目中你应该能够调用 IParse.methods...

这里有一些想法:

首先,如果您目前正在手动将 Parse 代码更改从一个项目复制到另一个项目,您可以通过编写一个 运行 将某些文件克隆到另一个项目的脚本来加快该过程。或者您可以编写一个 g运行t 脚本,在检测到更改时自动复制文件。

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

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

解决方案: 我已经切换到现在将我的 Xamarin.Forms 和解析代码放在 PCL 中。但是有一个小问题。在我解释捕获之前,只知道它确实适用于 NO Parse 代码重复(每个平台的特定项目中的一行 Parse 初始化代码除外)。

有什么问题? 问题在于,在您的便携式 class 库中,您必须手动换入和换出 Parse.iOS.dll 或 Parse.Android.dll 取决于你当时编译的目的。

它会增加文件大小吗?不会。我使用共享项目(它使用平台项目对 Parse dll 的引用)与便携式 Class 库(您必须在其中添加对平台项目和 PCL 中的 dll 的引用),并没有发现这样做会增加应用程序文件的大小。

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

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时,我发现如果在References菜单下右击DLL,然后点击Delete,它导致我的项目出现问题,其中 iOS 项目不再编译,因为它仍在寻找 Parse.Android.dll,反之亦然。我尝试清理解决方案,从解决方案的文件系统中删除 bin 和 obj 文件夹,但无济于事。我通过以下操作让它再次工作:右键单击引用,单击编辑引用,然后取消选中一个 Parse DLL 并选中另一个的框。但是,在那之后,我再次尝试了 "Delete" 方法并且编译没有问题。谁知道,也许那个问题会再次出现在我身上。

这不会很烦人吗? 根据您在平台之间切换的频率,手动交换 DLL 可能会也可能不会很烦人。不管这有多烦人,它不会比重复代码更糟糕。 (也许这个交换过程可以用脚本自动完成?我认为如果你用脚本修改 .csproj,你必须卸载 PCL 并重新加载它。有人愿意接受挑战吗?或者也许有一种方法可以根据正在编译的平台对 DLL 进行条件引用。有人有想法吗?)

希望对您有所帮助。如果你更喜欢这些想法中的任何一个,而不是你目前正在做的事情,请接受这个作为答案,并让我们知道你决定采取哪条路线。