如何将日志存储在 .NET MAUI 应用程序中 iOS 和 Android 上的用户可访问的位置(类似于文档文件夹)?

问题描述 投票:0回答:1

我正在开发一个 .NET MAUI 应用程序,我需要将日志存储在用户可访问的位置,类似于 iOS 和 Android 上的 Documents 文件夹。是否可以实现这一目标,如果可以,我如何以编程方式访问此路径?

我感谢有关这些要求的任何见解或建议。

maui
1个回答
0
投票

没有跨平台 API 可以做到这一点。需要调用平台原生代码。

1。对于安卓:

调用以下代码获取Download文件夹(使用download文件夹,因为android 10及以下版本没有Documents文件夹),创建文件并写入。

#if ANDROID
var path = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads).AbsolutePath;
using (FileStream fileStream = new FileStream(Path.Combine(path, "test.log"), FileMode.Create))
{
    var data = Encoding.UTF8.GetBytes("this is log file");
    await fileStream.WriteAsync(data, 0, data.Length);
}
#endif

另外,上述代码在android 11及以上版本上无需任何权限即可直接运行。对于android 10及以下版本,您需要请求存储权限。

在AndroidManifest.xml中添加权限和

android:requestLegacyExternalStorage="true"
(仅适用于android 10)

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
      <application android:allowBackup="true" android:icon="@mipmap/appicon" android:supportsRtl="true" android:requestLegacyExternalStorage="true"></application>
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"  android:maxSdkVersion="29"/>
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"  android:maxSdkVersion="29"/>
</manifest>

运行时请求权限:

if (Android.OS.Build.VERSION < Android.OS.BuildVersionCodes.R)
{
    var status = Permissions.RequestAsync<Permissions.StorageWrite>();
}

2。适用于 iOS

iOS 上没有公共文档文件夹。每个应用程序都有自己的 Documents 文件夹。您可以使用以下代码创建文件并写入:

var path = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
using (FileStream fileStream = new FileStream(Path.Combine(path, "test.log"), FileMode.Create))
{
    var data = Encoding.UTF8.GetBytes("this is log file");
    await fileStream.WriteAsync(data, 0, data.Length);
}

此外,如果您希望其他用户可以访问该文件,请将以下密钥添加到Info.plist中:

<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>UIFileSharingEnabled</key>
<true/>

最后请在实体设备上测试一下,这个在模拟器上是不行的。

© www.soinside.com 2019 - 2024. All rights reserved.