ResourceManager-smorel 1.2.0

ResourceManager-smorel 1.2.0

测试已测试
语言语言 Obj-CObjective C
许可证 自定义
发布上次发布2015年3月

Sebastien Morel维护。



  • 作者
  • Sebastien Morel

你是否厌倦了当你只想更新一个图片或一些文本内容时,还需要等待你的应用编译和同步到设备上?如果可以直接在空中分发你的应用,并且让文案编辑直接编辑本地化文件,那该有多好。想象一下,如果你可以将你的应用交给一个设计师,他们可以调整布局、字体、边距和颜色,而无需安装 Xcode 或任何 Objective-C 的知识,会怎么样?

使用 ResourceManager 框架 与 AppCoreKit 结合,并添加几行代码,所有这些都可以实现。

这是如何工作的?

ResourceManager 是一个旨在提高您开发 iOS 应用程序时生产力的框架。主要目标是同步多个资源库,并使用每个库的最新版本。这里的“资源”指的是您希望嵌入到应用中的所有内容,比如:图片、nib 文件、字符串文件、配置文件、json、AppcoreKit 样式表和布局、声音

ResourceManager 提供了类似于 NSBundle 的简单 API,可以从各个资源库中获取最新资源的路径。

库可以定义为包,以及 Dropbox 文件夹。资源管理器提供了类似于 NSNotificationCenter 的 API,以注册文件更新时的通知。一旦一个文件在远程存储中获得保存,如果需要,文件将被下载到应用的缓存目录,并向您的应用发送更新通知。您也可以通过观察文件扩展名来接收文件添加和变更的通知。

该框架应在开发过程中使用,因为您不希望因运行时文件更新而影响用户体验!您可以很容易地断开同步机制,但仍然不设置共享RMResourceManager来使用API从应用程序主包获取资源。

资源管理器支持iOS版本7及以上,以及以下架构:armv7、armv7s、arm64和i386(用于模拟器)。

示例用法

1. 初始化资源管理器

1.1. 从Dropbox同步资源

在Dropbox上创建您的应用程序

https://www.dropbox.com/developers/apps

在您的目标plist文件中

Dropbox身份验证机制需要通过URL Scheme进行应用程序重定向。请参阅“DropboxSDK文档”中的“从DropboxSDK文档”部分https://www.dropbox.com/developers/core/start/ios

认证后,您的应用程序将以URL Scheme db-APP_KEY重新启动。注册此方案的最简单方法是右键单击您的应用程序的plist文件,选择“Open As → Source Code”,并在第一个标签下方添加以下代码,用您的应用程序密钥替换APP_KEY

 CFBundleURLTypes CFBundleURLSchemes db-APP_KEY

在您的应用程序代理中

#import < ResourceManager/ResourceManager.h >

- (id)init{
   self = [super init];

    //Comment or remove the following code when you want to deactivate the sync mechanism
    RMDropboxResourceRepository* rp = [[RMDropboxResourceRepository alloc]initWithAppKey:@"APP_KEY" 
                                                                                  secret:@"APP_SECRET" 
                                                                           rootDirectory:@"ROOT_DIRECTORY"];
    RMResourceManager* rm = [[RMResourceManager alloc]initWithRepositories:@[rp]];
    [RMResourceManager setSharedManager:rm];


    //Do your stuff
}

1.2. 从您的XCode项目目录同步资源(仅限于模拟器工作)

在您的目标plist文件中

添加一个具有键“SRC_ROOT”和值“$SRCROOT/$PROJECT/”的字符串条目

在您的应用程序代理中

#import < ResourceManager/ResourceManager.h >

- (id)init{
   self = [super init];

    //Comment or remove the following code when you want to deactivate the sync mechanism
    NSString* projectPath = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"SRC_ROOT"];
    RMBundleResourceRepository* lr = [[RMBundleResourceRepository alloc]initWithPath:projectPath];
    lr.pullingTimeInterval = 1;

    RMResourceManager* rm = [[RMResourceManager alloc]initWithRepositories:@[lr]];
    [RMResourceManager setSharedManager:rm];

    //Do your stuff
}

2. 将所需的回调转发给资源管理器

在您的应用程序代理中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    //Do your stuff ...

    //After :
    [self.window makeKeyAndVisible];

    [RMResourceManager handleApplication:application 
           didFinishLaunchingWithOptions:launchOptions];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
                                       sourceApplication:(NSString *)sourceApplication 
                                              annotation:(id)annotation {

    [RMResourceManager handleApplication:application 
                                 openURL:url];

    //Do your stuff
}

3. 获取资源的最新路径

NSString* resourcePath = [RMResourceManager pathForResource:@"MyResource" 
                                                     ofType:@"myExtension"];
//Load the resource here using the "resourcePath" ...

4. 当此资源更新时接收通知

[RMResourceManager addObserverForPath:resourcePath 
                               object:self 
                           usingBlock:^(id observer, NSString *path) {
    //Load the resource here by using the last updated "path" ...
}];

由于管理器还在观察者对象上保持一些弱引用,所以当需要时或至少当您的对象(这里为“self”)被销毁时,您必须从资源管理器取消注册。

[RMResourceManager removeObserver:self];

5. 获取具有特定扩展名的资源的最新路径

NSArray* paths = [CKResourceManager pathsForResourcesWithExtension:@"mp3"];
//Do something with those files

6. 当这些资源更新或添加了具有指定扩展名的文件时接收通知

