SDK使用

主要介绍SDK的使用方法;

1.导入头文件

#import <MADCore/MADCore.h>

2. SDK初始化

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    
    self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
    
    //madp 初始化配置
    MADCoreConfig *config = [MADCoreConfig new];
    //MADCore库禁止日志
    config.weexLog = WXLogLevelOff; 
#ifdef DEBUG
    config.weexLog = WXLogLevelInfo;
#endif
    //MADP worker日志输出
    config.workerLog = YES;
    
    //sdk初始化
    [MADEngine initEnvironmentWithMADCoreConfig:config callback:^() {
        // 应用层注册自己的weexModule或者weexComponent
    }];
            
    [MADEngine startup];
    [self.window setRootViewController:[MADEngine getRootViewController]];
    [self.window makeKeyAndVisible];
    
    return YES;
}

3. module示例

自定义 module,需要让自己的 class 遵循 WXModuleProtocol 这个protocol,通过 WX_EXPORT_METHOD 这个宏暴露出需要透出到 JavaScript 调用的方法,再向 MAD 注册 module,就可以完成一个简单 module 的自定义。

3.1 新建一个基类为 NSObject 的 class WXCustomEventModule,让该类遵循 WXModuleProtocol 的协议。

    #import <Foundation/Foundation.h>
    #import <MADCore/MADCore.h>

    NS_ASSUME_NONNULL_BEGIN
    @interface WXCustomEventModule : NSObject<WXModuleProtocol>

    @end
    NS_ASSUME_NONNULL_END

3.2 添加打印的方法,通过 WX_EXPORT_METHOD 暴露该方法。

    #import "WXCustomEventModule.h"

    @implementation WXCustomEventModule

    WX_EXPORT_METHOD(@selector(showParams:))

    - (void)showParams:(NSString *)inputParam {
        NSLog(@"参数:%@",inputParam);
    }

3.3 在MAD初始化block里注册该 module,需要自定义module则需使用带callback的初始化方法,以便注册module。

    [MADEngine initEnvironmentWithMADCoreConfig:config callback:^{
        [WXSDKEngine registerModule:@"custom-module" withClass:NSClassFromString(@"WXCustomEventModule")];
    }
    到此,我们已经完成了一个简单的 module 方法的封装,在 JS 里使用方法如下:
    weex.requireModule("custom-module").showParams("hello Weex")

4. component示例

4.1 新建一个基类为 WXComponent 的类。如果这个类里什么代码也不写,它和默认的的 div 组件能力是一致的。

    #import <MADCore/MADCore.h>

    NS_ASSUME_NONNULL_BEGIN
    @interface WXCustomComponent : WXComponent

    @end
    NS_ASSUME_NONNULL_END

4.2 覆盖 WXComponent 中的生命周期方法

    * loadView 一个组件默认对应于一个 view,如果未覆盖 loadView 提供自定义 view,会让 WXComponent 基类创建 WXView。WXView 继承自 UIView。比如我们要实现一个组件支持地图功能,我们可以返回系统的 MKMapView。
    - (UIView *)loadView {
        return [MKMapView new];
    }
    
    * viewDidLoad 对组件 view 需要做一些配置,比如设置 delegate,可以在 viewDidLoad 生命周期做。如果当前 view 没有添加 subview 的话,不要设置 view 的 frame,WeexSDK 会根据 style 进行排版后设置。
    - (void)viewDidLoad {
          ((MKMapView*)self.view).delegate = self;
    }

4.3 注册组件(注册位置同注册module)

    [MADEngine initEnvironmentWithMADCoreConfig:config callback:^{
        [WXSDKEngine registerComponent:@"map" withClass:[WXCustomComponent class]];
    }

4.4 在前端代码中使用新组件

    <template>
        <div>
            <map style="width:200px;height:200px"></map>
        </div>
    </template>

更多WEEX相关用法请参考 [WEEX官网]: https://weexapp.com/zh/

注意事项

  • 调试日志的开关
    WeexLogLevel 可选择对应级别输出; WXLogLevelOff 为关闭日志,此时需要校验绑定的APPid(GREEN版本除外);
typedef NS_ENUM(NSUInteger, WeexLogLevel){
    /**
     *  No logs
     */
    WXLogLevelOff       = 0,
    
    /**
     *  Error only
     */
    WXLogLevelError     = WXLogFlagError,
    
    /**
     *  Error and warning
     */
    WXLogLevelWarning   = WXLogLevelError | WXLogFlagWarning,
    
    /**
     *  Error, warning and info
     */
    WXLogLevelInfo      = WXLogLevelWarning | WXLogFlagInfo,
    
    /**
     *  Log, warning info
     */
    WXLogLevelLog       = WXLogFlagLog | WXLogLevelInfo,
    
    /**
     *  Error, warning, info and debug logs
     */
    WXLogLevelDebug     = WXLogLevelLog | WXLogFlagDebug,
    
    /**
     *  All
     */
    WXLogLevelAll       = NSUIntegerMax
};
  • H5关于JSBridge的扩展
    对于需要使用JSBridge/JavaScriptCore等技术扩展h5的Native能力,通过应用层自定义web容器,直接对webview进行扩展。
    步骤1. 定义web容器,可以参考产品提供的web容器,完善数据拉取逻辑;
    步骤2. 在初始化回调中,注册web容器;
[MADEngine registerModule:@"web" withController:[CustomWebViewController class]];

如果使用过“web”注册,将使用自定义的web容器替换产品中内置的;
若要保留内置的容器,需要用其他字符注册,并在后管中配置对应的容器类型。

  • 抓包调试
    由于SDK的通讯层未使用系统代理,所以不能直接使用常用的抓包方式;
    解决方法:sdk初始化时使用接口配置抓包代理服务地址;

  • …………