宁波小程序开发_宁波软件开发_宁波网络公司【昱远信息】 15058005455
小程序app开发: FinClip安全沙箱的初始化SDK代码库成功编译(组图)|昱远信息系统开发

FinClip+Rust(二):环境搭建

FinClip+Rust (二): 环境搭建

以上(《FinClip小程序+Rust(一)》))介绍了“三明治蛋糕架构”:应用场景用小程序实现,算法逻辑用Rust实现。在使用中,中间层是操作系统原生技术实现的“宿主”,将两者粘合和桥接,宿主代码保持相对简单和稳定。

本文以iOS为例介绍开发环境的准备。

从零到一:构建可以运行小程序的应用

我们首先从 FinClip 官网下载最新的 FinClip SDK。解压后应该会得到FinApplet.framework、FinAppletExt.framework、FinAppletWebRTC.framework、FinAppletBLE.framework等一系列库。

使用 xcode 创建一个新项目,为简单起见,让我们构建一个基于 Objective-C 的 Storyboard。

这里需要注意的是,我们需要注意给这个App命名,记住它的Bundle ID,如下图,我们App的Bundle ID是com.finogeeks.rustful.clip。

然后将FinClip SDK解压包中的FinApplet.framework添加到工程中,注意勾选“Copy items if needed”。

在macOS上使用较新版本的xcode 11.1或以上(作者使用的版本为13.0)编译上述项目,会报错无法继续.如果你有这种情况,可以在项目Build Settings中进行如下配置。

clip.xcodeproj Building for iOS Simulator, but the linked and embedded framework 'FinApplet.framework' was built for iOS + iOS Simulator

错误信息

个人怎么开发小程序_小程序app开发_微信小程序游戏开发

自 Xcode 12.3 起,Apple 建议使用 xcframework 而不是 Framework。本文依赖的FinClip SDK2.36.5还没有提供xcframework版本,所以存在上述问题,编译过程和一系列警告,但不影响运行. 它应该在未来的版本中得到解决。

FinClip SDK包含x86_64架构,方便我们在开发时用模拟器调试。本文的主要目的是测试FinClip小程序和Rust代码在iOS上的集成,使其可以在模拟器上运行。但是x86_64架构的SDK在打包上传到应用市场时会报错。如何在打包的时候自动去掉模拟器架构的脚本,让我们可以用模拟器开发调试,正常提交应用市场。它不在本文的范围内。详情可参考iOS集成官网。

FinClip 安全沙箱的初始化

在 FinClip SDK 代码库成功编译并内置到 App 中之后,就可以进行代码集成了。这包括注册和生成 SDK Key 和 SDK Secret小程序app开发,并使用至少 4 行代码在 App 中初始化 FinClip SDK,准备加载和运行 FinClip 小程序。

SDK Key和SDK Secret的两种获取方式

FinClip 技术分为终端端和云(服务器)端两部分。终端端为FinClip SDK,云端(服务器)端为FinClip小程序管理中心/小程序商店,用于实时动态管理小程序的加载和卸载以及小程序开发管理用户数(如您所熟悉的 Internet 小程序平台)。方太极客为整个解决方案提供了两种部署方式:

根据我们打算使用谁的服务器,需要在服务器上生成 SDK Key 和 SDK Secret,因为最终 App 中嵌入的 SDK 需要得到连接的目标服务器的安全授权。

方法 1:使用托管服务

这是最简单最直接的方式,也就是说我们要开发的小程序上架。(注:本系列内容的验证需要使用自己部署安装的社区版,为完整起见,这里对服务进行简单介绍)。

首先,您需要注册一个开发者帐户。

二、登录后,在管理页面“应用管理-新建协同应用”中,添加需要与SDK集成的目标应用。

具体操作详情见

您将获得类似于以下内容的 Key 和 Secret:

准备将它们粘贴并复制到初始化代码中。

个人怎么开发小程序_微信小程序游戏开发_小程序app开发

方法二:自行部署 FinClip 社区版

如果你不想自己搭建一套 FinClip 并且有一个小程序商店在你的控制之下,那么你可以在自己的开发环境中轻松部署一个社区版本(作为前提 微信小程序开发 ,注意先安装 docker 相关工具):

mkdir my-finclip
cd my-finclip
sudo sh -c "$(curl -fsSL https://static.finogeeks.club/deploy/mop/release/install.sh)"

安装成功后,在上述目录下运行:

