GBCloudBox 是一个框架,用于在 iOS/Mac OS X 应用程序与服务器之间执行空中、异步、后台资源同步。假设您的应用程序依赖于一个名为 MyResource.js
的 jersey 资源文件,但您希望经常更改它而无需将整个应用程序重新提交到 App Store。GBCloudBox 允许您在应用程序内打包资源版本,发布和分发您的应用程序,然后一旦应用程序发布到野外,就可以将资源的更新版本推送到云端,并使野外的应用程序一旦新的资源可用,即可自动同步资源。
它包含一个服务器实现,预先配置为一次点击部署到 Heroku。它经过彻底的负载测试,可以支持 1300 个 req/s,每个 dyno(即免费)可以有 1000 个并发用户。在超负荷容量下,它可以优雅地降级,并可以维持 ~800ms 的端到端响应时间,有 4000 个并发用户,大约 38% 的请求丢失;即,通过量为 3100 个成功 req/s。您也可以根据自己的意愿编写自己的服务器实现。
首先添加 GBCloudBox 服务器
//Set the source servers, takes an array so if you have multiple servers, the library will load balance between them
[GBCloudBox setSourceServers:@[@"https://www.server1.com", @"https://www.server2.com"]];
然后注册一个资源
[GBCloudBox registerResource:@"MyResource.js"];
然后您可以在应用程序的任何位置获取资源数据
NSData *scriptData = [GBCloudBox dataForResource:@"MyResource.js"];
然后您将有一个代表您资源的最新版本的 NSData
实例。
我喜欢为我的资源注册一个反序列化程序,以便我可以轻松地获取本地对象,而不是 NSData
实例,在这种情况下我们的资源是 NSString
,所以我们的反序列化程序将类似于
[GBCloudBox setDeserializer:^id(NSData *data) {
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
} forResource:@"MyResource.js"];
现在,每当我需要真正的 NSString
对象时,它就简单多了
NSString *script = [GBCloudBox objectForResource:@"MyResource.js"];
您必须决定何时同步对象。这是一个异步的背景同步,您可以在应用程序启动时进行操作。要执行资源与服务器之间的最新版本的同步,您需要调用
[GBCloudBox syncResource:@"MyResource.js"];
要同步所有已注册资源,只需调用
[GBCloudBox syncResources];
GBCloudBox 会在更新后发布一个 kGBCloudBoxResourceUpdatedNotification
通知。然后您可以通过调用 objectForResource:
或 dataForResource:
如上所述来简单地获取最新版本。
或者,还有一个基于块的 API 注册一个后更新处理程序
[GBCloudBox addPostUpdateHandler:^(NSString *identifier, NSInteger version, NSData *data) {
//do something now that the resource has been updated
} forResource:@"MyResource.js"];
将资源包的初始版本与应用程序捆绑在一起是个好主意,这样用户可以使用而不需要立即联网(如果用户没有互联网或者应用程序无法在没有它的情况下运行)。
在你的应用程序中包含一个名为 GBCloudBoxResource.bundle
的文件夹。将你想要与应用程序一起分发的任何资源保存在那里。在这个包内,添加一个 Manifest.plist
plist,列举捆绑的资源及其版本。The Manifest.plist
具有以下格式:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>MyResource.js</key>
<dict>
<key>version</key>
<integer>1</integer>
<key>path</key>
<string>Resources/MyResource.js</string>
</dict>
<key>SomeOtherResource.json</key>
<dict>
<key>version</key>
<integer>4</integer>
<key>path</key>
<string>Resources/SomeOtherResource.json</string>
</dict>
</dict>
</plist>
库将随后智能选择最新的可用资源,缓存最新版本,并始终保持最新。
别忘了导入头文件
#import <GBCloudBox/GBCloudBox.h>
您的应用程序可以捆绑资源,以便从第一天开始就准备好使用,即使没有互联网连接。当您的应用程序与服务器同步并获得更新的版本时,它会将此版本缓存在本地磁盘上,以便从那时起,最新的版本始终可用,即使再次无法访问互联网也不例外。当有互联网连接可用时,库将尽力更新,并将负责缓存,并确保您的应用程序始终有最新的版本可用。这个库非常聪明,只有当有新版本可用时才下载资源,所以您可以有任意大小的资源,并且它的表现仍然合理。
参见:github.com/lmirosevic/GBCloudBoxServer-Ruby
版权 2013 Luka Mirosevic
根据Apache许可证版本2.0(“许可证”)授权;您不得未经许可使用本作品。您可以在LICENSE文件中或从以下位置获得许可证副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则根据许可证分发的软件按“原样”基础分发,不提供任何明示或暗示的保证或条件。有关许可协议的权限和限制,请参阅许可证。