iOS网络编程-iCloud文档存储编程实例-阿里云开发者社区

开发者社区> 技术小阿哥> 正文

iOS网络编程-iCloud文档存储编程实例

简介:
+关注继续查看

iCloud文档存储编程相对键值数据存储而言比较复杂,涉及到自定义文档类、获得iCloud文档目录、查找Ubiquity容器中的文档、保存文档和解决文档冲突等内容。

 

实例:iCloud文档存储编程设计

实例介绍一下iCloud文档存储编程过程,画面中有一个文本框和一个按钮控件,在设备1输入内容,点击“保存数据”按钮,将数据保存iCloud服务器。右图是设备2画面,过几秒钟后设备2上会读取iCloud服务器端数据,并显示在文本框中。


配置Xcode工程

编写iCloud文档存储编应用程序也需要在Xcode工程中进行一些配置,选择TAGETS→MyNotes→Summary→Entitlements


在图中Ubiquity Contrainers添加com.51work6.MyNotes,这是Ubiquity容器标识,可以有多个Ubiquity容器标识,这个容器标识代表着不同的目录。com.51work6.MyNotes代表目录如下所示:

/var/mobile/Library/Mobile Documents/98Z3R5XU29~com~51work6~MyNotes/

其中的98Z3R5XU29是在iOS开发者配置门户网站创建App ID时候生成的,它被称为Team ID

如果应用中没有使用iCloud键值数据存储key-Value Store可以不用配置。

自定义文档类

我 们需要自己封装一个文档类,它继承抽象类UIDocument,而UIDocument实现NSFilePresenter协议。实现 NSFilePresenter协议的类,它所代表的文件和目录可以被查看和编辑,这些NSFilePresenter实现类与文件协调者类 NSFileCoordinator结合使用,可以协调管理文件或目录。

