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

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可以体检联系人与相片同步功能。

相关推荐

    icloud模拟登录并添加日历事件C#源码

    你可能需要处理的身份验证类型是OAuth或iCloud特有的Web服务身份验证,这需要对iCloud的API有深入的理解。 iCloud的API,尤其是日历服务,是基于CalDAV标准的。CalDAV允许客户端通过HTTP协议与服务器交互,执行如...

    iCloud应用

    对于开发者来说,iCloud提供了丰富的API和工具,如CloudKit,用于构建能与iCloud无缝集成的应用。通过CloudKit,开发者可以轻松地处理用户身份验证、数据存储和同步、推送通知等功能,而无需自行维护服务器。 至于...

    iCloud模拟登录获取位置信息

    在IT行业中,iCloud是苹果公司提供的一项云存储和云计算服务,它允许用户在各种苹果设备上同步和存储数据,包括照片、视频、联系人、日历、文档等。本主题聚焦于“iCloud模拟登录获取位置信息”,这涉及到网络通信、...

    swift-CloudKitGDPR一个Swift框架能够让用户管理存储在iCloud中的数据

    2. **数据访问接口**:提供了易于使用的API,开发者可以快速读取、写入和更新iCloud中的数据记录。 3. **数据删除功能**:符合GDPR要求,框架允许用户请求删除其个人数据,开发者可以通过这个功能轻松实现数据的...

    iCloud Demo

    iCloud 是苹果公司推出的一项云服务,它允许用户在各种设备上(如 iPhone、iPad、Mac、Windows PC)同步和存储数据,实现跨平台的数据共享和备份。通过 iCloud,用户可以无缝地访问和更新他们的照片、文档、联系人、...

    IOS应用源码之【应用】iCloud代码示例.rar

    1. **NSUbiquitousKeyValueStore**: 这是苹果提供的轻量级API,用于存储键值对数据。它可以跨设备实时同步,适合存储少量非结构化数据,如用户设置。 2. **Core Data with iCloud**: 如果你需要存储大量的结构化...

    最新仿icloud官方源码,苹果官网源码带后台邮件提醒功能

    在这个项目中,开发者可能已经实现了登录、云存储、文件同步、邮件服务等功能,这些都是iCloud的核心特性。通过分析和研究这样的源码,开发者可以了解大型Web应用的架构设计、前端交互逻辑以及后端服务的实现方式。 ...

    IOS应用源码Demo-iCloud代码示例-毕设学习.zip

    在iOS开发中,iCloud是一种云存储服务,允许开发者将用户的数据存储在云端,并在用户的各个设备间同步。iCloudKit是苹果提供的框架,使得开发者可以轻松地在应用中集成iCloud功能。通过这个源码,我们可以学习到: ...

    Node.js-AppleiCloud服务的NodeAPI

    iCloud是由Apple提供的一项云存储和云计算服务,用户可以存储照片、文档、音乐、联系人、日历等数据,并在多个设备之间同步。这个Node API 提供了一种方便的方式,让开发者能够利用Node.js与iCloud的某些功能进行...

    icloud:golang连接到icloud服务

    CloudKit提供了一系列的RESTful API,用于存储、检索和同步数据,并支持身份验证、推送通知等功能。 在使用Go语言与CloudKit交互时,我们需要使用第三方库或自行实现HTTP客户端来处理API请求。由于Apple的API通常...

    react-native-icloudstore:取代了React Native的AsyncStorage API,该API包装了iCloud无处不在的键值存储

    在Xcode中目标的“功能”选项卡中,确保已打开iCloud并确保已选中“键值存储”选项。 react-native-icloudstore模拟了相同的基于承诺的API为 。 除了所有AsyncStorage方法之外,还有一个附加功能:本机事件( ...

    Laravel开发-icloud

    5. **iCloud特定操作**:iCloud API支持照片库(Photolibrary)和服务存储(CloudStorage)。根据项目需求,选择合适的接口进行操作,如获取文件列表、删除文件等。 6. **错误处理和权限**:确保用户具有正确的权限...

    IOS应用源码之【应用】-iCloud代码示例.rar

    - iCloudKit是Apple的开发框架,为开发者提供了一套API,用于构建基于iCloud的应用程序。它允许开发者创建数据库,定义模型对象,并处理数据同步和冲突解决。 - iCloudKit包括两个主要部分:CloudKit容器和...

    iCloud介绍.pdf

    此外,开发者可以通过iCloud API将云同步功能引入他们自己的应用程序,使跨设备的协同工作变得简单。 iCloud照片库是另一项重要的服务,它允许用户在所有设备上查看和访问他们拍摄的照片和视频。新的照片会自动上传...

    允许用户管理存储在iCloud中的数据的框架.zip

    它使得开发者能够将用户数据安全地存储在Apple的iCloud基础设施上,让用户可以在不同设备间同步和访问信息。"允许用户管理存储在iCloud中的数据的框架.zip" 文件内容可能包含一个名为"CloudKitGDPR-master"的开源...

    ricloud-js:用于Reincubate的iCloud APIJavaScript Node.js模块。 是的,它可以与iOS 14和iPhone 12备份一起使用!

    该API依赖于一组安全凭证,这些凭证存储在conf/settings.json文件中。 该软件包附带一个默认配置文件,该文件允许出于演示目的而对API的有限访问。 或者,可以在调用API时指定这些安全凭证(请参见下文)。 该文件...

    iCloud Demo 2(Doucument&Key Value Storage)

    在iOS和macOS开发中,iCloud是一项强大的云同步服务,它允许开发者将应用程序的数据存储在云端,并在用户的多个设备间实现同步。本Demo“iCloud Demo 2(Doucument&Key Value Storage)”专注于两种不同的iCloud数据...

Global site tag (gtag.js) - Google Analytics