CodenameOne - Library 文件夹在 iOS 上的文件系统访问问题

CodenameOne - filesystem access problems on iOS for Library folder

提问人:P5music 提问时间:5/11/2021 更新时间:5/12/2021 访问量:68

问:

我的 CodenameOne 应用程序正在 iOS 模拟器(iPad 第 8 版 iOS 14)上进行测试。

它通过以下方法在私有文件夹中写入一些文件:

public void writeFile() throws IOException {
try(OutputStream os = FileSystemStorage.getInstance().openOutputStream(Utils.getRootPath()+DATA_FILE);)
{
os.write(JSONText.getBytes("UTF-8"));
os.flush();
os.close();
} catch(IOException err) {
System.out.println("exception trying to write");
}
}

它适用于 CN 模拟器(写入 .cn1/ 文件夹) 但在 iOS 上,异常被捕获。Library 文件夹在 iOS 上至关重要。

以下是获取根路径的方法

public static String getRootPath()
{
String documentsRoot=FileSystemStorage.getInstance().getRoots()[0];
String os=Display.getInstance().getPlatformName();

if (os.toLowerCase().contains("ios")) {

int pos=documentsRoot.lastIndexOf("Documents");
if (pos==-1) return documentsRoot+"/";
String libraryRoot=documentsRoot.substring(0,pos)+"Library";
String result=libraryRoot+"/";

return result;
}

我的应用程序的 CN 版本必须将这些私有文件写入与 swift 版本相同的位置,即 Library。

有字符串操作,并且没有添加额外的“/”,文件路径似乎是合法的。

所以字符串

file:///Users/mac/Library/Developer/CoreSimulator/Devices/alphanumeric-string/data/Containers/Data/Application/another-alphanumeric-string/Documents/

被转换和 getRootPath() 方法返回

file:///Users/mac/Library/Developer/CoreSimulator/Devices/alphanumeric-string/data/Containers/Data/Application/another-alphanumeric-string/Library/

但也有例外。

此外,在尝试写入后的某个时候,我在控制台输出中看到我认为相关的内容:

Failed to create directory /Users/mac/Library/Developer/CoreSimulator/Devices/alphanumeric-string/data/Containers/Data/Application/another-alphanumeric-string/Documents/cn1storage/

这是怎麽?这与我的问题有关吗?

CN 文件系统访问是否损坏或有缺陷?

我知道 io 访问权限是由 CN 编译器自动创建的,但它们是否有效?

那么如何解决我关于库文件夹的问题呢?

Java iOS 异常 ios-simulator 代号之一

评论


答:

0赞 Shai Almog 5/12/2021 #1

打印输出仅表示存储目录已存在。cn1storage

获取库路径的方法是:可靠地获取 iOS 应用程序的“~/Library”路径

您需要使用这种方法。我认为您认为文档和库位于完全相同的层次结构下的假设是不正确的。

评论

0赞 P5music 5/12/2021
在 Apple 文档“文件系统基础知识”(图 1-1)中,文档和库似乎是同一数据容器下的同级。即使每次启动应用程序时 ID 都在更改,我每次都会得到路径,因此这两个路径应该像兄弟姐妹一样。但是,我意识到如果不求助于 codenameone 中的本机代码,就不可能获得路径。没有代号方法。而且我认为异常不会随着本机方法的路径而消失。这很可能是文件系统访问问题。你测试过吗?它真的像你说的那样有效吗?
0赞 Shai Almog 5/13/2021
我没有测试过它,但我不明白为什么它会有不同的行为。我们所要做的就是从 Apple 调用文件系统管理器:github.com/codenameone/CodenameOne/blob/master/Ports/iOSPort/...
0赞 P5music 5/13/2021
Almog我认为您正在Documents中创建一个文件夹,这是允许的,也许它与“私有”的Library文件夹不同,也许我必须在Library中创建一个文件夹,因为顶级是被禁止的。否则,我必须放弃直接文件系统访问并使用存储类,因为库是被禁止的,那么就会引发异常。
0赞 P5music 5/17/2021
我成功地在该文件夹中写下了,问题隐藏在嵌套的 try/catch 语句中。所以它处于同一层次结构下。顺便说一句,在 ......../Library/ 中有很多 CN1 的东西(我列出了它的内容)