uniapp原生插件开发之iOS

6 篇文章 0 订阅

uniapp原生插件iOS开发官网地址

必备条件环境


步骤一.创建iOS SDK项目

  • 选择Framework或者Static Library类型

  • 写好项目名称AddSDK

为了省事,不用引入SDK,就把AddSDK工程创建在HBuilder-uniPluginDemo目录下(也可以自己创建一个新的APP,放在APP目录下,再引入SDK)

  • 建议把版本选到最低,不然到时候低版本的不支持

选择1target=>2build setting=>3搜索mach-o=>4改为static library,静态链接库

4.打开APP项目HBuilder-uniPluginDemo,

打开后右键target,Add files to "HBuilder-uniPluginDemo" // 你的工程名称

把创建的AddSDK引入到工程中,勾选第3,4项

5.target=> build phases=>dependenceis, link binary with liabraris加入framework 在图中3、4项点击+号添加刚才的AddSDK

接下来需要在插件工程的Header Search Paths中添加开发插件所需的头文件引用,头文件存放在主工程的HBuilder-Hello/inc中,添加方法如下图所示,在 Xcode 项目左侧目录选中插件工程名,找到TARGETS->Build Settings->Header Search Paths双击右侧区域打开添加窗口,然后将inc目录拖入会自动填充相对路径,然后将模式改成recursive

步骤二实现代码

.h代码如下

//

// AddObj.h

// AddSDK

//

// Created by wanmeizty on 30/5/2022

// Modified by Tiyon qq 897574226

//

#import "DCUniModule.h"

NS_ASSUME_NONNULL_BEGIN

@interfaceAddObj : DCUniModule

@end

NS_ASSUME_NONNULL_END

.m文件如下

#import "AddObj.h"

@implementationAddObj

// 通过宏 UNI_EXPORT_METHOD 将异步方法暴露给 js 端

UNI_EXPORT_METHOD(@selector(asyncSum:callback:))

///异步方法(注:异步方法会在主线程(UI线程)执行)

///@param options js 端调用方法时传递的参数 支持:String、Number、Boolean、JsonObject 类型

///@param callback 回调方法,回传参数给 js 端 支持: NSString、NSDictionary(只能包含基本数据类型)、NSNumber 类型

- (void)asyncSum:(NSDictionary *)options callback:(UniModuleKeepAliveCallback)callback {

// options 为 js 端调用此方法时传递的参数 NSLog(@"%@",options); // 可以在该方法中实现原生能力,然后通过 callback 回调到 js

NSInteger num1 = options[@"num1"] ? [options[@"num1"] integerValue] : 0;

NSInteger num2 = options[@"num2"] ? [options[@"num2"] integerValue] : 0;

if (callback) {

// 第一个参数为回传给js端的数据,第二个参数为标识,表示该回调方法是否支持多次调用,如果原生端需要多次回调js端则第二个参数传 YES;

NSInteger sum = num1 + num2;

callback(@(sum),NO);

}

}

// 通过宏 UNI_EXPORT_METHOD_SYNC 将同步方法暴露给 js 端

UNI_EXPORT_METHOD_SYNC(@selector(syncSum:))

- (NSInteger)syncSum:(NSDictionary *)options {

// options 为 js 端调用此方法时传递的参数 NSLog(@"%@",options); // 可以在该方法中实现原生能力,然后通过 callback 回调到 js

NSInteger num1 = options[@"num1"] ? [options[@"num1"] integerValue] : 0;

NSInteger num2 = options[@"num2"] ? [options[@"num2"] integerValue] : 0;

return num1 + num2;

}

@end

在开发者中心获取key

配置说明

  • hooksClass:App系统方法钩子类,值是类名,是给有些插件需要在 app 启动时做初始化或者获取系统事件用的,如果没有可以不填为空
  • class:module 或 component 对应的原生类名(示例中为 TestModule)
  • name:暴露给js端使用的 module 或 component 对应的名称(注意:module 的 name 必须以插件id为前缀或和插件id相同,示例为ZTY-AddFuc,其中 DCTestUniPlugin 为插件的id,需要保证唯一性,避免与其他插件冲突,component 的name 没有强制要求,但是也要保证唯一比如ZTY-AddFuc)
  • type:module 或 component (示例为module)

步骤三(uniapp项目引用原生的方法)

