ios指定目录不进行icloud检测

时间真的是过得飞快,一周过去,现在来总结想想,好像都没有什么收获。这是一件让人非常恼怒的事情,明明每天都加班,明明连周六都在上班,钱没多拿,经验和知识却没有增加。上一周主要是在同事做过的模块里添加新功能,由于同事去做新的游戏,原先的应用完全由我来维护。同事的代码不错,采用MVC结构,结构剥离的相当明确,C层采用一个驱动,驱动里面嵌套了一个状态机。M数据采用装饰者模式嵌入C 层,利用事件响应机制来实现C层与V层的通讯。比较有价值的应该是他实现状态机的过程,可惜我要赶项目,而且当时编译原理也没学透彻,所以有点囫囵吞枣了。再者就是看同事定义的与后台的协议了,我们现在的做的是德州扑克的回放,状态比较多。着实是花了一些时间去看,代码是如何读取数据的。

当然这不是一篇抱怨的文章,虽然我老是抱怨这抱怨那的,其实我也挺讨厌那样的自己,只是控制不住罢了。比较有意义的一点可能是如何绕过ios的icloud审核。我们的应用是一个弱联网的,为了节省用户流量因此在app里面预存了一些数据。在程序第一次运行时,将数据从程序包拷贝到document目录。由于这个原因,app被app store拒绝过一次,提示程序未做任何操作,但是icloud多了一些数据。

绕过的方法如下:

- (BOOL)addSkipBackupAttributeToItemAtURLHigh:(NSURL *)URL
{
//    5.1 +
    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;
}

- (BOOL)addSkipBackupAttributeToItemAtURLLow:(NSURL *)URL

{
//    5.0.1:
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

    const char* filePath = [[URL path] fileSystemRepresentation];

    const char* attrName = "com.apple.MobileBackup";

    u_int8_t attrValue = 1;

    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);

    return result == 0;

}

没有找到好的检测版本的方法,就用了最土的一种:

  <p class="p1"><span class="s1">    </span><span class="s2">NSURL</span><span class="s1"> *tempURL = [</span><span class="s2">NSURL</span><span class="s1"> </span>fileURLWithPath<span class="s1">:[</span><span class="s2">NSString</span><span class="s1"> </span>stringWithUTF8String<span class="s1">:(</span><span class="s3">CCFileUtils</span><span class="s1">::</span><span class="s4">sharedFileUtils</span><span class="s1">()-></span><span class="s4">getWritablePath</span><span class="s1">()+</span><span class="s5">"temp/"</span><span class="s1">).</span>c_str<span class="s1">()]];</span></p><p class="p2">   </p><p class="p3">    <span class="s2">NSString</span> *stringVersion =[[<span class="s2">UIDevice</span> <span class="s6">currentDevice</span>] <span class="s6">systemVersion</span>];</p><p class="p3">    <span class="s2">NSArray</span> * array = [stringVersion <span class="s6">componentsSeparatedByString</span>:<span class="s5">@"."</span>];</p><p class="p3">    <span class="s7">int</span> symbol = <span class="s8">0</span>;</p><p class="p3">    <span class="s7">for</span> (<span class="s2">NSInteger</span> i = <span class="s8">0</span>; i < array.<span class="s6">count</span>; ++ i) {</p><p class="p3">        <span class="s7">if</span> (i == <span class="s8">0</span>) {</p><p class="p3">            <span class="s7">if</span> ([[array <span class="s6">objectAtIndex</span>:i] <span class="s6">integerValue</span>] > <span class="s8">5</span>) {</p><p class="p3">                symbol = <span class="s8">3</span>;</p><p class="p3">                <span class="s7">break</span>;</p><p class="p3">            }<span class="s7">else</span> <span class="s7">if</span>([[array <span class="s6">objectAtIndex</span>:i] <span class="s6">integerValue</span>] < <span class="s8">5</span>){</p><p class="p3">                symbol = <span class="s8">0</span>;</p><p class="p3">                <span class="s7">break</span>;</p><p class="p3">            }</p><p class="p3">        }<span class="s7">else</span> <span class="s7">if</span>(i == <span class="s8">1</span>){</p><p class="p3">            <span class="s7">if</span> ([[array <span class="s6">objectAtIndex</span>:i] <span class="s6">integerValue</span>] >= <span class="s8">1</span>) {</p><p class="p3">                symbol = <span class="s8">3</span>;</p><p class="p3">                <span class="s7">break</span>;</p><p class="p3">            }</p><p class="p3">        }<span class="s7">else</span> <span class="s7">if</span>(i == <span class="s8">2</span>){</p><p class="p3">            <span class="s7">if</span> ([[array <span class="s6">objectAtIndex</span>:i] <span class="s6">integerValue</span>] > <span class="s8">0</span>) {</p><p class="p3">                symbol = <span class="s8">2</span>;</p><p class="p3">                <span class="s7">break</span>;</p><p class="p3">            }</p><p class="p3">        }</p><p class="p3">    }</p><p class="p3">    <span class="s7">if</span> (symbol == <span class="s8">2</span>) {</p><p class="p4"><span class="s1">        [</span><span class="s7">self</span><span class="s1"> </span>addSkipBackupAttributeToItemAtURLLow<span class="s1">:tempURL];</span></p><p class="p3">    }<span class="s7">else</span> <span class="s7">if</span>(symbol == <span class="s8">3</span>){</p><p class="p4"><span class="s1">        [</span><span class="s7">self</span><span class="s1"> </span>addSkipBackupAttributeToItemAtURLHigh<span class="s1">:tempURL];</span></p><p class="p3">    }</p>

