惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
H
Help Net Security
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
Jina AI
Jina AI
L
LangChain Blog
K
Kaspersky official blog
I
Intezer
Martin Fowler
Martin Fowler
爱范儿
爱范儿
AWS News Blog
AWS News Blog
The Hacker News
The Hacker News
Recorded Future
Recorded Future
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
CXSECURITY Database RSS Feed - CXSecurity.com
Spread Privacy
Spread Privacy
Simon Willison's Weblog
Simon Willison's Weblog
U
Unit 42
N
News and Events Feed by Topic
A
Arctic Wolf
G
GRAHAM CLULEY
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 聂微东
F
Fortinet All Blogs
C
Cisco Blogs
美团技术团队
Vercel News
Vercel News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
H
Hacker News: Front Page
T
Tailwind CSS Blog
I
InfoQ
宝玉的分享
宝玉的分享
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
P
Palo Alto Networks Blog
A
About on SuperTechFans
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
云风的 BLOG
云风的 BLOG
TaoSecurity Blog
TaoSecurity Blog
Google Online Security Blog
Google Online Security Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Privacy & Cybersecurity Law Blog
H
Heimdal Security Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hacker News: Ask HN
Hacker News: Ask HN
O
OpenAI News
博客园 - Franky
Scott Helme
Scott Helme

土土哥的Blog

好久没有更新博客=。= 阿里巴巴国际无线技术部 - 招人啦~求iOS、Android、Java 转-阿里巴巴国际无线技术部 - 在这里遇见最好的自己 反编译分析并模拟实现methodSignatureForSelector方法 反编译分析Xcode8的Bug, release下连续两次调用有二级指针参数的空方法会Crash 有趣的Autolayout示例5-Masonry实现 在对象dealloc的后期执行Task-开源库TTGDeallocTaskHelper 用QuartzCode快速实现一个收藏动画 开源项目-拼图验证控件TTGPuzzleVerify的实现 Swift开源Mac App - BingWallPaper 有趣的Autolayout示例4-Masonry实现 翻译-为什么objc_msgSend必须用汇编实现 API返回结果设计经验与总结 结合访问Out Parameters出现EXC_BAD_ACCESS的例子,反编译汇编解读__autoreleasing 总结一些iOS项目中组织代码的方法 对组件化与模块化的思考与总结 开源项目-TTGTagCollectionView 有趣的Autolayout示例3-Masonry实现 Swift开源项目: TTGEmojiRate的实现 Swift写的库-TTGSnackbar 有趣的Autolayout示例2-Masonry实现 解决iOS项目的版本兼容问题-结合宏、Category和Runtime 用Runtime的手段填充任意NSObject对象的nil属性 有趣的Autolayout示例-Masonry实现 UITextView编辑时插入自定义表情-续-自定义表情图片的大小 RPC框架Thrift例子-PHP调用C++后端程序 GCD使用经验与技巧浅谈 为GCD队列绑定NSObject类型上下文数据-利用__bridge_retained(transfer)转移内存管理权 Enum-枚举的正确使用-Effective-Objective-C-读书笔记-Item-5 @autoreleasepool-内存的分配与释放 有关宏定义的经验与技巧-简化代码-增强Log Effective-Objective-C-读书笔记-Item-4-如何正确定义常量 UITextView编辑时插入自定义表情-简单的图文混编 关于评论不见了=。= Entity和Model的不同-关于代码的数据层 Block类型变量-缓存Http请求与回调 提升UITableView性能-复杂页面的优化 NSString的Copy与内存分配 利用NSProxy实现消息转发-模块化的网络接口层设计-原创 Effective-Objective-C-读书笔记-Item-3 Effective-Objective-C-读书笔记-Item-2 Effective-Objective-C-读书笔记-Item-1 iOS项目的目录结构-原创 Android开源库-LinkTextView-原创 第一篇Blog
一次审核被拒的经历-关于iCloud到底应该备份什么数据
土土哥 · 2015-02-28 · via 土土哥的Blog

前言

项目最近一次审核被拒了=。=
仔细看了一下后,发现是没有遵守“iOS Data Storage Guidelines”。
在此总结一下。

被拒原因

先看看被拒的反馈信息:

1
2
3
Apps must follow the iOS Data Storage Guidelines or they will be rejected

On launch and content download, your app stores 12.14 MB, which does not comply with the iOS Data Storage Guidelines.

大致意思就是App下载东西以后,在iCloud里面查看此App需要备份的体积变大了。

再根据 iOS Data Storage Guidelines的说明,得出几点重要信息:

  • 只有用户创建的,并且不能被App重现的文档、数据,才应该被保存在“<Application_Home>/Documents”路径下。
  • 可以重新产生、下载的数据可以放在“<Application_Home>/Library/Caches”目录下,如用于缓存的数据库文件。
  • 纯粹用于缓存的数据可以放在“<Application_Home>/tmp”目录下。
  • 可以通过对NSURL加参数,来保证特定的文件夹及其内容不被iCloud备份,也不会被清除,如Document文件夹。

所以可以初步得出被拒的原因是因为App中下载的文件也被包含在iCloud备份当中了,而Apple审核人员觉得这些文件不应该被备份。

真正应该备份的数据

所以,真正需要备份的文件是用户创建的,不能通过程序重新产生的,如记事本应用中用户创建的文本数据,绘画应用中用户画的画等。

解决当中遇到的坑

既然知道了原因,那就好办了。

根据iOS Data Storage Guidelines的简短说明,乍一看,<Application_Home>/Library/Caches是存放可以重新产生、下载的数据。

但是有个“陷阱”在这。

系统可能清空的目录

根据官方文档“File System Programming Guide”可以整理出一下两个系统可能会清除的目录:(在储存空间不够时)

  1. Library/Caches/
  2. tmp/

所以,像App下载的歌曲等资源文件是不能放在上面两个目录中的。

解决:

所以,为了保险起见,最靠谱的还是放在<Application_Home>/Documents中,并且通过设置,不让iCloud备份。

Apple已经提供了相应的函数,如下(iOS 5.1及以后的版本):

1
2
3
4
5
6
7
8
9
10
11
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL {
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

NSError *error = nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
forKey: NSURLIsExcludedFromBackupKey error: &error];
if(!success){
NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
}
return success;
}

特性

  • <Application_Home>/Documents根目录也可以通过上面的函数设置成不备份。(如应用AVPlayer)
  • 设置是递归的,所以其所有子目录和文件都不用再设置一次,都会自动不被备份。(测试有效,但是不确定=。=,参考:is-nsurlisexcludedfrombackupkey-recursive

总结

多看官方说明=。=

参考