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,如需转载请自行联系原作者

相关文章
|
1月前
|
监控 安全
公司上网监控:Mercury 在网络监控高级逻辑编程中的应用
在数字化办公环境中,公司对员工上网行为的监控至关重要。Mercury 作为一种强大的编程工具,展示了在公司上网监控领域的独特优势。本文介绍了使用 Mercury 实现网络连接监听、数据解析和日志记录的功能,帮助公司确保信息安全和工作效率。
96 51
|
24天前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
1月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
29 1
|
4月前
|
安全 网络安全 Android开发
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
130 56
|
3月前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
69 11
|
2月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
30 0
|
4月前
|
安全 Java 应用服务中间件
网络安全的护城河:漏洞防御与加密技术深入浅出Java并发编程
【8月更文挑战第31天】在数字世界的棋盘上,每一次点击都可能是一步棋。网络安全的战场无声却激烈,漏洞如同裂缝中的风,悄无声息地侵袭着数据的堡垒。本文将揭示网络漏洞的隐蔽角落,探讨如何通过加密技术筑起防线,同时提升个人和组织的安全意识,共同守护我们的数字家园。
|
4月前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
59 7
|
4月前
|
安全 测试技术 调度
iOS开发-多线程编程
【8月更文挑战第12天】在iOS开发中,属性的内存管理至关重要,直接影响应用性能与稳定性。主要策略包括:`strong`(强引用),保持对象不被释放;`weak`(弱引用),不保持对象,有助于避免循环引用;`assign`(赋值),适用于基本数据类型及非指针对象类型;`copy`(复制),复制对象而非引用,确保不变性。内存管理基于引用计数,利用自动引用计数(ARC)自动管理对象生命周期。此外,需注意避免循环引用,特别是在block中。最佳实践包括理解各策略、避免不必要的强引用、及时释放不再使用的对象、注意block中的内存管理,并使用工具进行内存分析。正确管理内存能显著提升应用质量。
|
4月前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
下一篇
DataWorks