docker-compose up -d

如果你在 MacOS 上使用 Docker Desktop,打开 Dashboard 应该会看到下图,其中每个容器都应该处于运行状态(除了 mop-init "EXITED(0)" 是正常的)。

此时 系统定制开发 ,FinClip管理后台(分为开发者“企业端”和运营管理者“运营端”)可以通过以下网址访问:

登录企业终端和操作终端的默认用户名为“”,密码为“123Abc”。

首先,我们扮演一个管理角色,在运营商端注册我们要开发的移动应用的Bundle ID。Bundle ID 是您将要在 Apple App Store 或 Android 应用商店中发布的应用程序的应用程序标识符。

这里作为示例,我们添加了一个 Bundle ID “com.finogeeks.rustful.clip”(记住在 Xcode 中创建 App 时定义的名称):

输入后,同样的Bundle ID也关联到FinClip

其次,我们扮演开发者的角色,在企业端添加一个合作应用,我们称之为rust-ios 小程序开发制作 ,关联对应的Bundle ID:

个人怎么开发小程序_小程序app开发_微信小程序游戏开发

到目前为止,我们已经关联了以下信息:

在 App 中初始化 FinClip SDK

现在我们准备编写代码来初始化 Xcode 创建的剪辑项目中的 SDK。在 AppDelegate.m 中,添加以下代码:

