Peter's Den

悲观者只见到机会后面的问题,乐观者却看见问题后面的机会

Hello,在下2012年涉足Apple Developer,至今在iOS/OSX领域混迹多年,本职工作以iOS为主


精通Objective-c/Swift,对Python/Java/.Net/JavaScript也略懂一二,会与大家在这里记录分享

iOS项目中集成Weex

设置Podfile

source 'git@github.com:CocoaPods/Specs.git'
target 'FirstWeex' do
    platform :ios, '8.0'
    pod 'WeexSDK', '0.20.1'
end

网络不好的情况,pod install的时候会在git clone卡住,原因就是github在海外,所以我们此时最好是通过VPN代理

配置下git config

git config --global http.https://github.com.proxy socks5://127.0.0.1:1086

1086 是端口号,请看下自己机器的sock代理端口号

ok,此时pod install就瞬间成功

安装Weex环境

若未安装npm:brew install npm

安装weex:

npm install weex-toolkit -g

然后通过weex命令创建一个空模板:

weex create WeexDemo
cd WeexDemo

在src文件里面就是默认的vue文件,通过npm start启动web看到效果

通过npm run build可以将vue打包成bundlejs文件,会自动生成在dlist文件夹下面,将生成的index.js文件放到iOS工程里面

然后开始在代码中初始化weex,建议写在didFinishLaunchingWithOptions

WXAppConfiguration.setAppGroup("jinxuebin")
WXAppConfiguration.setAppName("firstweex")
WXAppConfiguration.setAppVersion("1.0")
WXSDKEngine.initSDKEnvironment()

然后去Controller创建一个weex实例

class ViewController: UIViewController {

    private var weexView: UIView?
    
    private lazy var weex: WXSDKInstance = {
        let weex = WXSDKInstance()
        weex.viewController = self
        weex.frame = self.view.frame
        return weex
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        weex.onCreate = { [weak self](wView) in
            guard let wView = wView else {
                return
            }
            self?.weexView?.removeFromSuperview()
            self?.weexView = wView
            self?.view.addSubview(wView)
        }
        weex.onFailed = { (error) in
            print(error)
        }
        weex.renderFinish = { (_) in
            print("finish")
        }
        
        
        let bundleUrl = Bundle.main.url(forResource: "index", withExtension: "js")!
        weex.render(with: bundleUrl, options: ["bundleUrl": bundleUrl.absoluteString], data: nil)
    }

    deinit {
        weex.destroy()
    }

}

启动项目成功,如图

不过,有没有发现,图片并没有显示出来,我们得找找问题在哪里?

其实是因为Weex自身没有实现加载图片的功能,只是定义了协议WXImgLoaderProtocol,需要由使用者来实现

我们来创建一个实现类WeexImageLoader.swift,我们就用三方库SDWebImage来举例

//
//  WeexImageLoader.swift
//  FirstWeex
//
//  Created by Peter on 2019/2/27.
//  Copyright © 2019 Peter. All rights reserved.
//

import UIKit
import WeexSDK
import SDWebImage

class WeexImageLoader: NSObject {

}

extension WeexImageLoader : WXImgLoaderProtocol {
    
    func downloadImage(withURL url: String!, imageFrame: CGRect, userInfo options: [AnyHashable : Any]! = [:], completed completedBlock: ((UIImage?, Error?, Bool) -> Void)!) -> WXImageOperationProtocol! {
        
        guard let URL = URL(string: url) else {
            return nil
        }
        
        return SDWebImageManager.shared()?.downloadImage(with: URL, options: [], progress: { (_, _) in
            
        }, completed: { (image, error, type, success, url) in
            completedBlock(image, error, success)
        }) as? WXImageOperationProtocol
    }
    
}

然后把实现类注册到Weex:

WXSDKEngine.registerHandler(WeexImageLoader(), with: WXImgLoaderProtocol.self)

然后启动,发现图片就加载出来了

OK,第一个Weex项目就启动成功了

最近的文章

Objective-C内存五大区

内存五大区 严格意义来说,这不能算是Objective-C的特性,应该是属于C语言的特性,这并不是本文的重点,重点是每个区块职责是什么。哪五大区 栈区(stack):由编译器自动分配并释放,存放函数的参数值,局部变量等。栈是系统数据结构,对应线程/进程是唯一的。栈是向低地址扩展的数据结构,是一块连续的内存的区域;先进后出(FILO—First-In/Last-Out) 优点:快速高效 缺点:内存大小有限制(iOS主线程栈大小1MB,其他线程是512KB。(Mac也只...…

iOS继续阅读
更早的文章

Java注解说明(持续更新)

什么是注解? Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据。 Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义Java标注。内置的注解 Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.a...…

Java继续阅读