跨 Android/iOS 的 Xamarin 通用 Xamarin.Forms 代码

Posted

技术标签:

【中文标题】跨 Android/iOS 的 Xamarin 通用 Xamarin.Forms 代码【英文标题】:Xamarin common Xamarin.Forms code across Android/iOS 【发布时间】:2016-08-16 15:19:08 【问题描述】:

我希望在 Visual Studio 2015 中创建一个 Xamarin Forms PCL,它代表 Xamarin android 项目和 Xamarin ios 项目的通用应用程序代码(但不是其他任何东西,即:Windows 或 Windows 手机)。我目前正在使用 PCL 配置文件 111,它是由提供的 Xamarin 模板创建的。

在我遇到对 System.IO.FileStream 的支持之前,一切都很好。基于这篇文章(在保存和加载文件部分): https://developer.xamarin.com/guides/xamarin-forms/working-with/files/

Android 和 iOS 都可以直接使用 System.IO 的大部分内容,这在我的 Android 和 iOS 项目中很明显,我可以同样使用 FileStream 来读取/写入文件。

由于代码是相同的,将它维护在一个地方会更有意义,但我似乎无法找到可以执行此操作的配置文件(或 Visual Studio 模板),有什么想法吗?

我还浏览了这里: http://blog.stephencleary.com/2012/05/framework-profiles-in-net.html

但可移植类库配置文件表未提及 Xamarin/Android/iOS。

难道没有比 111 更窄的 PCL 配置文件可以提供我想要的吗?我唯一的选择是使用 DependencyService 设置吗?也许共享代码项目会更干净?

编辑:虽然我提到 FileStream 作为我正在尝试做的一个例子,但我想解决维护 Android/iOS 的任何通用代码的问题(并且仅限于那些平台,不是 Windows/Windows Phone/Silverlight/ASP.NET 等),适用于 Android 和 iOS 支持使用通用代码的功能,但其他平台之一不支持的任何情况。

【问题讨论】:

【参考方案1】:

您可以使用PCLStorage Library 进行跨平台IO:

public async Task PCLStorageSample()

    IFolder rootFolder = FileSystem.Current.LocalStorage;
    IFolder folder = await rootFolder.CreateFolderAsync("MySubFolder",
        CreationCollisionOption.OpenIfExists);
    IFile file = await folder.CreateFileAsync("answer.txt",
        CreationCollisionOption.ReplaceExisting);
    await file.WriteAllTextAsync("42");

【讨论】:

请看我的编辑。虽然这解决了文件 IO 的问题,但它并没有解决针对其他通用代码场景更狭隘地针对 Android/iOS 的问题。 @ckemper:所以您正在寻找适用于所有类的通用解决方案? 是的,我希望在一个地方编写任何适用于 Android 和 iOS 的通用代码,但我使用的当前 PCL 配置文件会自动针对不支持的 Windows Phone(和其他平台)某些功能,因此不允许我使用它们。【参考方案2】:

我认为你应该试试File System Plugin(Xamarin 组件)

Xamarin 和 Windows 的文件系统插件提供了一致的、 适用于 .NET、Windows Phone、Windows 的可移植本地文件 IO API 集 商店、Xamarin.iOS、Xamarin.Android 和 Silverlight。这使它 更容易创建跨平台的 .NET 库和应用程序。

这是一个示例

public async Task CreateRealFileAsync()
  // get hold of the file system IFolder
 rootFolder = FileSystem.Current.LocalStorage; // create a folder, if one does not exist already
 IFolder folder = await rootFolder.CreateFolderAsync("MySubFolder", CreationCollisionOption.OpenIfExists); // create a file, overwriting any existing file
 IFile file = await folder.CreateFileAsync("MyFile.txt", CreationCollisionOption.ReplaceExisting); // populate the file with some text 
await file.WriteAllTextAsync("Sample Text...");
 

Thia 会让你在一个普通的 PCL 项目中编写所有文件操作

【讨论】:

【参考方案3】:

尝试在 Xamarin Studio 中编辑设置。在 Xamarin Studio 中,作为 PCL 的目标选项列出的不同 Xamarin 目标。对于 Profile 111,您将看到 Xamarin 平台已成为目标。在这种情况下,共享项目可能是您的最佳选择。

【讨论】:

【参考方案4】:

难道没有比 111 更窄的 PCL 配置文件可以提供我想要的吗?我唯一的选择是使用 DependencyService 设置吗?也许共享代码项目会更干净?

Profile 111 是您将获得的“最接近”的。

对于这种情况,您的解决方案只需要 Xamarin.Android 和 Xamarin.iOS` 支持,个人而言,使用 共享项目 是最快和最干净的方法。共享 PCL 库很棒,但是,如果您不需要所有跨平台支持(以及因此的限制),请使用共享文件...

以后,如果需要,您可以随时将该代码迁移到基于 PCL 的库和/或依赖于平台的库。

【讨论】:

以上是关于跨 Android/iOS 的 Xamarin 通用 Xamarin.Forms 代码的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms中的Android,IOS和UWP版本

如何为 Xamarin 库项目(iOS 和 Android)运行单元测试?

创建 xamarin 跨平台移动应用程序(android、ios 和 windows)的步骤

如何在 Xamarin 中使用具有 android/IOS 特定视图的控制模板

Xamarin Forms - 防止键盘在 UWP、Android、iOS 中的条目焦点上显示

Stacklayout 上所有 3 个平台(Android、iOS、UWP)中的 Xamarin 长按事件