[CKResourceManager addObserverForResourcesWithExtension:@"mp3" 
                                                 object:self 
                                             usingBlock:^(id observer, NSArray *paths) {
    //Do something with the up to date paths for all mp3 files.
}];

对于单个路径观察器,也请务必取消注册您的观察者。

安装

安装ResourceManager建议使用CocoaPods包管理器,因为它提供了灵活的依赖关系管理和非常简单的安装过程。为了得到最佳结果,建议您使用CocoaPods >= 0.19.1 和通过Homebrew安装的Git >= 1.8.0进行安装。

作为框架

在您的应用程序中使用ResourceManager(预先编译)

您可以在我们的示例存储库中找到ResourceManager的预编译版本和示例集成https://github.com/smorel/appcorekit-samples

  • 拖放 ResourceManager和DropBoxSDK框架到您的XCode项目中。

  • 在构建阶段设置中将以下框架和库依赖项添加到您的项目中

    Security, 
    QuartzCore.
    
  • 在构建设置中将以下链接标志添加到您的项目中(OTHER_LDFLAGS

    -ObjC -all_load -weak_library /usr/lib/libstdc++.dylib
    

编译框架

ResourceManager以静态框架的形式构建。Xcode 5或更低的版本不支持原生静态框架,需要一些额外的配置来正确编译。如果您使用Xcode 6及以上版本,可以跳过此设置。

将以下文件复制到以下位置

./static Frameworks.xcspec

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications

并且

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications

重要:每次您将Xcode更新到较新版本时,都必须复制此文件。

在自己的应用中使用 ResourceManager(源代码)

  • Drag'n'drop ResourceManager 项目作为子项目添加到 Xcode 中。

  • 在构建阶段设置中,将 ResourceManager.framework 的 链接依赖 添加到您的目标中。

  • 在构建阶段设置中将以下框架和库依赖项添加到您的项目中

    DropboxSDK, (that can be found in this repository) 
    Security, 
    QuartzCore.
    
  • 在构建设置中将以下链接标志添加到您的项目中(OTHER_LDFLAGS

    -ObjC -all_load -weak_library /usr/lib/libstdc++.dylib
    

编译 API 文档

ResourceManager 提供了一个 "Documentation" 目标,用于使用公共头文件以及“Documentation”文件夹中的附加编程指南生成 docset。此目标基于 "appledoc" 脚本。要安装 appledoc,请按照以下安装程序说明进行操作: https://github.com/tomaz/appledoc

您的 Dropbox 资源仓库

文件夹

资源管理器支持文件夹中的资源。在将文件下载到应用程序的缓存目录时,它将简化文件层次结构,以匹配它会在应用程序包中具有的层次结构:1 个根目录和本地化文件夹。

限制/权限(高级用户)

将资源组织到文件夹中的优点之一是资源管理器框架提供了一个机制,用于指定文件夹或文件扩展名的 用户级 限制。

此功能允许您控制访问您的客户端或同事。例如,假设您想让设计师为您应用程序的一个特定版本定制一些资源文件。但同时,您还想继续工作于您应用程序的下一版本,在此过程中定制资源。通过在只有您才能访问的文件夹中进行工作,他们的应用程序版本将不会受到您在该文件夹中做出的更改的影响。

同时,一旦您给新用户赋予访问权限,他们的应用程序就会收到通知,并且他们的版本将自动更新。一旦您取消对该人员的访问,新受限的文件将被从他们的缓存目录中删除,并且他们应用程序的版本将再次使用主包资源。

这也可以用于测试应用程序的两个不同版本,通过授予用户对不同的应用程序资源版本访问权限。

以下是一个示例 ResourceManager.permissions 文件,您可以将该文件放置到 Dropbox 文件夹中,以便在保存此文件时更新用户限制。用户是您要为其指定限制的 Dropbox "显示名称"。

[
   { "folder" : "folder1", //and its subfolders
     "users" : [
         "Sebastien Morel"
      ]
   },

   { "folder" : "folder2",
     "users" : [
         "Sebastien Morel",
         "Frederic Brunel"
     ]
   },


   { "folder" : "folder1/nextedFolder1",
     "users" : [
         "Frederic Brunel"
     ]
   },

   { "extension" : "mp3",
     "users" : [
         "Sebastien Morel",
         "Frederic Brunel",
         "Martin Dufort"
     ]
   }
]

默认情况下,如果我们找不到 ResourceManager.permissions 文件,或者 Dropbox 中的文件夹/文件扩展名在权限文件中没有条目,我们认为每个人都可以访问此文件夹/扩展名中的文件。

完全集成到 AppCoreKit

它被设计为直接更新您的设备,而不是像在以前的 AppCoreKit 实现中那样只更新模拟器。对 AppCoreKit 进行了一些更改,以完全集成此新框架作为弱依赖关系,并以非常高效的方式。AppCoreKit 提供了自动重新加载样式表和布局、图像、映射、模拟、本地化文件(.strings)的机制,并作为结果更新 UI。前往 AppCoreKit github 存储库并获取 master 分支以尝试集成

https://github.com/smorel/AppCoreKit

致谢

如果您有任何评论、建议、问题或信息请求,请通过以下电子邮件联系我们:[email protected]

许可协议

本文件遵循Apache许可证2.0版本(以下称“许可证”);除非遵守许可证,否则您不得使用此文件。您可以在以下地址获取许可证的副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律要求或已以书面形式同意,否则在许可证下分发的软件按照“现状”原则分发,不提供任何形式的保证或条件,无论是明确的还是暗示的。有关许可证调控权限和限制的具体语言,请参阅许可证。