IBM Bluemix 是一个基于Cloud Foundry的PaaS产品,这个云平台提供了许多免费的服务、运行时和基础架构,可以帮助您快速构建和部署下一个移动或 Web 应用程序。
Bluemix 中许多已有的服务,使开发人员能轻松地构建和增强应用程序。在本教程中,我们将展示如何使用 IBM Mobile Data for Bluemix 服务构建一个 iOS 应用程序。
您是否曾经去了杂货店,却忘记了您的配偶制作美味甜点所需的原料是什么?或者忘记了孩子们请求第二天吃的饭后甜点是什么?如果他们可将其请求输入一个共享的杂货列表中,您可收到推送通知提醒您更新,那该多好?
输入 BlueList 应用程序。这是一个简单的 iOS 应用程序,我们将向它添加 IBM Mobile Data for Bluemix 服务来在云中存储、删除、更新和查询存储的对象。未来的教程将展示如何添加 Push 和 CloudCode 服务,以便您在列表更新时获得通知(Push 服务),在一个设备以某种方式更新列表时,所有设备上的列表都会刷新(CloudCode 服务)。
“ 这个简单的应用程序使用了 Bluemix 服务,将引导您立即开始编写自己的(更复杂的)应用程序。 ”
bluelist-base(v0) 代码是 BlueList 应用程序的基础版本。我们将展示如何添加 IBM Mobile Data for Bluemix 服务,让您的代码看起来将像 bluelist-mobiledata(v1) 代码。您可以从 bluelist-base(v0) 开始逐步执行,或者直接下载 bluelist-mobiledata(v1)。BlueList 应用程序的 bluelist-mobiledata(v1) 版本包含 IBM Mobile Data for Bluemix 服务。
完成您的应用程序的前提条件
-
基本熟悉 iOS 开发。Apple 开发者教程 “ 立即开始开发 iOS 应用程序 ” 描述了如何安装 Xcode 和编写基本应用程序。
-
bluelist-base(v0) 代码。单击上面的按钮,然后将 bluelist-base-iOS 代码导入您的开发环境中并进行构建。在模拟器中运行此代码。重新启动应用程序,请注意列表项没有持久化。本教程中的步骤将展示如何将 IBM Mobile Data for Bluemix 服务添加到您的应用程序,以便让列表项持久化。
-
一个 Bluemix ID,用于获取 IBM Mobile Data for Bluemix 服务。
-
可选操作:熟悉 CocoaPods。CocoaPods 框架管理 Xcode 项目的库依赖项,将自动导入 BlueList 应用程序需要的依赖项。项目的根目录中提供了一个指定依赖项的 Podfile。熟悉 安装 和 使用 CocoaPods 的操作。
第 1 步. 在 Bluemix 上创建一个 Mobile Cloud 应用程序
登录到 Bluemix 。
单击 Add an application 转到应用程序目录。
单击 Boilerplates 下的 Mobile Cloud 。
单击 Create Application 。
选择一个空格并为您的应用程序选择一个名称,填入到 “Finish Adding Mobile Cloud” 面板中。然后单击 Create 。
创建应用程序后,它将显示在您的仪表板中。单击您的新应用程序转到它的 Overview 页面。
第 2 步. 安装和配置 SDK
备注:如果选择使用 CocoaPods 方法安装 SDK Framework 文件,您可跳过第 1 - 6 步。依据前提条件中的 CocoaPod 操作说明,这将涉及到运行示例中包含的 Podfile。
您将看到新应用程序的 Overview 页面。然后单击 Download SDKs 。 备注:在以后的操作中将需要这个 Application ID。
您将看到介绍如何构建一个移动应用程序的文档。在这里,单击 iOS SDK 。
在 Finder 中,找到 IBMBluemix 框架 (/IBMBluemix.framework)。将此框架拖入到 BlueList Xcode 项目中的 Frameworks 文件夹下。
勾选 “Copy items into destination group's folder (if needed)”。
在 Finder 中,找到 IBMData SDK Framework。将此框架拖入到 BlueList Xcode 项目中的 Frameworks 文件夹下,就像 IBMBluemix 框架一样。
修改 bluelist.plist 文件,使它包含应用程序 Overview 页面上的 applicationId、applicationSecret 和 applicationRoute 值。(要打开 Overview 页面,可转到 Download SDKs 页面,方法是登录到 Bluemix,转到您的仪表板,然后单击想要的应用程序。)
备注 :使用 XCode 创建一个新 iOS 应用程序时,必须将 -ObjC 和 -lsqlite3链接器标记添加到构建设置中。为此,选择应用程序的目标并单击 Build Settings。从这里,您可搜索 “Other Linker Flags”。如果未看到结果,请确保您选择了 “All” 设置,而不是 “Basic”。我们已为您将标记添加到示例项目中。
第 3 步. 修改代码以利用 Data 服务
打开 IBM_Item.h。检查当前代码。
1
2
3
4
5
|
#import @interface IBM_Item : NSObject
@property(nonatomic, copy) NSString *name;
@end
|
将超类更改为 IBMDataObject ,让 IBM_Item 遵守IBMDataObjectSpecialization 协议。通过遵守IBMDataObjectSpecialization 协议,将告诉编译器,您将在 IBM_Item 内中实现 IBMDataObjectSpecialization 方法。
1
2
3
|
#import #import @interface IBM_Item : IBMDataObject @property(nonatomic, copy) NSString *name;
@end
|
实现 dataClassName 方法,将 title 属性标记为 dynamic。另外在类方法initialize 中注册特殊化类。这将在 IBM_Item Objective-C 类与云中持久化的 JSON 类 “ Item ” 之间建立一个映射。
1
2
3
4
5
6
7
|
#import "IBM_Item.h"@implementation IBM_Item@dynamic name;
+(void) initialize
{ [self registerSpecialization];
}
+(NSString*) dataClassName
{
return
@
"Item"
;
}@end
|
第 4 步. 将 Bluemix iOS SDK 和 IBM Mobile Data for Bluemix 服务链接到应用程序代理中
首先,从之前编辑的 plist 文件读取应用程序 ID。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#import #import #import "IBM_AppDelegate.h"
@implementation IBM_AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSString *applicationId = nil;
NSString *applicationSecret = nil;
NSString *applicationRoute = nil;
BOOL hasValidConfiguration = YES;
NSString *errorMessage = @
""
;
// Read the applicationId from the bluelist.plist.
NSString *configurationPath = [[NSBundle mainBundle] pathForResource:@
"bluelist"
ofType:@
"plist"
];
if
(configurationPath){
NSDictionary *configuration = [[NSDictionary alloc] initWithContentsOfFile:configurationPath];
applicationId = [configuration objectForKey:@
"applicationId"
];
if
(!applicationId || [applicationId isEqualToString:@
""
]){
hasValidConfiguration = NO;
errorMessage = @
"Open the bluelist.plist and set the applicationId to the Bluemix applicationId"
;
}
applicationSecret = [configuration objectForKey:@
"applicationSecret"
];
if
(!applicationSecret || [applicationSecret isEqualToString:@
""
]){
hasValidConfiguration = NO;
errorMessage = @
"Open the bluelist.plist and set the applicationSecret with your Bluemix application's secret"
;
}
applicationRoute = [configuration objectForKey:@
"applicationRoute"
];
if
(!applicationRoute || [applicationRoute isEqualToString:@
""
]){
hasValidConfiguration = NO;
errorMessage = @
"Open the bluelist.plist and set the applicationRoute to the Bluemix application's route"
;
}
}
|
发出一个请求来初始化 SDK 和 IBMData 服务。将这个请求添加到 IBM_AppDelegate.m 中紧挨读取 bluelist.plist 文件的语句之后。
1
2
3
4
5
6
7
8
9
10
|
if
(hasValidConfiguration){
// Initialize the SDK and Bluemix services
[IBMBluemix initializeWithApplicationId:applicationId andApplicationSecret:applicationSecret andApplicationRoute:applicationRoute];
[IBMData initializeService];
}
else
{
[NSException raise:@
"InvalidApplicationConfiguration"
format: @
"%@"
, errorMessage];
}
return
YES;
}
@end
|
第 5 步. 修改 IBM_ListViewController 类,以列出并持久化来自 MBaaS Data 服务的数据
修改 listItems 、 createItem 、 updateItem 和 deleteItem 方法 (IBM_ListViewController.m) 以将各项的更改持久化到 MBaaS Data 服务中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
- (void)listItems: (void(^)(void)) cb
{
IBMQuery *qry = [IBM_Item query];
[[qry find] continueWithBlock:^id(BFTask *task) {
if
(task.error) {
NSLog(@
"listItems failed with error: %@"
, task.error);
}
else
{
self.itemList = [NSMutableArray arrayWithArray: task.result];
[self reloadLocalTableData];
if
(cb){
cb();
}
}
return
nil;
}];
}
- (void) createItem: (IBM_Item*) item
{
[self.itemList addObject: item];
[self reloadLocalTableData];
[[item save] continueWithBlock:^id(BFTask *task) {
if
(task.error) {
NSLog(@
"createItem failed with error: %@"
, task.error);
}
return
nil;
}];
}
- (void) updateItem: (IBM_Item*) item
{
self.editedCell.textLabel.text = item.name;
[[item save] continueWithBlock:^id(BFTask *task) {
if
(task.error) {
NSLog(@
"updateItem failed with error: %@"
, task.error);
}
return
nil;
}];
}
-(void) deleteItem: (IBM_Item*) item
{
[self.itemList removeObject: item];
[self reloadLocalTableData];
[[item
delete
] continueWithBlock:^id(BFTask *task) {
if
(task.error){
NSLog(@
"deleteItem failed with error: %@"
, task.error);
}
else
{
[self listItems: nil];
}
return
nil;
}];
// Exit edit mode to avoid need to click Done button
[self.tableView setEditing:NO animated:YES];
}
|
第 6 步. 运行应用程序
现在您完成所有代码更改,您的代码现在应与第 1 版等同,而且您的列表项应已持久化!
在 iOS 模拟器或您的 iOS 设备中运行代码。
向列表中添加两个列表项。
现在挑选一项,单击它以对它进行编辑。
保存刚编辑的项。它现在应已在列表视图中修改。
重新启动应用程序。
可以注意到,您的数据项已持久化。现在您已将数据持久化到云中!
第 7 步. 在云中查看数据
登录到 Bluemix。
在 Dashboard 视图中单击您的应用程序。
单击 MobileData Service。
在 Manage Data 选项卡上,可以看到存储在云中的 Data Classes,以及持久化的每个 Data Class 实例。
在 Analytics 选项卡上,您可看到您应用程序的各种分析数据,包括不同设备的 API 调用总数、不同类型的 API 调用,以及使用的存储容量。
使用 Bluemix 中的 MobileData 服务开发这个应用程序,您应该已经了解到通过移动云服务来使用和集成移动数据功能有多容易!
(来源:developerworks)