今天凌晨微信小程序(應(yīng)用號)對外發(fā)送內(nèi)側(cè)邀請,瞬間在廣大前端和移動端界炸開了鍋。恩,H5或者說JS的又一個春天來了。
原歸正傳,這里要說的是在iOS端集成Weex時我們?nèi)绾谓oweex頁面?zhèn)髦担约皐eex頁面如何調(diào)用iOS的native方法呢?且聽我慢慢道來。
其實(shí)我這幾天一直在尋找native端往weex頁面?zhèn)髦档慕鉀Q方法,只是資料太少,于是乎我去github提Issues:https://github.com/alibaba/weex/issues/1270
(汗,鏈接居然404,google搜“【PR】請教下iOS 端 native怎么傳值到j(luò)s”吧)
很快得到回復(fù)。看了中文文檔之后,我大致知道應(yīng)該使用callback回調(diào):https://github.com/weexteam/article/issues/17
但是按照文檔來寫之后愣是沒成功,于是我又在qq群里提問,老司機(jī)說是作用域不一樣,要在外部先聲明var self = this,像這樣:
var self = this
eventModule.openURL('', function(ret){
self.nativeLog(ret)
})
所以接下來就是我的代碼了
1:新建WXEventModule類:
#import <Foundation/Foundation.h>
#import <WeexSDK/WXEventModuleProtocol.h>
#import <WeexSDK/WXModuleProtocol.h>
#import <WeexSDK/WXNetworkProtocol.h>
#import <WeexSDK/WXUtility.h>
@interface WXEventModule : NSObject <WXEventModuleProtocol, WXModuleProtocol,WXNetworkProtocol>
- (void)testAction;
@end
#import "WXEventModule.h"
#import "WGWeexTestViewController.h"
#import "WGWeexDemoViewController.h"
#import <WeexSDK/WXBaseViewController.h>
@implementation WXEventModule
@synthesize weexInstance;
//這里記得添加這個宏,這樣weex才能識別native的方法
WX_EXPORT_METHOD(@selector(openURL:callback:))
- (void)openURL:(NSString *)url callback:(WXModuleCallback)callback
{
callback(@{@"result":@"1"});
}
@end
2:然后在Appdelegate方法中通過調(diào)用 WXSDKEngine 中的 registerModule:withClass方法來注冊自己的module
[WXSDKEngine registerModule:@"event" withClass:[WXEventModule class]];
3:在weex中:
這里的 require 里面的event 就是在 上一步調(diào)用registerModule: 注冊module 時候的name(我就直接復(fù)制文檔上的原話了-)。
methods: {
updateHandler : function(e){
//千萬記得這句(先在外部聲明),不能在回調(diào)中直接使用this.function(),不然不執(zhí)行
var self = this;
var eventModule = require('@weex-module/event');
eventModule.openURL('test.js',function(ret) {
//回調(diào)執(zhí)行
self.loadVersionData(ret.result);
});
},
恩,這樣就成功了,weex調(diào)用原生的方法,然后原生通過callback傳參數(shù)到weex頁面,這里要說明下,callback(data)中這樣 data 支持的參數(shù)類型可以是 NSDictionary, NSString, NSArray, Int, Float, Bool ,具體可以看Issues:https://github.com/alibaba/weex/issues/866
由于weex剛開源不久,資料比較少,所以解決問題的話還是直接去github上提Issues或者看別人的回答吧(使用百度的朋友請哭吧,百度基本沒有任何線索,請google吧)。
由于我是直接在公司項(xiàng)目中用的,本文的demo就不放github了,有什么問題可以留言。