若要使用WKWebView,请先移除URLProtocol的拦截,post 丢 body的问题暂未解决
Ferrari框架包含 为了降低原生方法翻译到js方法,并提供简洁且符合iOS/Android/JS的API风格的API调用方式,所以使用编译脚本/编译时AOP的方式,通过原生方法生成js方法提供调用。 Android库
例如:
+ (HSATestOutput *)allTypeWithInput:(HSATestInput *)inputParam abcabc:(void(^)(NSString *))completion FRRJSMethod {
completion(@"2fjhsdjfkl32j2lkj3rl2l3jl2j3lkj23kl2jl32j");
return [HSATestOutput testObject];
}
var returnValue = window.ferrari.allTypeWithInput({"propertyName1":"value1","propertyName2":23333},(output)=>{
console.log("completion:",output);
});
console.log("return:",returnValue);
iOS使用pod方式集成到工程 pod 暂未加入公有source
pod 'Ferrari'
并在podfile中,通过post_install配置xcode target环境变量,来指定Hybrid的JSExport的工作文件夹
post_install do |installer|
ferrari_bridge_path = '${PODS_ROOT}/../Ferrari/FRRJSExport'
installer.pods_project.targets.each do |target|
if target.name == "Ferrari"
target.build_configurations.each do |config|
config.build_settings['FERRARI_WORK_PATH'] = ferrari_bridge_path
end
end
end
end
要求:所有JSExport的内容(类、方法、参数类型定义)都必须在该文件夹下
iOS会直接将bridge对象注入到window对象,不需要js额外支持。
iOS/Android方法名必须一样,参数名也必须一样
iOS/Android方法名必须一样,参数名也必须一样
iOS/Android方法名必须一样,参数名也必须一样
重要的事情说3遍 不然等着被前端的哥哥姐姐揍吧
iOS:
NSObject
且继承FRRJSExport
协议Class
、Category
、Extension
中,就可以被接受为扩展类了。(当扩展类通过Category
、Extension
来继承FRRJSExport
,该扩展类可不强制继承NSObject
,但无视其父类中的扩展方法)implementation
中的方法为准,且需要方法添加FRRJSMethod
宏的标识。@interface FRRTestObject : NSObject <FRRJSExport>
@end
@implementation FRRTestObject
+ (HSATestOutput *)allTypeWithInput:(HSATestInput *)inputParam abcabc:(void(^)(NSString *))completion FRRJSMethod {
completion(@"2fjhsdjfkl32j2lkj3rl2l3jl2j3lkj23kl2jl32j");
return [HSATestOutput testObject];
}
@end
该代码定义了一个方法名为allTypeWithInput
的方法,该方法有两个参数,一个返回值,返回值为自定义的HSATestOutput
类型,参数inputParam
为自定义的HSATestInput
类型,参数completion
为参数为NSString
类型的block
则JS调用代码为:
var returnValue = window.ferrari.allTypeWithInput({"propertyName":"value1",propertyName:23333},(output)=>{
console.log("completion:",output);
});
console.log("return:",returnValue);
注意点:
FRRJSMethod
标志,则不认为是需要翻译成js的方法canIUse
方法才能解析参数的某个属性是否支持,并且自定义参数类型的属性,不能为blockboolean ferrari.canIUse(string keyPath)
判断API、返回值、回调、参数等是否在当前版本可用
方法名 | 参数 | 返回值 |
---|---|---|
canIUse |
string |
boolean |
使用${api}.${param}.${property}
方式使用
boolean
判断当前版本是否可用
${api}
: 代表API名${param}
:参数名或者return${property}
:参数或return的对象是否有此属性ferrari.canIUse('allTypeWithInput')
ferrari.canIUse('allTypeWithInput.return')
ferrari.canIUse('allTypeWithInput.inputParam')