开放平台:StackMob for iOS

简介: 引言: StackMob 是一个轻量级的 Baas 移动后端云存储平台. 为移动App提供了强大的后台云存储能力,其SDK架接在Core Data身上,在不改变Core Data API 使用方式的前提下为Core Data 提供云端存储的能力,此篇专门介绍了 StackMob 在 iOS环境的使用方式.

引言:

StackMob 是一个轻量级的 Baas 移动后端云存储平台. 为移动App提供了强大的后台云存储能力,其SDK架接在Core Data身上,在不改变Core Data API 使用方式的前提下为Core Data 提供云端存储的能力,此篇专门介绍了 StackMob 在 iOS环境的使用方式.


参考资料:

1:StackMob 的主页

https://www.stackmob.com/

2:StackMob iOS开发文档

http://stackmob.github.io/stackmob-ios-sdk/

3:如何为iOS应用及游戏添加后台网络服务系列1  前言

http://blog.sina.com.cn/s/blog_4b55f6860101b991.html

4:StackMob SDK 官方使用教程

https://developer.stackmob.com/tutorials/ios

5:16小时的诱惑大致的介绍了StackMob从注册到使用的整个过程:

http://www.csdn.net/article/2013-03-19/2814542-build-an-airbnb-clone/1


安装:

StackMob是开源的,托管地址如下:

https://github.com/stackmob/stackmob-ios-sdk

安装的首先方式是CocoaPods.

可能遇到的问题:

1:解决AFNetworkKiting 安装后警告部署问题,详见这篇文章

2:解决 Reachability 类 的冲突问题,代码如下:


3:让 StackMob 连接至 Amazon S3 云存储服务

StackMob需要连接 Amazon S3 以后才拥有二进制文件的存储能力.

本篇博文大致的介绍了一下S3的注册流程,可以稍作参考:

http://www.xieyidian.com/2692


第一步:前往亚马逊Web Services 注册一个开发者账号:

https://aws.amazon.com/cn/

第二步:注册并激活 S3 

https://aws.amazon.com/cn/s3/

注册并激活S3需要一张支持外币付费的信用卡,建议使用万事达卡.

在索要卡片的界面填写如下:

类型选择:MasterCard

信用卡卡号

持卡人 拼音名称. (按照信用卡上面填写)

成功以后会扣费一美元. 并收到开通S3服务的邮件提醒.

此时便已经开通了S3的服务,拥有了使用的权利,如果此时进入S3的控制台依旧提示你需要注册的话,是浏览器缓存的问题,清空即可.

第三步:进入 S3的管理控制台 创建一个 Bucket 如下图:

https://console.aws.amazon.com/s3


Region 选择服务器所在的国家,里咱越紧越好. 日本吧


第四步:摘用StackMob官方的连接教程,基本上就搞定了:

http://developer.stackmob.com/tutorials/dashboard/Adding-a-Binary-Field-to-Schemas

在配置最后一步的链接时有一个字段要特别注意,如下图所示:


那就是S3 Path Alias  这个字段的值在设置不对的情况下去使用它生成的访问链接,访问的结果始终是下图中的错误:


如何才能正确设置S3 Path Alias?

首先要了解S3 Path Alias到底是做什么用的,它一个链接地址别名

当我们用StackMob上传一个二进制文件成功以后,StackMob会自动根据S3 Path Alias所给定的值自动生成一个完整的二进制文件下载链接.

如何检验这个下载链接的正确性,我们可以前往S3的控制台,随便找一个已经上传成功的文件,查看其详细信息,如下图所示:


拿图中的LinkStackMob所生成的链接进行对比,看看有哪里不一样了. 如果不一样,那么S3 Path Alias的设置肯定有问题.

从上图来说,正确的S3 Path Alias设置方法应该是:  http://s3-ap-northeast-1.amazonaws.com/musicpushtest/


最后S3的定价情况地址如下:(新用户注册免费12个月):