新建一个uniapp的APP,实现原生交互的代码如下

<template>

<view class="content">

<button @click="syncSum">syncSum</button>

<view>同步加的结果{{res1}}</view>

<button @click="asyncSum">asyncSum</button>

<view>异步加的结果{{res2}}</view>

</view>

</template>

<script>

// #ifdef APP-PLUS

const AddFunc = uni.requireNativePlugin("ZTY-AddFunc");

// #endif

export default {

data() {

return {

title: 'Hello',

res1:'',

res2:'',

}

},

onLoad() {

},

methods: {

syncSum(){

this.res1 = AddFunc.syncSum({num1:3,num2:7})

},

asyncSum(){

AddFunc.asyncSum({num1:3,num2:7},result=>{

this.res2 = result

})

}

}

}

</script>

<style>

.content {

display: flex;

flex-direction: column;

align-items: center;

justify-content: center;

}

.logo {

height: 200rpx;

width: 200rpx;

margin-top: 200rpx;

margin-left: auto;

margin-right: auto;

margin-bottom: 50rpx;

}

.text-area {

display: flex;

justify-content: center;

}

.title {

font-size: 36rpx;

color: #8f8f94;

}

</style>

1点击自己创建的uniapp的项目,2点发行,3点原生APP-本地打包,4生成本地打包App资源

再把打包的资源放在Pandora/apps目录下

在把control的appid改为刚才引入的本地APP资源包的appid

在ios项目中点击运行,执行结果如下

步骤四(打包iOS原生资源)

点击AddSDK(你的SDK)-Edit scheme-info-run-build configration 值为release

打包ios原生的framwork,选择any ios devices (arm64,armv7), 点击运行,或(command+B)

点击product-shou build folder in finder

创建一个文件夹,以插件Id命名,

在文件里面创建一个

package.json

我的内容如下:

{

"name": "两数之和,ios",

"id": "ZTY-AddFunc",

"version": "1.0.0",

"description": "求和",

"_dp_type": "nativeplugin",

"_dp_nativeplugin": {

"ios": {

"plugins": [

{

"type": "module",

"name": "ZTY-AddFunc",

"class": "AddObj"

}

],

"integrateType": "framework",

"privacies": [

],

"resources": [

]

}

}

}

官方说明如下:

