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 种方法:show
、present
、pop
和 dismiss
,每个方法都调用 UIKit 中相应的函数。在 present
方法的第二个参数中,如果将其设置为 true
,则显示的 ViewController 将包含在 UINavigationController
中。
show
和 present
方法的第一个参数是一个字典,用于构建 ViewController。默认情况下,该方法将初始化一个 NovaRootViewController
实例。除了 class
之外的字典键将通过 Objective-C 运行时自动添加到新实例中。
自定义类
Nova.show({ class: 'DemoViewController' });
此方法将初始化您传递的 class
的一个新实例。除了 class
之外的参数将通过 Objective-C 运行时自动添加到实例中。请确保 class
是 UIViewController
的子类。
桥接
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'
}
]);
样式参数有三个可能值:cancel
、destructive
和 default
。每个值都与相应的 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
。
您可以使用 style
或 title
参数来自定义按钮,但只能有效一个参数,默认为 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
参数有三个值:portrait
、landscapeLeft
和 landscapeRight
。
数据
键值存储
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许可协议发布。