值得注意的是:5.0一下的不存在icloud检测;不允许将document整个目录作为icloud忽略目录;检测V5.0.1时需要导入sys/xattr.h

时间: 2024-11-08 23:18:47

ios指定目录不进行icloud检测的相关文章

iOS案例:读取指定目录下的文件列表

// // main.m // 读取指定目录下的文件列表 // // Created by Apple on 15/11/24. // Copyright © 2015年 Apple. All rights reserved. // /* *读取指定目录下的文件列表 */ #import <Foundation/Foundation.h> void myQuickMethod(); int main(int argc, const char * argv[]) { //文件操作对象 NSFil

VC++ 监控指定目录改变

转载:http://www.cnblogs.com/doublesnke/archive/2011/08/16/2141374.html VC++实施文件监控:实例和详解 相关帮助: http://hi.baidu.com/jiahaosoft/blog/item/b441d1218eebece0d6cae274.html 我这里只介绍采用ReadDirectoryChangesW对文件目录实施监控 关键代码 CfgdsgDlg * dlg = (CfgdsgDlg*)lparam;     H

MVVM 模式下iOS项目目录结构详细说明

?更多技术干货请戳:听云博客 我们在做项目的时候,会经常用到各种设计模式,最常见的要数 MVC (模型,视图,控制器)了.但是,今天我们要说的是另一种设计模式——MVVM. 所以 MVVM 到底是什么?下面,我们将结合代码,说明 MVVM 设计模式以及项目目录结构. 一.MVVM 模式介绍  MVVM 是 Model-View-View Model 的缩写,MVVM 听起来好像很复杂的样子,但它本质上就是MVC 的改进版.MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和

Window Linux下实现指定目录内文件变更的监控方法

转自:http://qbaok.blog.163.com/blog/static/10129265201112302014782/ 对于监控指定目录内文件变更,window 系统提供了两个未公开API:SHChangeNotifyRegister  SHChangeNotifyDeregister 分别用于注册Notify以及监视. 同时,还提供了ReadDirectoryChangesW  函数(貌似NT以上可用). 在 .net framework 中,另提供了封装好的 FileSystem

Linux使用find查找最后修改时间超过三天的文件并移动到指定目录

使用场景:应用程序,如tomcat,每天都会生成新的日志文件,时间一长,占用大量的磁盘,需要定期清理这些文件. 代码如下: find /tomcat/logs/*.log -ctime +3 -exec mv {} /tmp 也可以使用xargs传参数 find /tomcat/logs/*.log -ctime +3 | xargs mv {} /tmp 说明:将指定目录下超过3天未修改的日志文件移动到tmp中. 如果要直接删除,将命令改为如下即可: find /tomcat/logs/*.l

统计指定目录下面的文件类型及数量

import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; /** * 统计指定目录下面的文件类型及数量 * * @author Administrator * */ public class FileCountTest { // 定义静态变量resultMap,存放

Scala 获取指定目录下的所有文件名(不包括目录名)

最近在学习Scala,想要获取指定目录下的所有文件名,但是Scala  中有没有相应的库函数,由于本人是新手,所以弄了半天,好不容易才将网上的一段Scala 递归获取指定目录下所有目录的代码改成获取文件名,特在此备忘,也希望高手指点. 下面是一段递归获取目录名称的代码: def subdirs(dir: File): Iterator[File] = { val children = dir.listFiles.filter(_.isDirectory) children.toIterator

自定义类加载器——加载任意指定目录的class文件

public class MyClassLoader extends ClassLoader{ String path;//自定义类加载器所负责的文件夹 public MyClassLoader(String path) { super(); this.path = path; } @SuppressWarnings("deprecation") @Override protected Class<?> findClass(String name) throws Class

python之查询指定目录下的最新文件

使用os模块查询指定目录下的最新文件 1 import os 2 3 # 输入目录路径,输出最新文件完整路径 4 def find_new_file(dir): 5 '''查找目录下最新的文件''' 6 file_lists = os.listdir(dir) 7 file_lists.sort(key=lambda fn: os.path.getmtime(dir + "\\" + fn) 8 if not os.path.isdir(dir + "\\" + f