这个类我们命名为MyCloudDocument, MyCloudDocument的代码如下:

 


  1. #import <UIKit/UIKit.h> 
  2.  
  3.   
  4.  
  5. @interface MyCloudDocument : UIDocument ① 
  6.  
  7. @property (strong, nonatomic) NSString *contents; 
  8.  
  9. @end 
  10.  
  11.   
  12.  
  13. #import ”MyCloudDocument.h” 
  14.  
  15. @implementation MyCloudDocument 
  16.  
  17.   
  18.  
  19. //加载数据 
  20.  
  21. - (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outError ② 
  22.  
  23.  
  24. if ([contents length] > 0) 
  25.  
  26.  
  27. self.contents = [[NSString alloc] initWithData:contents encoding:NSUTF8StringEncoding]; ③ 
  28.  
  29.  
  30. return YES; 
  31.  
  32.  
  33. //保存数据 
  34.  
  35. - (id)contentsForType:(NSString *)typeName error:(NSError **)outError ④ 
  36.  
  37.  
  38. return [self.contents dataUsingEncoding:NSUTF8StringEncoding];  ⑤ 
  39.  
  40.  
  41. @end 

获得iCloud文档目录

iCloud文档目录是指在Ubiquity容器下的Document目录,因此获得了Ubiquity容器的根目录,就可以获得的iCloud文档目录了。

ViewController.m中的 ubiquitousDocumentsURL方法可以iCloud文档目录:

 


  1. //请求本地Ubiquity容器,从容器中获得Document目录URL 
  2.  
  3. - (NSURL *)ubiquitousDocumentsURL { 
  4.  
  5. NSFileManager* fileManager = [NSFileManager defaultManager]; ① 
  6.  
  7. NSURL* containerURL = [fileManager 
  8.  
  9. URLForUbiquityContainerIdentifier:@"98Z3R5XU29.com.51work6.MyNotes"]; ② 
  10.  
  11. containerURL = [containerURL URLByAppendingPathComponent:@"Documents"]; ③ 
  12.  
  13. return containerURL; 
  14.  

查找Ubiquity容器中的文档

获得iCloud文档目录后,我们需要找到容器中的文件。查询容器中的文件需要注册两个广播通知:

NSMetadataQueryDidFinishGatheringNotification  查询结束发出通知;

NSMetadataQueryDidUpdateNotification  查询结束,进入开始更新阶段发出的通知;

ViewController.m中注册和解除通知代码如下:

 


  1. - (void)viewDidLoad 
  2.  
  3.  
  4. [super viewDidLoad]; 
  5.  
  6. //为查询iCloud文件的变化,注册通知 
  7.  
  8. [[NSNotificationCenter defaultCenter] addObserver:self 
  9.  
  10. selector:@selector(updateUbiquitousDocuments:) 
  11.  
  12. name:NSMetadataQueryDidFinishGatheringNotification object:nil]; 
  13.  
  14. [[NSNotificationCenter defaultCenter] addObserver:self 
  15.  
  16. selector:@selector(updateUbiquitousDocuments:) 
  17.  
  18. name:NSMetadataQueryDidUpdateNotification object:nil]; 
  19.  
  20.   
  21.  
  22. //查询iCloud文件的变化 
  23.  
  24. [self searchFilesOniCloud]; 
  25.  
  26.   
  27.  
  28.  
  29. - (void)didReceiveMemoryWarning 
  30.  
  31.  
  32. [super didReceiveMemoryWarning]; 
  33.  
  34. [[NSNotificationCenter defaultCenter] removeObserver:self]; 
  35.  
  36.  
  37.   

保存文档 

保存文档很简单,它是在ViewController.m中的 saveClick:方法处理的,saveClick:方法是点击按钮时候触发:

 


  1. - (IBAction)saveClick:(id)sender { 
  2.  
  3. _myCloudDocument.contents = _txtContent.text; 
  4.  
  5. [_myCloudDocument updateChangeCount:UIDocumentChangeDone]; 
  6.  
  7. [_txtContent resignFirstResponder]; 
  8.  

保 存成功之后我们可以在其它设备上看看是否iCloud中已经有abc.txt文档了。如果使用Mac OS X系统电脑,我们可以在“系统偏好设置”中打 开iCloud对话框,点击“管理”按钮可以打开iCloud空间管理对话框,其中的MyNotes是我应用名,右边的abc.txt创建的文件。



本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1190974,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android官方开发文档Training系列课程中文版:连接无线设备之网络服务搜索功能
原文地址:http://android.xsoftlab.net/training/connect-devices-wirelessly/index.html 引言 Android设备除了可以与服务器建立连接之外,Android无线API还允许处于同一网段下的两台设备建立连接,或者是物理距离相近的两台设备建立连接。
802 0
网络IO和磁盘IO详解
1. 缓存IO          缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址空间。
2325 0
《UNIX网络编程 卷2:进程间通信(第2版)》——1.8 书中IPC例子索引表
生产者-消费者:一个或多个线程或进程(生产者)把数据放到一个共享缓冲区中,另有一个或多个线程或进程(消费者)对该共享缓冲区中的数据进行操作。序列号持续增1:一个或多个线程或进程给一个共享的序列号持续增1。该序列号有时在一个共享文件中,有时在共享内存区中。
1054 0
Android官方开发文档Training系列课程中文版:连接无线设备之通过P2P搜索网络服务
原文地址:http://android.xsoftlab.net/training/connect-devices-wirelessly/nsd-wifi-direct.html 本阶段的第一节课 Using Network Service Discovery 展示了如何搜索本地网络服务。
800 0
Android官方开发文档Training系列课程中文版:网络操作之网络管理
原文地址:http://android.xsoftlab.net/training/basics/network-ops/managing.html 这节课将会学习如何对网络资源的使用情况拥有更细粒度的控制力。
595 0
Java网络编程--InetAdress类
一、地址 java.net包中的InetAddress 类对象含有一个Internet主机地址的域名和Ip地址 www.sina.com.cn/202.108.35.210   二、获取地址 1、获取Internet上主机的地址 使用InetAddress类的静态方法 getByName...
600 0
Android官方开发文档Training系列课程中文版:网络操作之XML解析
原文地址:http://android.xsoftlab.net/training/basics/network-ops/xml.html 扩展标记语言(XML)是一系列有序编码的文档。
544 0
python网络编程
http://hi.baidu.com/showimg/blog/item/40586838c1c59e2b97ddd897.
526 0
8434
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载