使用swift 扩展weex module #55

Open
acton393 opened this Issue Jul 28, 2016 · 3 comments

Projects

None yet

2 participants

@acton393
acton393 commented Jul 28, 2016 edited

Swift In Weex

参考之前 Swift和Objective-C 混编的文档
Weex iOS SDK 是使用 Objective-C,结合部分C实现的,
引入 Swift,需要混编,直接进入正题

一个例子

SDK集成 参考

使用 Swift 进行 module 扩展

doc

因为 module 暴露 method 是通过Objective-C宏来做的,调用的时候是通过反射,所以Swift扩展 module 通过extension Objective-C的类,以下操作,可以直接在weex 的iOS playground 中进行

  • 新建 WXSwiftTestModule.h/mWXSwiftTestModule.swift文件, 在新建Swift文件的时候会提示
    img
    选择 Create Bridging Header, 因为我们要在 Swift 中访问 Objective-C 的一些类,正是通过这个 header暴露 OC 的类给 Swift,header 格式为 yourTarget-Bridging-Header.h,我这里创建完header文件名称为:WeexDemo-Bridging-Header.h

  • WXSwiftTestModule.h/m中实现

    • WXSwiftTestModule.h 中

          #import <Foundation/Foundation.h>
          #import <WeexSDK/WeexSDK.h>
      
          @interface WXSwiftTestModule : NSObject <WXModuleProtocol>
      
          @end
      
      
    • WXSwiftTestModule.m 中

      WeexDemo-Swift.h 这个文件需要编译一下才可以搜索到,具体的路径

      weex/ios/playground/DerivedData/WeexDemo/Build/Intermediates/WeexDemo.build/Debug-iphonesimulator/WeexDemo.build/DerivedSources/WeexDemo-Swift.h
      

      路径具体需要根据自己工程而定

          #import "WXSwiftTestModule.h"
          #import "WeexDemo-Swift.h" // Swift类和方法 被 `Objective-C` 识别需要导入
      
          @implementation WXSwiftTestModule
          #pragma clang diagnostic push //关闭unknow selector的warrning
          #pragma clang diagnostic ignored "-Wundeclared-selector"
      
          WX_EXPORT_METHOD(@selector(printSome:callback:)) //Swift 中定义的方法,XCode 转换成的最终的方法名称,在`WeexDemo-Swift.h`里面查看
      
          #pragma clang diagnostic pop
      
          @end
      
      
  • Swift 中实现
    扩展 OC 的类 WXSwiftTestModule,增加了一个方法,这个方法就是我们要暴露出来,在 js 中可以调到的

    • WXSwiftTestModule.swift

          import Foundation
          public extension WXSwiftTestModule {
             public func printSome(someThing:String, callback:WXModuleCallback) {
                 print(someThing)
                 callback(someThing)
             }
          }
      

      WXSwiftTestModuleWXModuleCallback 因为是 OC 的,需要在 WeexDemo-Bridging-Header 中暴露

    • WeexDemo-Bridging-Header.h中

      //
      //  Use this file to import your target's public headers that you would like to expose to Swift.
      //
      #import "WXSwiftTestModule.h"
      #import "WeexSDK.h"
      

      至此这个使用 Swift 开发的简单的 module 已经完成

    module 使用

    • 注册 module

      [WXSDKEngine registerModule:@"swifter" withClass:[WXSwiftTestModule class]];
      
      
    • we 文件中使用

      <template>
          <text>Swift Module</text>
      </template>
    
      <script>
        require('weex-components');
    
        module.exports = {
          data: {
    
          },
          ready: function() {
            var swifter = require('@weex-module/swifter');
            swifter.printSome("https://www.taobao.com",function(param){
              nativeLog(param);
            });
          }
    
        };
      </script>
    
@Bijiabo
Bijiabo commented Dec 7, 2016

完整根据这个代码来的,运行后发现找不到这个方法,提示:
[fg0,128,0; <Weex>[debug]WXJSCoreBridge.m:135, Calling native... instance:1, tasks:( { args = ( "https://www.taobao.com", 2 ); method = printSome; module = swifter; } ), callback:-1 �[;

@acton393
acton393 commented Dec 8, 2016

@Bijiabo 这个提示是 JS调用native的一个日志,可以参考一下这个例子 swiftExample

@Bijiabo
Bijiabo commented Dec 8, 2016

@acton393 sorry,复制错了内容,提示是这样的:
2016-12-08 23:29:07.413 learnProject [60197:2137501] �[fg255,0,0; <Weex>[error]WXMonitor.m:190, Module:swifter, method:printSome doesn't exist �[;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment