<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>审核 on 土土哥的技术 Blog</title><link>https://tutuge.me/tags/%E5%AE%A1%E6%A0%B8/</link><description>Recent content in 审核 on 土土哥的技术 Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>tutuge</copyright><lastBuildDate>Sat, 28 Feb 2015 00:00:00 +0000</lastBuildDate><atom:link href="https://tutuge.me/tags/%E5%AE%A1%E6%A0%B8/index.xml" rel="self" type="application/rss+xml"/><item><title>一次审核被拒的经历-关于iCloud到底应该备份什么数据</title><link>https://tutuge.me/2015/02/28/%E4%B8%80%E6%AC%A1%E5%AE%A1%E6%A0%B8%E8%A2%AB%E6%8B%92%E7%9A%84%E7%BB%8F%E5%8E%86-%E5%85%B3%E4%BA%8EiCloud%E5%88%B0%E5%BA%95%E5%BA%94%E8%AF%A5%E5%A4%87%E4%BB%BD%E4%BB%80%E4%B9%88%E6%95%B0%E6%8D%AE/</link><pubDate>Sat, 28 Feb 2015 10:18:11 +0000</pubDate><guid>https://tutuge.me/2015/02/28/%E4%B8%80%E6%AC%A1%E5%AE%A1%E6%A0%B8%E8%A2%AB%E6%8B%92%E7%9A%84%E7%BB%8F%E5%8E%86-%E5%85%B3%E4%BA%8EiCloud%E5%88%B0%E5%BA%95%E5%BA%94%E8%AF%A5%E5%A4%87%E4%BB%BD%E4%BB%80%E4%B9%88%E6%95%B0%E6%8D%AE/</guid><description>&lt;h2 id="前言"&gt;&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;p&gt;项目最近一次审核被拒了=。=
仔细看了一下后，发现是没有遵守“&lt;strong&gt;iOS Data Storage Guidelines&lt;/strong&gt;”。
在此总结一下。&lt;/p&gt;
&lt;h2 id="被拒原因"&gt;&lt;a href="#%e8%a2%ab%e6%8b%92%e5%8e%9f%e5%9b%a0" class="header-anchor"&gt;&lt;/a&gt;被拒原因
&lt;/h2&gt;&lt;p&gt;先看看被拒的反馈信息：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Apps&lt;/span&gt; &lt;span class="n"&gt;must&lt;/span&gt; &lt;span class="n"&gt;follow&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;iOS&lt;/span&gt; &lt;span class="n"&gt;Data&lt;/span&gt; &lt;span class="n"&gt;Storage&lt;/span&gt; &lt;span class="n"&gt;Guidelines&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;they&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;rejected&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;On&lt;/span&gt; &lt;span class="n"&gt;launch&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="n"&gt;stores&lt;/span&gt; &lt;span class="mf"&gt;12.14&lt;/span&gt; &lt;span class="n"&gt;MB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;comply&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;iOS&lt;/span&gt; &lt;span class="n"&gt;Data&lt;/span&gt; &lt;span class="n"&gt;Storage&lt;/span&gt; &lt;span class="n"&gt;Guidelines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;大致意思就是App下载东西以后，在iCloud里面查看此App需要备份的体积变大了。&lt;/p&gt;
&lt;p&gt;再根据 &lt;a class="link" href="https://developer.apple.com/icloud/documentation/data-storage/index.html" target="_blank" rel="noopener"
 &gt;&lt;strong&gt;iOS Data Storage Guidelines&lt;/strong&gt;&lt;/a&gt;的说明，得出几点重要信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;只有&lt;strong&gt;用户创建的，并且不能被App重现的文档、数据&lt;/strong&gt;，才应该被保存在“&lt;strong&gt;&amp;lt;Application_Home&amp;gt;/Documents&lt;/strong&gt;”路径下。&lt;/li&gt;
&lt;li&gt;可以重新产生、下载的数据可以放在“&lt;strong&gt;&amp;lt;Application_Home&amp;gt;/Library/Caches&lt;/strong&gt;”目录下，如用于缓存的数据库文件。&lt;/li&gt;
&lt;li&gt;纯粹用于缓存的数据可以放在“&lt;strong&gt;&amp;lt;Application_Home&amp;gt;/tmp&lt;/strong&gt;”目录下。&lt;/li&gt;
&lt;li&gt;可以通过对NSURL加参数，来保证特定的文件夹及其内容不被iCloud备份，也不会被清除，如Document文件夹。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以可以初步得出被拒的原因是因为App中下载的文件也被包含在iCloud备份当中了，而Apple审核人员觉得这些文件不应该被备份。&lt;/p&gt;
&lt;h3 id="真正应该备份的数据"&gt;&lt;a href="#%e7%9c%9f%e6%ad%a3%e5%ba%94%e8%af%a5%e5%a4%87%e4%bb%bd%e7%9a%84%e6%95%b0%e6%8d%ae" class="header-anchor"&gt;&lt;/a&gt;真正应该备份的数据
&lt;/h3&gt;&lt;p&gt;所以，真正需要备份的文件是&lt;strong&gt;用户创建的，不能通过程序重新产生的&lt;/strong&gt;，如记事本应用中用户创建的文本数据，绘画应用中用户画的画等。&lt;/p&gt;
&lt;h2 id="解决当中遇到的坑"&gt;&lt;a href="#%e8%a7%a3%e5%86%b3%e5%bd%93%e4%b8%ad%e9%81%87%e5%88%b0%e7%9a%84%e5%9d%91" class="header-anchor"&gt;&lt;/a&gt;解决当中遇到的坑
&lt;/h2&gt;&lt;p&gt;既然知道了原因，那就好办了。&lt;/p&gt;
&lt;p&gt;根据&lt;strong&gt;iOS Data Storage Guidelines&lt;/strong&gt;的简短说明，乍一看，&lt;strong&gt;&amp;lt;Application_Home&amp;gt;/Library/Caches&lt;/strong&gt;是存放可以重新产生、下载的数据。&lt;/p&gt;
&lt;p&gt;但是有个“陷阱”在这。&lt;/p&gt;
&lt;h3 id="系统可能清空的目录"&gt;&lt;a href="#%e7%b3%bb%e7%bb%9f%e5%8f%af%e8%83%bd%e6%b8%85%e7%a9%ba%e7%9a%84%e7%9b%ae%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;系统可能清空的目录
&lt;/h3&gt;&lt;p&gt;根据官方文档“&lt;a class="link" href="https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW1" target="_blank" rel="noopener"
 &gt;&lt;strong&gt;File System Programming Guide&lt;/strong&gt;&lt;/a&gt;”可以整理出一下两个系统可能会清除的目录：（在储存空间不够时）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Library/Caches/&lt;/li&gt;
&lt;li&gt;tmp/&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以，像App下载的歌曲等资源文件是不能放在上面两个目录中的。&lt;/p&gt;
&lt;h2 id="解决"&gt;&lt;a href="#%e8%a7%a3%e5%86%b3" class="header-anchor"&gt;&lt;/a&gt;解决：
&lt;/h2&gt;&lt;p&gt;所以，为了保险起见，最靠谱的还是放在**&amp;lt;Application_Home&amp;gt;/Documents**中，并且通过设置，不让iCloud备份。&lt;/p&gt;
&lt;p&gt;Apple已经提供了相应的函数，如下（iOS 5.1及以后的版本）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-lua" data-lang="lua"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BOOL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;addSkipBackupAttributeToItemAtURL&lt;/span&gt;&lt;span class="p"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;NSURL&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;[[NSFileManager defaultManager] fileExistsAtPath: [URL path]]&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;NSError&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;BOOL&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt; &lt;span class="n"&gt;setResourceValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NSNumber&lt;/span&gt; &lt;span class="n"&gt;numberWithBool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;forKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NSURLIsExcludedFromBackupKey&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;NSLog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Error excluding %@ from backup %@&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt; &lt;span class="n"&gt;lastPathComponent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;return&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="特性"&gt;&lt;a href="#%e7%89%b9%e6%80%a7" class="header-anchor"&gt;&lt;/a&gt;特性
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;lt;Application_Home&amp;gt;/Documents&lt;/strong&gt;根目录也可以通过上面的函数设置成不备份。（如应用AVPlayer）&lt;/li&gt;
&lt;li&gt;设置是递归的，所以其所有子目录和文件都不用再设置一次，都会自动不被备份。（测试有效，但是不确定=。=，参考：&lt;a class="link" href="http://stackoverflow.com/questions/14376883/is-nsurlisexcludedfrombackupkey-recursive" target="_blank" rel="noopener"
 &gt;is-nsurlisexcludedfrombackupkey-recursive&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结
&lt;/h2&gt;&lt;p&gt;多看官方说明=。=&lt;/p&gt;
&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.apple.com/icloud/documentation/data-storage/index.html" target="_blank" rel="noopener"
 &gt;iOS Data Storage Guidelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.apple.com/library/ios/qa/qa1719/_index.html" target="_blank" rel="noopener"
 &gt;How do I prevent files from being backed up to iCloud and iTunes?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.apple.com/library/mac/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW4" target="_blank" rel="noopener"
 &gt;File System Programming Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>