{ "name": "插件名称", "id": "插件标识,需要保证唯一性", "version": "插件版本号", "description": "插件描述信息", "_dp_type":"nativeplugin", "_dp_nativeplugin":{ "android": { "plugins": [ { "type": "module|component, 必填, 根据插件类型选择", "name": "必填, 注册插件的名称, 注意:module 的 name 必须以插件id为前缀或和插件id相同,比如 `DCTestUniPlugin-TestModule`,其中 DCTestUniPlugin 为插件的id,避免与其他插件冲突,component 的 name 没有强制要求,但是也要保证唯一比如 `dc-map`", "class": "必填, 注册插件的类名" } ], "hooksClass": "可选, 事件钩子注册类名", "integrateType": "必填, 可取值aar|jar", "dependencies": [ "可选, 依赖的库名称" ], "excludeDependencies": [ "可选,需要排除的HX内置模块依赖库名称" //HBuilderX3.1.18+支持:仅在插件与HX内置模块依赖库存在冲突时可能需要,使用前请在官方QQ交流群“DCloud原生开发者群”中联系管理员确认 ], "compileOptions": { //可选,Java编译参数配置 "sourceCompatibility": "1.8", "targetCompatibility": "1.8" }, "abis": [ "可选, 支持的abi类型, 可取值armeabi-v7a|arm64-v8a|x86" ], "minSdkVersion": "可选,支持的Android最低版本,如21", "useAndroidX": false, //可选,是否兼容使用AndroidX 3.2.5+版本后废弃该属性 "permissions": [ "可选, 要使用的Android权限列表" ], "parameters": { "插件需要配置的参数名称, 如appid": { "des": "参数描述", "key": "AndroidManifest.xml中添加meta-data节点!对应android:name属性值, 如GETUI_APPID", "placeholder": "build.gradle中添加到manifestPlaceholders中的字段名" } } }, "ios": { "plugins": [ { "type": "必填, module|component, 根据插件类型选择", "name": "必填, 注册插件的名称, 通常与插件标识一致", "class": "必填, 注册插件的类名" } ], "integrateType": "必填, 可取值framework|library", "hooksClass": "可选, 事件钩子注册类名", "frameworks": [ "依赖的系统库(系统库有.framework和.tbd和.dylib类型),和第三方.framework动态库;(.a 库或 .framework**静态库**直接放到ios根目录即可,不需要配置)" ], "embedFrameworks": [ "依赖的.framework动态库(注意.framework动态库也需要在上面的 frameworks 节点添加配置,同样将动态库.framework文件放到 ios 目录)" ], "capabilities": { // 配置应用的capabilities数据(根据XCode规范分别配置到entitlements和plist文件中) "entitlements": { // 合并到工程entitlements文件的数据(json格式) }, "plists": { // 合并到工程Info.plist文件的数据(json格式) } }, "plists": { // 自定义配置工程Info.plist文件的数据(json格式),优先级高于capabilities->plists }, "assets": [ //HBuilderX2.3.4及以上版本支持 "可选,插件要使用的xcassets文件列表,相对于ios目录的路径" ], "privacies": [ "可选, 插件使用到的隐私列表,如NSPhotoLibraryUsageDescription" ], "embedSwift": false, // 开启 swift 编译支持,如果插件使用了 swift 需要配置此项 "deploymentTarget": "8.0, 可选,支持的iOS最低版本", "validArchitectures": [ // 可选,支持的CPU架构类型 "arm64" //支持多个值,可取值:"arm64", "arm64e", "armv7", "armv7s", "x86_64" ], "parameters": { "插件需要配置的参数名称, 如appid": { "des": "参数描述信息", "key": "参数需要配置到info.plist中的键名, 嵌套时使用:分割,如getui:appid" } }, "resources": [ "可选, 插件要使用的资源文件列表,相对于ios目录的路径 ,HX 3.2.0+ 版本不在推荐使用,请参考文档下面的 “依赖资源文件” 说明" ] } } }

生成的framwork放在刚才创建的插件id文件夹下创建一个ios文件夹,再把framwork放在ios文件夹下,安卓就放在android文件夹下

到此原生的ios插件制作完毕

步骤五,使用本地原生ios插件

在uniapp项目下创建名为nativeplugins的文件夹,然后把刚才生成的原生插件放在nativeplugins目录下

点击manifest.json-APP原生插件配置-本地插件-勾选刚才引入的插件

注:只有云打包和自定义基座才有效

提交插件市场

按照上面的方式放到 HBuilderX 的 uni-app 项目中提交打包测试完插件后,可以将插件包压缩成 zip 格式,然后提交到插件市场共享给其他开发者使用,登录注册DCloud插件市场,然后按照提示步骤提交插件,(需要编写对应插件的使用说明文档,.md(markdown)格式);

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Uniapp是一款跨平台的开发框架,可以同时开发出适用于iOS和Android的应用。插件开发Uniapp的一个重要功能,可以通过插件来扩展应用的功能和特性。 在UniappiOS插件开发中,首先需要了解插件的基本结构和开发方式。插件通常是由原生iOS代码编写而成,然后通过Uniapp插件注册和调用机制来使用。具体开发步骤如下: 1. 创建iOS插件项目:使用Xcode开发工具创建一个新的iOS项目,将插件的代码放入其中。 2. 配置插件的接口和参数:根据插件的功能需求,在插件的代码中定义需要对外暴露的接口和参数。可以通过使用Objective-C或Swift编写代码来完成。 3. 处理插件的调用逻辑:在插件的代码中实现对插件接口的具体逻辑处理。可以调用底层的iOS API来实现需要的功能。 4. 导出插件:编译插件的代码,并将生成的插件文件导出成为一个独立的模块供Uniapp项目使用。 5. 注册和调用插件:在Uniapp项目的代码中,通过注册插件的方式将插件导入到项目中。然后可以通过插件的名称和方法调用来使用插件的功能。 在开发过程中,除了插件的基本代码实现外,还可以根据需要添加一些其他的功能,例如插件的配置文件、资源文件等。 总之,Uniapp提供了便捷的iOS插件开发方式,开发者可以通过编写原生iOS代码来扩展Uniapp应用的功能。插件开发可以根据具体需求来实现各种各样的功能,为Uniapp应用提供更加丰富和灵活的特性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值