//
//  AppDelegate.m
//  clip
//
#import "AppDelegate.h"
#import 
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSString *appKey = @"22LyZEib0gLTQdU3MUauARgvo5OK1UkzIY2eR+LFy28NAKxKlxHnzqdyifD+rGyG";
    FATConfig *config = [FATConfig configWithAppSecret:@"8fe39ccd4c9862ae" appKey:appKey];
    config.apiServer = @"http://127.0.0.1:8000";
    [[FATClient sharedClient] initWithConfig:config error:nil];
    [[FATClient sharedClient] setEnableLog:YES];
    return YES;
}
#pragma mark - UISceneSession lifecycle
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
    // Called when a new scene session is being created.
    // Use this method to select a configuration to create the new scene with.
    return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet *)sceneSessions {
    // Called when the user discards a scene session.
    // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
    // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
@end

Rust 开发环境的准备

安装 Rust 环境相对简单。例如,在 Mac/Linux 上,一行脚本就足够了:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

其他相关内容请参考官网。

为了将 Rust 代码编译成 iOS 和 Android 的组件库,我们需要安装一些平台架构目标:

# Android targets
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
# iOS targets
rustup target add aarch64-apple-ios armv7-apple-ios armv7s-apple-ios x86_64-apple-ios i386-apple-ios

此外,我们还需要安装两个工具来构建 iOS 通用库,以及从 Rust 代码生成 C/C++ 头文件 小程序开发制作 ,供 Objective-C/Swift 项目在导入静态库时使用:

# 安装 Xcode build tools(如果已经安装,请忽略)
xcode-select --install
# 这个cargo subcommand用于构建iOS上的universal library
cargo install cargo-lipo
# 这个工具用于自动生成 C/C++11 头文件
cargo install cbindgen
# 在Android环境,请先安装Android Studio和NDK,但不在本文讨论范围
cargo install cargo-ndk

关于cargo-lip的介绍可以看这里,关于cbindgen的可以参考这里。不过其实以后有兴趣也可以看看,要知道这里并没有什么问题,也不影响使用。

编译成 iOS 静态库的 Rust 代码验证

在开始正式开发之前,我们可以编写一个简单的“Hello World”来验证上述环境。首先 系统定制开发 ,使用 cargo 创建一个新的 Rust 库项目类型项目。原因是我们将这个库导入到iOS项目中,并在FinClip SDK中注册函数,供小程序端通过JavaScript接口调用。

小程序app开发_微信小程序游戏开发_个人怎么开发小程序

cargo new --lib hello

Cargo 自动生成以下目录:

hello
   |--src
   |    |--lib.rs
   |--Cargo.toml

我们的 Cargo.toml 看起来像这样:

[package]
name = "rustylib"
version = "0.1.0"
authors = ["me "]
edition = "2021"
[lib]
name = "rustylib"
# 构建iOS和Android版本需要的两个crate
crate-type = ["staticlib", "lib"]
# 编译Android版时需要,本文不涉及,但列出在此供Android开发者参考
[target.'cfg(target_os = "android")'.dependencies]
jni = { version = "0.19.0", default-features = false }

现在让我们修改 lib.rs。因为这个实验项目不是简单的运行一个 Rust 'Hello World',而是验证一个可以被异构语言调用的 C 库的输出,所以这里我们使用 Rust FFI(Foreign Function Interface)来编写(看起来像比“正常”的“Hello World”更复杂):

// lib.rs
use std::ffi::{CStr, CString};
use std::os::raw::c_char;
#[cfg(target_os = "android")]
mod android;
#[no_mangle]
pub unsafe extern "C" fn hello(to: *const c_char) -> *mut c_char {
    let c_str = CStr::from_ptr(to);
    let recipient = match c_str.to_str() {
        Ok(s) => s,
        Err(_) => "you",
    };
    CString::new(format!("From Rust: {}", recipient))
        .unwrap()
        .into_raw()
}
#[no_mangle]
pub unsafe extern "C" fn hello_release(s: *mut c_char) {
    if s.is_null() {
        return;
    }
    drop(CString::from_raw(s));
}
#[no_mangle]
pub extern "C" fn hello_world() {
    println!("Hello, World");
}

当 Rust 编译器编译代码时,它会修改我们定义的函数的名称,为其编译过程添加一些额外的信息。为了从其他语言(例如 Objective-C、Swift)调用 Rust 函数,必须禁用 Rust 编译器的名称修饰。所以我们使用 no_mangle 的函数属性声明来指示这些函数的编译要注册到 FinClip SDK。

另外,我们还使用extern“C”声明告诉编译器,这样声明的这些函数是针对Rust以外的其他语言代码调用的小程序app开发,编译器需要保证输出是按照标准规范编译的C语言。

更多关于Rust语言的FFI(Foreign Function Interface)和unsafe等能力,不是本文的重点。可以参考 Rust 的相关方面。它将在本系列的后续章节中继续介绍。

为了验证上述功能是否有效,我们编写一个测试示例:

cd hello
mkdir examples
touch examples/test.rs

一个简单的测试如下:

// test.rs
use std::ffi::{CStr, CString};
use rustylib::{hello, hello_release};
fn main() {
    let input = CString::new("Hello, world!").unwrap();
    unsafe {
        let c_buf = hello(input.as_ptr());
        let slice = CStr::from_ptr(c_buf);
        println!("{}", slice.to_str().unwrap());
        hello_release(c_buf);
    }
}

在 hello 项目的根目录中,运行测试:

cargo run --example test

小程序app开发_个人怎么开发小程序_微信小程序游戏开发

应该产生以下结果:

Blocking waiting for file lock on build directory
Compiling rustylib v0.1.0 (/Users/myself/projects/hello)
Finished dev [unoptimized + debuginfo] target(s) in 5.89s
Running `target/debug/examples/test`
From Rust: Hello, world!

现在尝试为 iOS 编译:

$ cargo lipo --release

我们可以查看生成的静态库:

lipo -info target/aarch64-apple-ios/release/librustylib.a                         Non-fat file: target/aarch64-apple-ios/release/librustylib.a is architecture: arm64
ipo -info target/x86_64-apple-ios/release/librustylib.a                       
Non-fat file: target/x86_64-apple-ios/release/librustylib.a is architecture: x86_64

但是我们开发使用的是一个普通库Fat库,结合了以上两种架构,在如下目录:

ls -l target/universal/release/librustylib.a

要在 iOS 上验证这部分代码,可以先在 hello Rust 项目的根目录下生成一个 C 头文件:

cbindgen src/lib.rs -l c > rustylib.h

然后把这个头文件加入到AppDelegate.m中,然后修改,直接用C的方式调用'hello'和'hello_release'。代码很简单,这里不再赘述。但是在xcode中,需要将上面生成的librustylib.a和rustylib.h添加到项目中(如果你不是iOS开发者对xcode不熟悉,可以跳过这部分验证继续阅读本系列后续章节中的详细介绍)。

至此,我们已经集成了 iOS Native App、FinClip SDK 和 Rust 库三部分。接下来的内容将重点开发一个比“Hello World”更复杂、真正适合Rust实现的库小程序app开发,并让它通过FinClip小程序展示人机交互的界面。开发过程中用到的工具有点多,你需要:

对于第一次开发 Rust 的朋友,建议在 vscode 中安装以下扩展:

这就是现在。

相关文章

请移步更多内容:

【昱远信息系统定制开发】

返回列表

相关动态