http://aws.amazon.com/cn/pricing/s3/



使用:


不足之处:

1:没有二进制文件上传进度

原因:求解决

2:多次发起查询请求和保存请求,都有可能产生Crash, 

原因: 由于线程调用错乱 导致StackMob停止工作甚至Crash,使用前,请熟悉GCD,可以参考这篇教程.  这篇更全面

3:查询和保存请求发起后,无法立刻撤销,必须等待整个请求完成

原因:求解决

4:分页查询起始索引默认必需设置值大于0 才有效果:

原因:我估计代码内部BUG,注释掉 判断大于0 即可修正

5:查询一对多的对象以后在缓存到本地时,写入指定Plist文件时Crash

原因:NSDictionary的key 不是 NSString 所致,   修改了源代码 替换键值对的方法.

6:利用对象层级展开以后,却无法获取子对象数据

原因:求解决




功能要点:

一:关于二进制文件上传

1.设置Core Data 数据模型的字段为字符串类型.

2.手动设置StackMob 的 Schema 里对应的字段为二进制类型. 

3.本地数据模型的字段名称和StackMob Schema 的字段名称 关系如下:本地Core Data: userIcon  Schema :user_icon

4.如果本地某个字段 对应着服务器的某个二进制字段时,就在上传服务器时必须通过如下代码赋值:

+ (NSString *)convertUploadWithPath:(NSString *)aPath withContentType:(NSString *)aContentType
{
    NSData *data = [NSData dataWithContentsOfFile:aPath];
    if (data) {
        NSString *dataString = [SMBinaryDataConversion stringForBinaryData:data name:[aPath lastPathComponent] contentType:aContentType];
        return dataString;
    }else
    {
        return @"file?";
    }
}

注:任何其他方式的赋值都不允许,否则会出现让人无法理解的BUG.(特别注意)

上传成功的二进制文件字段需要通过执行以下代码才能获取二进制文件的下载链接

[[StackMobManager contextForCurrentThread] refreshObject:self.dmSongTyoe mergeChanges:YES];

但是这个只对 新增的对象启效果,如果你是 更新对象使用上面的代码刷新的话,会变回你之前修改的值. 那又怎么解决呢?


二:数据缓存机制

StackMob的缓存机制默认是关闭的,如果要开启,需要对以下全局变量赋值:

SM_CACHE_ENABLED = YES;

设置以后, StackMob会自动创建一个本地 Core Data数据库自动管理和缓存来自服务器的数据.

针对查询数据机制有一个枚举来决定其取数方式:

typedef enum {
    SMCachePolicyTryNetworkOnly = 0,//只从网络取
    SMCachePolicyTryCacheOnly  = 1, //只从缓存取
    SMCachePolicyTryNetworkElseCache = 2,//先从网络取,取不到用缓存替代
    SMCachePolicyTryCacheElseNetwork = 3,//这个还没研究过
} SMCachePolicy;

如果用户更改了设备的网络环境,可以通过以下Block去修改查询数据机制:

SMClient *client = [[SMClient alloc] initWithAPIVersion:@"0" publicKey:@"XXXX"];
SMCoreDataStore *coreDataStore = [client coreDataStoreWithManagedObjectModel:myModel];
[client.session.networkMonitor setNetworkStatusChangeBlockWithCachePolicyReturn:^SMCachePolicy(SMNetworkStatus status) {
        if (status == Reachable) {
            return SMCachePolicyTryNetworkElseCache;
        } else {
            return SMCachePolicyTryCacheOnly;
        }
}];

那么在App启动的时候,判断一下当前的网络环境,设置好查询数据机制:

if ([Reachability isEnable3G] || [Reachability isEnableWIFI]) {
    [self.keyCoreDataStore setCachePolicy:SMCachePolicyTryNetworkElseCache];
}else
{
    [self.keyCoreDataStore setCachePolicy:SMCachePolicyTryCacheOnly];
}

