`
auauau
  • 浏览: 168372 次
社区版块
存档分类
最新评论

iCloud存储的API

阅读更多
原文: http://blog.csdn.net/wilmer_wu/article/details/6968812

对开发者而言,涉及iCloud存储的功能主要有两个,一是iCloud document storage,利用iCloud存储用户文件,比如保存一些用户在使用应用时生成的文件,如数据库文件等;二是iCloud key-value data storage,利用iCloud存储键值对,主要是保存一些程序的设置信息,一般只允许存储几十K大小,我估计iBooks的书签同步等功能用的就是这种方式。

要注意iCloud的自动备份功能,如果用户在iOS5中打开了此功能,那么iClound会对用户的应用程序自动进行备份,作为开发人员,我们要注意文件存放目录的问题。因为应用主目录下的Document目录和Library目录(除了该目录下的Caches)的文件都会被自动的备份到iCloud,因此,可以把较大的临时文件或随时可以重建的文件放在Library\Caches目录下,就可以帮用户节省iCloud空间,提供用户体验。另外,相信大家都关心,应用存放在iCloud上如何保证安全呢,不用的应用保存的数据是否能够有效隔离?这一点,iCloud引入了iOS下sandbox的概念,即每一个应用在iCloud上都有一个sandbox,访问的范围就被限制在这里面,从而保证数据安全和隔离。


但是,iOS5还有一个机制值得注意,就是在设备容量空间不足的情况下,系统会自动清除高速缓存文件或临时目录的内容,当然,Library\Caches目录下的内容就会被清除掉,所以对开发人员来说是一个两难的选择。但从这种机制来看,apple是希望应用尽量在本地减少存储,但对中国的网络条件来说,完全依赖网络的应用应当还不太成熟。但对开发人员来说,在读取Library\Caches目录下的文件的时候,至少应当先做一个判断,看看文件在不在,以免引起程序崩溃。


还要注意的是,如果我们开发人员已经在使用了上述两种iCloud API对某些文件进行存储了,这些文件是不会自动备份到iCloud中的。

补充:

ios 5.0.1版将提供一个新的功能,可对一个文件设定一个属性,告诉系统即使在低存储的情况下,对这个文件也不会进行删除,这样的文件在用户备份到iCloud或iTunes的时候也不会被备份,所以需要开发人员手动进行管理。此外,设定了这种属性的文件无论放在哪一个目录下都可以保持上述特性。


实现代码如下:

#include <sys/xattr.h>
- (void) AddSkipBackupAttributeToFile: (NSURL*) url
{
  u_int8_t b = 1;
  setxattr([[url path] fileSystemRepresentation], "com.apple.MobileBackup", &b, 1, 0, 0);
}


参考 :  http://stackoverflow.com/questions/8209755/iphone-move-resources-to-application-bundle
分享到:
评论
3 楼 linzcup 2013-09-05  
官网http://www.huluwa.org/icloud/index.html
2 楼 linzcup 2013-09-05  
本文主要面向使用DateSync的开发者,开发者可通过此文学习如何使用DateSync SDK进行开发。

开发环境
1.安装Microsoft Visual C# 2008/2010
2.安装Microsoft .NET Framework 3.5
3.请将以下DLL文件加入到项目中(以下文件位于DataSyncSDK安装路径下)
DLL文件:
agsXMPP.dll
CE.iPhone.PList.dll
DataSync.dll
log4net.dll
Newtonsoft.Json.dll

主要类介绍
名称
说明
DataSyncObject
DateSync SDK的核心类,通过调用该类中的login,put,get,delete等方法实现在icloud中对联系人,相片流等功能进行操作。
Context
DataSyncObject类中的方法参数都通过该类传入值,传出处理结果。
如何使用DataSync SDK
首先导入DataSync.dll文件到工程中

1.用户登陆

using DataSync;

static void Main()
{

    DataSyncObject ds = new DataSyncObject();//创建DataSyncObject对像
    ds.gIcloud = new Cloud();//生成gIcloud对像

        Context loginctx = new Context();//生成Context对像
    loginctx.loginUsername = "apple id ";//输入icoud 帐号
    loginctx.loginPassword = "password";//输入icoud 帐号密码
    loginctx.modeType = Context.ICLOUD_MODE;//输入Context参数的模块类型,当前设为登陆到icloud服务器上
    bool ret = ds.login(loginctx);//登陆icoud,成功返回true,失败返回false;
    if (ret == false)
     {
         return;
     }
}



2.相片下载

using DataSync;

//进度条回调函数
//参数:transfered已传输字节数, total 表示总字节数
//返回值: true:中断传输,false:继续传输
public static bool TransferProgress(int transfered,int total)
{

return false;
}

static void Main()
{

    DataSyncObject ds = new DataSyncObject();//创建DataSyncObject对像
    ds.gIcloud = new Cloud();//生成gIcloud对像

            Context loginctx = new Context();//生成Context对像
    loginctx.loginUsername = "apple id ";//输入icoud 帐号
    loginctx.loginPassword = "password";//输入icoud 帐号密码
    loginctx.modeType = Context.ICLOUD_MODE;//输入Context参数的模块类型,当前设为登陆到icloud服务器上
    bool ret = ds.login(loginctx);//登陆icoud,成功返回true,失败返回false;
    if (ret == false)
     {
         return;
     }
   
    //登陆后,便可以下载相片

    Context getctx ;
    List<FileNode> files = ds.gIcloud.getPhotoList();//登陆成功后,通过该方法取得需要下载的文件列表
    foreach (FileNode item in files)
    {
        getctx = new Context();
        getctx.transferProgresscallback = new TransferProgressCallBack(TransferProgress);//进度条回调接口
        getctx.modeType = Context.ICLOUD_PS_MODE;//指定要操作的模块为相片流模块
        getctx.inItem = item;//要下载的文件节点
        ds.get(getctx);//下载文件
        if (getctx.outItem != null)
        {
            Console.Write("\n\n file " + getctx.outItem.filename + "down success.");
        }
    }
}

3.上传相片

using DataSync;

//进度条回调函数
//参数:transfered已传输字节数, total 表示总字节数
//返回值: true:中断传输,false:继续传输
public static bool TransferProgress(int transfered,int total)
{

return false;
}

static void Main()
{

    DataSyncObject ds = new DataSyncObject();//创建DataSyncObject对像
    ds.gIcloud = new Cloud();//生成gIcloud对像

                          Context loginctx = new Context();//生成Context对像
    loginctx.loginUsername = "apple id ";//输入icoud 帐号
    loginctx.loginPassword = "password";//输入icoud 帐号密码
    loginctx.modeType = Context.ICLOUD_MODE;//输入Context参数的模块类型,当前设为登陆到icloud服务器上
    bool ret = ds.login(loginctx);//登陆icoud,成功返回true,失败返回false;
    if (ret == false)
     {
         return;
     }
   
    //登陆后,便可以上传相片

    Context putctx = new Context();
    putctx.transferProgresscallback = new TransferProgressCallBack(TransferProgress);
    putctx.srcFileFullName = "e:/ndphoto/IMG_0255.JPG";//指定要上传的文件
    putctx.modeType = Context.ICLOUD_PS_MODE;
    ret = ds.put(putctx); //上传一张相片,最大不能超过50M
    if (ret)
    {
        Console.Write("\n\n file put success. ");
    }

}

4.删除图片

using DataSync;

static void Main()
{

    DataSyncObject ds = new DataSyncObject();//创建DataSyncObject对像
    ds.gIcloud = new Cloud();//生成gIcloud对像

    Context loginctx = new Context();//生成Context对像
    loginctx.loginUsername = "apple id ";//输入icoud 帐号
    loginctx.loginPassword = "password";//输入icoud 帐号密码
    loginctx.modeType = Context.ICLOUD_MODE;//输入Context参数的模块类型,当前设为登陆到icloud服务器上
    bool ret = ds.login(loginctx);//登陆icoud,成功返回true,失败返回false;
    if (ret == false)
     {
         return;
     }

    Context delctx = new Context();
    delctx.srcFileFullName = "e:/ndphoto/IMG_0260.JPG";//要删除的图片
    delctx.modeType = Context.ICLOUD_PS_MODE;
    ret = ds.delete(delctx); //删除图片
    if (ret)
    {
    Console.Write("\n\n file delete success. ");
    }

}

5.获取所有联系人列表

using DataSync;

static void Main()
{

    DataSyncObject ds = new DataSyncObject();//创建DataSyncObject对像
    ds.gIcloud = new Cloud();//生成gIcloud对像

    Context loginctx = new Context();//生成Context对像
    loginctx.loginUsername = "apple id ";//输入icoud 帐号
    loginctx.loginPassword = "password";//输入icoud 帐号密码
    loginctx.modeType = Context.ICLOUD_MODE;//输入Context参数的模块类型,当前设为登陆到icloud服务器上
    bool ret = ds.login(loginctx);//登陆icoud,成功返回true,失败返回false;
    if (ret == false)
     {
         return;
     }

    Context ctx = new Context();
    ctx.modeType = Context.ICLOUD_CONTACT_MODE;
    ds.get(ctx);//结果存在ctx.outContactList中
    List<Contact> contactList = ctx.outContactList;

}



6.删除所有联系人

using DataSync;

static void Main()
{

    DataSyncObject ds = new DataSyncObject();//创建DataSyncObject对像
    ds.gIcloud = new Cloud();//生成gIcloud对像

    Context loginctx = new Context();//生成Context对像
    loginctx.loginUsername = "apple id ";//输入icoud 帐号
    loginctx.loginPassword = "password";//输入icoud 帐号密码
    loginctx.modeType = Context.ICLOUD_MODE;//输入Context参数的模块类型,当前设为登陆到icloud服务器上
    bool ret = ds.login(loginctx);//登陆icoud,成功返回true,失败返回false;
    if (ret == false)
     {
         return;
     }

    ICloudContact iCloudContact = ds.icloud.GetContacts(); 
    Context ctx = new Context();
    ctx.contactList = iCloudContact.contacts;
    ctx.modeType = Context.ICLOUD_CONTACT_MODE;    
    ds.delete(ctx);//删除所有联系人
    List<Contact> contactList = ctx.outContactList;
}

7.增加联系人

using DataSync;

static void Main()
{

    DataSyncObject ds = new DataSyncObject();//创建DataSyncObject对像
    ds.gIcloud = new Cloud();//生成gIcloud对像

    Context loginctx = new Context();//生成Context对像
    loginctx.loginUsername = "apple id ";//输入icoud 帐号
    loginctx.loginPassword = "password";//输入icoud 帐号密码
    loginctx.modeType = Context.ICLOUD_MODE;//输入Context参数的模块类型,当前设为登陆到icloud服务器上
    bool ret = ds.login(loginctx);//登陆icoud,成功返回true,失败返回false;
    if (ret == false)
     {
         return;
     }

     //增加联系人
    List<Contact> contacts = new List<Contact>();
    Contact contact = new Contact { prefix = "pre", firstName = "aaa",
    lastName = "bbb", middleName = "ccc",phoneticLastName = "",
    phoneticFirstName = "Nicolas",suffix = "suff",nickName = "nickname",
    jobTitle = "jobTitle", department = "systemSport", companyName = "nd",
    birthday = "1999-01-01",notes = "测试添加一个完整的联系人"
    };
    ////电话
    contact.phones = new List<Phone>();
    Phone phone1 = new Phone { label = "WORK", field = "13635260966" };
    Phone phone2 = new Phone { label = "HOME", field = "059122321966" };
    Phone phone3 = new Phone { label = "custum", field = "15918726583" };
    contact.phones.Add(phone1);
    contact.phones.Add(phone2);
    contact.phones.Add(phone3);

    ////邮件
    contact.emailAddresses = new List<EmailAdr>();
    EmailAdr emailAdr1 = new EmailAdr { label = "WORK", field = "test_1@yahoo.com.cn" };   
    EmailAdr emailAdr2 = new EmailAdr { label = "HOME", field = "test_2@gmail.com" };
    EmailAdr emailAdr3 = new EmailAdr { label = "custum", field = "test_3@me.com" };
    contact.emailAddresses.Add(emailAdr1);
    contact.emailAddresses.Add(emailAdr2);
    contact.emailAddresses.Add(emailAdr3);

    ////地址
    contact.streetAddresses = new List<StreetAdr>();
   
    StreetField streetField1 = new StreetField();
    streetField1.city = "city";
    streetField1.country = "country";
    streetField1.state = "state";
    streetField1.street = "street";
    streetField1.countryCode = "countryCode";
    StreetAdr streetAdr1 = new StreetAdr { label = "HOME", field = streetField1 };

    StreetField streetField2 = new StreetField();
    streetField1.city = "city";
    streetField1.country = "country";
    streetField1.state = "state";
    streetField1.street = "street";
    streetField1.countryCode = "countryCode";
    StreetAdr streetAdr2 = new StreetAdr { label = "WORK", field = streetField2 };

    StreetField streetField3 = new StreetField();
    streetField1.city = "city";
    streetField1.country = "country";
    streetField1.state = "state";
    streetField1.street = "street";
    streetField1.countryCode = "countryCode";
    StreetAdr streetAdr3 = new StreetAdr { label = "custum", field = streetField3 };
    contact.streetAddresses.Add(streetAdr1);
    contact.streetAddresses.Add(streetAdr2);
    contact.streetAddresses.Add(streetAdr3);

    ////主页
    contact.urls = new List<Url>();
    Url url1 = new Url { label = "WORK", field = "www.sina.com" };
    Url url2 = new Url { label = "HOME", field = "www.apple.com" };
    Url url3 = new Url { label = "custum", field = "www.google.com" };
    contact.urls.Add(url1);
    contact.urls.Add(url2);
    contact.urls.Add(url3);

    ////概况
    contact.profiles = new List<Profile>();
    Profile profile1 = new Profile { label = "Facebook", field = "http://twitter.com",user = "sdfdf" };
    Profile profile2 = new Profile { label = "custum", field = "http://facebook.com",user = "jjjjjj" };
    contact.profiles.Add(profile1);
    contact.profiles.Add(profile2);

    ////日期
    contact.dates = new List<Date>();
    Date date1 = new Date { label = "other", field = "2011-01-01" };
    Date date2 = new Date { label = "custum", field = "2012-01-01" };
    contact.dates.Add(date1);
    contact.dates.Add(date2);

    ////相关人
    contact.relatedNames = new List<RelatedName>();
    RelatedName relatedName1 = new RelatedName { label = "other", field = "father" };
    RelatedName relatedName2 = new RelatedName { label = "custum", field = "brother" };
    contact.relatedNames.Add(relatedName1);
    contact.relatedNames.Add(relatedName2);

    ////通讯
    contact.IMs = new List<IM>();

    IMsfield iMsfield1 = new IMsfield();
    iMsfield1.IMService = "QQ";
    iMsfield1.userName = "qqusername";
    IMsfield iMsfield2 = new IMsfield();
    iMsfield2.IMService = "Facebook";
    iMsfield2.userName = "testname";

    IM iMs1 = new IM { label = "QQ", field = iMsfield1 };
    IM iMs2 = new IM { label = "weibo", field = iMsfield2 };
    contact.IMs.Add(iMs1);
    contact.IMs.Add(iMs2);

    contacts.Add(contact);
    Context ctx = new Context();
    ctx.modeType = Context.ICLOUD_CONTACT_MODE;
    ctx.contactList = contacts;
    ds.put(ctx);
}

8.修改联系人

using DataSync;

static void Main()
{

    DataSyncObject ds = new DataSyncObject();//创建DataSyncObject对像
    ds.gIcloud = new Cloud();//生成gIcloud对像

    Context loginctx = new Context();//生成Context对像
    loginctx.loginUsername = "apple id ";//输入icoud 帐号
    loginctx.loginPassword = "password";//输入icoud 帐号密码
    loginctx.modeType = Context.ICLOUD_MODE;//输入Context参数的模块类型,当前设为登陆到icloud服务器上
    bool ret = ds.login(loginctx);//登陆icoud,成功返回true,失败返回false;
    if (ret == false)
     {
         return;
     }

    //修改联系人
    Context ctx = new Context();
    ctx.modeType = Context.ICLOUD_CONTACT_MODE;
    ds.get(ctx);
    List<Contact> contactList = ctx.outContactList;
    List<Contact> contacts = new List<Contact>();
    Contact contact = contactList[0];
    contact.firstName = "aaa";
    contact.lastName = "bbb";
    contact.phones = new List<Phone>();
    Phone phone = new Phone { label = "WORK", field = "987654321" };
    contact.phones.Add(phone);
    contacts.Add(contact);
    Context ctx = new Context();
    ctx.modeType = Context.ICLOUD_CONTACT_MODE;
    ctx.contactList = contacts;
    ds.updata(ctx);

}

9.删除指定联系人

using DataSync;

static void Main()
{

    DataSyncObject ds = new DataSyncObject();//创建DataSyncObject对像
    ds.gIcloud = new Cloud();//生成gIcloud对像

    Context loginctx = new Context();//生成Context对像
    loginctx.loginUsername = "apple id ";//输入icoud 帐号
    loginctx.loginPassword = "password";//输入icoud 帐号密码
    loginctx.modeType = Context.ICLOUD_MODE;//输入Context参数的模块类型,当前设为登陆到icloud服务器上
    bool ret = ds.login(loginctx);//登陆icoud,成功返回true,失败返回false;
    if (ret == false)
     {
         return;
     }

    //删除联系人
    Context ctx = new Context();
    ctx.modeType = Context.ICLOUD_CONTACT_MODE;
    ds.get(ctx);
    List<Contact> contactList = ctx.outContactList;
    List<Contact> delContacts = new List<Contact>();
    Phone phone = new Phone { label = "WORK", field = "15935260966" };
    Contact contact = contactList[0];
    delContacts.Add(contact);
    Context ctx = new Context();
    ctx.modeType = Context.ICLOUD_CONTACT_MODE;
    ctx.contactList = delContacts;
    ds.delete(ctx);
}
1 楼 linzcup 2013-09-05  
WINDOWS版与ANDROID版的icloud 客户端API
官网http://www.huluwa.org/icloud/index.html
下载官网上的DEMO可以体检联系人与相片同步功能。

相关推荐

Global site tag (gtag.js) - Google Analytics