Nova 0.2

Nova 0.2

Yubo Qin 维护。



Nova 0.2

  • Yubo Qin

Nova

一个轻量级的 iOS HTML 容器。

功能

  • 全屏原生样式的容器
  • JavaScript 注入
  • 自动加载远程 URL/本地资源
  • 模块化 MessageHandlers
  • 动态初始化 ViewControllers 并传递参数
  • 从原生 UI 组件返回 JavaScript 回调
  • 简单的键值数据持久化
  • 调用原生 Objective-C 方法并在 JavaScript 中回调

屏幕截图

使用方法

安装

pod install nova

基本

简单地使用 NovaRootViewController 或其子类,并将其 url 属性设置为本地 HTML 资源或远程网站。

导航

基本用法

Nova.show({ url: 'navigation.html', title: 'Navigation' });
Nova.present({ url: 'navigation.html', title: 'Navigation' }, true);
Nova.pop();
Nova.dismiss();

对于导航,有 4 种方法:showpresentpopdismiss,每个方法都调用 UIKit 中相应的函数。在 present 方法的第二个参数中,如果将其设置为 true,则显示的 ViewController 将包含在 UINavigationController 中。

showpresent 方法的第一个参数是一个字典,用于构建 ViewController。默认情况下,该方法将初始化一个 NovaRootViewController 实例。除了 class 之外的字典键将通过 Objective-C 运行时自动添加到新实例中。

自定义类

Nova.show({ class: 'DemoViewController' });

此方法将初始化您传递的 class 的一个新实例。除了 class 之外的参数将通过 Objective-C 运行时自动添加到实例中。请确保 classUIViewController 的子类。

桥接

Nova 允许您直接执行 Objective-C 原生方法,并将返回值用作 JavaScript 回调函数的参数。

基本用法

Nova.callNative('getSystemInfo').then(val => {
    // process return value in JavaScript
});

这将执行当前 NovaRootViewController 实例中的 getSystemInfo: 方法,并返回一个包含原生方法返回值的承诺。请注意,您在调用原生函数时可能需要使用 NovaRootViewController 的子类。

类和参数

Nova.callNative('getSystemInfo:', 'aParameter', 'TestClass').then(val => {
    // process return value in JavaScript
});

这将执行类方法 [TestClass getSystemInfo:aParameter],并返回一个包含原生方法返回值的承诺。请注意,当前只支持一个参数。请妥善设计您的函数。

使用参数时,请确保第一个参数是 SEL 选择符的字符串表示。':' 符号是必需的。其他参数是可选的。

用户界面

警告

默认警告

alert('message here');

默认标题是应用包的显示名称。要更改,只需修改您的 NovaRootViewController 类的 alertTitle 属性。

自定义警报

Nova.alert('Hello', 'Hello Again!', [
    {
        title: 'OK', 
        callback: 'alert(\'Callback from OK action\');' 
    }, {
        title: 'Cancel', 
        callback: 'alert(\'Callback from Cancel action\');', 
        style: 'destructive'
    }
]);

样式参数有三个可能值:canceldestructivedefault。每个值都与相应的 UIAlertActionStyle 枚举值相同。

回调参数也可以用 bridge 参数替换,该参数应该是一个字典,与 桥接 部分中描述的相同。

动作菜单

Nova.actionSheet('Hello', 'Hello Again', [
    {
        title: 'First', 
        callback: 'alert(\'Callback from First action\');' 
    }, { 
        title: 'Second', 
        callback: 'alert(\'Callback from Second action\');' 
    }, { 
        title: 'Destructive', 
        callback: 'alert(\'Callback from Destructive action\');', 
        style: 'destructive' 
    }, { 
        title: 'Cancel', 
        style: 'cancel' 
    } 
]);

与警报相同。

导航栏按钮

Nova.setRightBarButton({
    style: 'action', 
    callback: 'alert(\'This is a UIBarButtonItem\');' 
});

除了 setRightBarButton,您还可以使用 setLeftBarButton,它可以当然设置导航栏的左侧 UIBarButtonItem

您可以使用 styletitle 参数来自定义按钮,但只能有效一个参数,默认为 title。对于 style 参数,它将被转换为 UIBarButtonSystem 枚举,并且有一个非常直接的映射

@{
    @"add": @(UIBarButtonSystemItemAdd),
    @"done": @(UIBarButtonSystemItemDone),
    @"cancel": @(UIBarButtonSystemItemCancel),
    @"edit": @(UIBarButtonSystemItemEdit),
    @"save": @(UIBarButtonSystemItemSave),
    @"camera": @(UIBarButtonSystemItemCamera),
    @"trash": @(UIBarButtonSystemItemTrash),
    @"reply": @(UIBarButtonSystemItemReply),
    @"action": @(UIBarButtonSystemItemAction),
    @"organize": @(UIBarButtonSystemItemOrganize),
    @"compose": @(UIBarButtonSystemItemCompose),
    @"refresh": @(UIBarButtonSystemItemRefresh),
    @"bookmarks": @(UIBarButtonSystemItemBookmarks),
    @"search": @(UIBarButtonSystemItemSearch),
    @"stop": @(UIBarButtonSystemItemStop),
    @"play": @(UIBarButtonSystemItemPlay),
    @"pause": @(UIBarButtonSystemItemPause),
    @"redo": @(UIBarButtonSystemItemRedo),
    @"undo": @(UIBarButtonSystemItemUndo),
    @"rewind": @(UIBarButtonSystemItemRewind),
    @"fastforward": @(UIBarButtonSystemItemFastForward)
}

callback 参数也可以替换为 bridge

多个导航栏按钮

Nova.setRightBarButton([{
    style: 'add', 
    bridge: {
        func: 'getSystemInfo:',
        callback: 'updateUI',
        param: 'Another additional string',
    }
}, {
    style: 'action', 
    callback: 'alert(\'This is a UIBarButtonItem\');',
}]);

当传递数组而不是对象时,将自动创建并设置多个 UIBarButtonItem

方向

Nova.setOrientation('portrait');

direction 参数有三个值:portraitlandscapeLeftlandscapeRight

数据

键值存储

Nova提供了一个非常简单的键值存储,允许您通过WKWebView保存和检索持久数据。

保存

将值'value_you_want_to_save'保存到键'key_name'。

Nova.save('key_name', 'value_you_want_to_save');

加载

从键'key_name'加载值,带有默认值'default_value',并返回一个带有加载值的Promise。

Nova.load('key_name', 'default_value').then(val => {
    alert(val);
});

移除

从KV存储中移除一个键。

Nova.remove('key_name');

记事列表

  • 更好的JavaScript API
  • 使用Promise重构原生桥接
  • 提供更多原生UIKit API
  • JSCore处理JSValue和ObjC对象
  • 安全区域
  • 运行时方法调用
  • Swift兼容性
  • 用户代理
  • 使用mmap进行数据持久化

许可协议

Nova采用MIT许可协议发布。