iOS 10.3 APFS 不支持大部分的非英文字符解决方案

背景

最近开发辞书软件的时发现离线包音频无法在iOS 10.3进行播放,经过调查发现是iOS 10.3使用了苹果的新文件系统APFS,而APFS不支持大部分的非英文字符类似(zi? ca?n xi?ng hui?)。导致SSZipArchive无法解压出带音标的文件。而在整个解压过程中程序没有任何异常。最后确定问题是iOS 10.3 使用的APFS系统上fopen()无法打开带音标的文件名,且整个过程没有任何错误信息和异常警告。

官方介绍

APFS is currently unusable with most non-English languages。
The time had come to test out my fears over problems with file and folder names inApple’s new filing system, APFS. The TL;DR is that APFS is not currently safeto use with names which might have Unicode normalisation issues – which meansit is only safe with a limited ASCII character set, as shown in the bizarrescreen shot above.

解决方案

当出现使用fopen()的时候如果当前文件是存在特殊字符时,先使用NSFileManager修改当前文件名,使用CFStringConvertEncodingToNSStringEncoding将当前文件名通过kCFStringEncodingGB_18030_2000进行文件重命名。在fopen()进行操作后再使用NSFileManager进行重命名还原。

解决代码参考

 1 - (void) testFOpen:(NSString*)fullPath {
 2     //start
 3     FILE *fp = fopen((const char*)[fullPath UTF8String], "wb");
 4     NSString *tmpFullPath = nil;
 5     //判断文件是否创建,没有使用临时文件名处理
 6     if (![[NSFileManager defaultManager] fileExistsAtPath:fullPath]) {
 7         fclose(fp);
 8         //使用临时文件名处理
 9         NSString *dir = [fullPath stringByDeletingLastPathComponent];
10         NSString *tmpFileName = [fullPath lastPathComponent];
11         NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
12         tmpFileName = [NSString  stringWithCString:[tmpFileName UTF8String] encoding:enc];
13         tmpFullPath = [dir stringByAppendingPathComponent:tmpFileName];
14         fp = fopen((const char*)[tmpFullPath UTF8String], "wb");
15     }
16     //fp todo
17     //...
18
19     //end
20     fclose(fp);
21     if (tmpFullPath && [[NSFileManager defaultManager] fileExistsAtPath:tmpFullPath]) {
22         //使用重命名还原
23         [[NSFileManager defaultManager] moveItemAtPath:tmpFullPath toPath:fullPath error:nil];
24     }
25     if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath]) {
26         NSLog(@"file exist");
27     }
28 }

参考资料

https://eclecticlight.co/2017/04/06/apfs-is-currently-unusable-with-most-non-english-languages/

时间: 2024-10-17 04:26:21

iOS 10.3 APFS 不支持大部分的非英文字符解决方案的相关文章

iOS 10 UserNotifications 框架解析

iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifications.framework 来集中管理和使用 iOS 系统中通知的功能.在此基础上,Apple 还增加了撤回单条通知,更新已展示通知,中途修改通知内容,在通知中展示图片视频,自定义通知 UI 等一系列新功能,非常强大. 对于开发者来说,相较于之前版本,iOS 10 提供了一套非常易用通知处理接口,是 SDK 的一次重大重构.而之前的绝大部分通知相关 API 都已经被标为弃用 (dep

iOS 1 到 iOS 10 ,我都快老了

iOS 1:iPhone诞生 虽然很难想像,但初代iPhone在问世时在功能方面其实远远落后于那时的竞争对手,比如Windows Mobile.Palm OS.塞班.甚至是黑莓.它不支持3G.多任务.第三方应用,无法复制粘贴文本.在邮件中随意添加文件,也不支持MMS.Exchange推送邮件.主屏幕个性化.语音拨号. 但是,苹果在这款设备身上注重的是核心体验.速度.还有应用的连贯性.其中有3个方面对移动产业产生了革命性的影响. 核心iOS用户界面.在iOS之前,智能手机要么没有触控屏,或者使用的

iOS 10 版本适配问题收集-b

随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有错误,欢迎指出. 1.系统判断方法失效: 在你的项目中,当需要判断系统版本的话,不要使用下面的方法: #define isiOS10 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=10) 它会永远返回NO,substringToIndex:1在iOS 10 会被检测成 iOS 1了

iOS 10 的适配问题-b

随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有错误,欢迎指出. 1.系统判断方法失效: 在你的项目中,当需要判断系统版本的话,不要使用下面的方法: #define isiOS10 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=10) 它会永远返回NO,substringToIndex:1在iOS 10 会被检测成 iOS 1了

兼容iOS 10 资料整理笔记-b

原文链接:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserNotifications的易用,功能也变得非常强大. iOS 9 以前的通知 1.在调用方法时,有些方法让人很难区分,容易写错方法,这让开发者有时候很苦恼. 2.应用在运行时和非运行时捕获通知的路径还不一致. 3.

iOS 10相关技术

1.系统判断方法失效: 在你的项目中,当需要判断系统版本的话,不要使用下面的方法: #define isiOS10 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=10) 它会永远返回NO,substringToIndex:1在iOS 10 会被检测成 iOS 1了,应该使用下面的这些方法:Objective-C 中这样写: #define SYSTEM_VERSION_EQUAL_TO(v) 

iOS 10 更新

1.解决工程中输出无关日志 Edit Scheme -> Run -> Arguments, 在Environment Variables里边添加   OS_ACTIVITY_MODE        disable 遗留问题: 还会出现下面这个问题5]: Class PLBuildVersion is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform

兼容iOS 10 资料整理笔记

1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserNotifications的易用,功能也变得非常强大. iOS 9 以前的通知 1.在调用方法时,有些方法让人很难区分,容易写错方法,这让开发者有时候很苦恼. 2.应用在运行时和非运行时捕获通知的路径还不一致. 3.应用在前台时,是无法直接显示远程通知,还需要进一步处理. 4.已经发出的通知是不能更新

[iOS 10 day by day] Day 1:开发 iMessage 的第三方插件

本文介绍了 iOS 10 的一个重要更新:Messages 应用支持第三方插件了.作者用一个小游戏作为例子,说明了插件开发从建工程开始,到绘制界面.收发消息的全过程. <iOS 10 day by day>是 shinobicontrols 公司编写的系列博客,介绍开发者需要了解的 iOS 10 新特性,每周更新.本系列翻译(文集地址)已取得官方授权.仓薯翻译,欢迎指正:) Shinobicontrols 为 iOS 和 Android 开发者提供高性能.响应式的 UI 控件 SDK,尤其是图