三:关于保存(saveOnSuccess)

Object的任何增删改都通过saveOnSuccess 来保持云端的数据同步.

用起来蛮简单,不过也有些小细节要注意,否则也非常纠结.

1.saveOnSuccess因为一些网络原因或者保存重复主键等问题导致保存失败,会进入失败的Block.

如果连续进入三,四次左右的失败Block,它~~~~~ 它~丫的~  AppCrash了.   卧槽... 什么@try @catch 全都挡不住这个崩溃.

解决办法是在失败的Block里面执行Core Data上下文删除刚刚需要保存的对象的操作.

[StackMobManager contextForCurrentThread] deleteObject:obj];
这样不管你点多少次都不会 Crash了,我觉得这是 StackMob设计上的一些不足,不够我也是菜鸟,不能够做多评论.

2.Updating passwords via this API is disabled for security reasons. Use the resetPassword API instead

这个提示通过控制台打印过来,大意是说你当前的保存数据请求被云端给限制了. 

我是怎么触发这个Error的?

当我发起创建一个新User对象的同时,再多保存了一个File对象.File对象依赖于User对象,也就是说File对象的所有权是User对象的,但是你创建User对象的时候,你并没有登录.

处于授权安全机制,本次保存请求就算是失败,(即使数据已经保存到了云端).

解决办法是不要急着一起次保存到云端,只有等登录成功以后,再去发起File对象的保存请求即可.

四:关于查询(executeFetchRequest)

对Object的查询就靠这个函数了,基本雷同CoreData的查询函数,StackMob提供两种发起查询请求的方式.

一种是内部构建多线程运作工作,不会卡住主线程和影响界面,完成后通过主线程告知:

但是,连续多次发起这种请求方式, 有极高的几率导致整个SDK停止工作. 这是个比较严重的问题,应该是StackMob 的BUG,


另外一种则是不构建多线程,如果直接执行,在没返回结果之前会卡住主线程,影响界面体验,但是我们可以自己使用GCD来避免主线程阻塞的这个问题

用这种方式似乎可以避免多次发起请求所产生的BUG,至少暂时没发现. 

在发起查询请求之前有一个参数类要特别的注意一下,这个类也是实现个性化查询的一个重要途径之一,

它是SMRequestOptions

它有什么用:

1:是否要求刷新Token?   tryRefreshToken

2:以HTPPS加密的方式安全获取数据?   isSecure

3:当请求网络超时时,重试几次呢? numberOfRetries

4:返回的数据结构需要展开几个层次?(最多三级)  setExpandDepth


5:只是想返回某几个字段的数据而已  restrictReturnedFieldsTo








总结:

目录
相关文章
|
存储 缓存 开发工具
开放平台:Parse for iOS
引言: Parse一款基于Baas的后端云存储服务平台,为开发者提供云端数据存储和读取的能力,Parse团队在其SDK方面花费了大功夫,实现了很多非常有用的功能.
1344 0
|
API 开发工具 iOS开发
开放平台:微信 for iOS
按照常例,列一些网址先: 微信开放平台首页: http://open.weixin.qq.com 微信 iOS SDK 官方下载地址: http://open.
1200 0
|
API 开发工具 iOS开发
开放平台:新浪微博 for iOS
引言: 新浪微博几乎是把全平台数据的API接口都开放了出来,因此,很多优秀的第三方微博客户端在功能方面都非常的全面. 而通过SNS的分享推广方式在App世界里已经非常的普遍,甚至随处可见,本篇主要介绍一下App是如何跟新浪微博关联的.
1343 0
|
定位技术 iOS开发 数据安全/隐私保护
开放平台:百度地图 for iOS 使用相关
今天开始使用百度地图的API实现相关的地理位置功能 在根据官方文档: http://developer.baidu.com/map/sdkiosdev-2.
1051 0
|
1月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
109 1
|
1月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
4天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
20 9
|
4天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
2天前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。