Uniapp Android原生插件开发方法入参数JSONObject options为空/uniapp调用原生方法参数为空

问题:在uni插件原生项目中,方法被调用但是入参JSONObject options是空的{}

1.检测引入的JSONObject包是不是不对

org.json的是错的,需要将这两个给删除掉

import org.json.JSONException;
import org.json.JSONObject;

2.在对应的module的build.gradle中加入下面的依赖

其中第一个是处理这个问题的,第二个是其他地方要用,也是必须要的

implementation 'com.alibaba:fastjson:1.1.46.android'
compileOnly fileTree(dir: '../app/libs', include: ['uniapp-v8-release.aar'])

 3.然后在代码里导入该包

import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;

### 开发 UniApp 原生插件进行网络请求 #### 插件开发准备 为了在 UniApp 中开发用于执行网络请求的原生插件,需先完成一系列准备工作。这涵盖了环境搭建、工具熟悉等内容[^1]。 #### 创建并配置 JSON 文件 对于 iOS 和 Android 平台上的插件,在 `dcloud_uniplugins.json` 配置文件中添加必要的条目来描述新创建的组件或服务。例如,如果要构建一个视频播放器,则可以如下所示设置: ```json { "type": "service", "name": "network-request", "class": "io.dcloud.uniplugin.NetworkRequest" } ``` 此处 `"type"` 应设为 `"service"` 而不是 `"component"` ,因为这是针对后台操作而非UI控件的服务类插件[^2]。 #### 实现 Native 层逻辑 (iOS/Android) ##### 对于 iOS: - 打开 iOSSDK/HBuilder-uniPluginDemo 工程目录下的 Xcode 项目(`HBuilder-uniPlugin.xcodeproj`) 来启动主工程。 - 新建 Objective-C 或 Swift 类继承自 `UNIPluginBaseServiceDelegate` 接口,并实现相应方法处理来自 JavaScript 的调用请求。 示例代码片段展示了一个简单的 GET 请求函数定义方式(假设使用 AFNetworking 框架): ```objc #import <AFNetworking.h> @interface NetworkRequest : UNIPluginBaseServiceDelegate { } @end @implementation NetworkRequest -(void)performGetRequestWithURL:(NSString *)url completion:(void (^)(id responseObj, NSError *error))completionBlock { NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:configuration]; [manager GET:url parameters:nil progress:nil success:^(NSURLSessionDataTask *task,id responseObject){ if(completionBlock != nil){ dispatch_async(dispatch_get_main_queue(), ^{ completionBlock(responseObject,nil); }); } } failure:^(NSURLSessionDataTask *task,NSError *error){ if(completionBlock != nil){ dispatch_async(dispatch_get_main_queue(), ^{ completionBlock(nil,error); }); } }]; } @end ``` ##### 对于 Android: - 修改 `build.gradle` 文件以包含所需的依赖项; - 编写 Java/Kotlin 类扩展 `com.taobao.weex.plugin.IWXBridgeAdapter` 接口,并重载对应的方法来进行 HTTP 访问; Java 示例代码展示了 POST 请求的具体实现细节: ```java public class NetworkRequest extends IWXBridgeAdapter { @Override public void invoke(String actionName,Object[] args,WXJSBridgeCallback callback) throws Exception { switch(actionName.toLowerCase()){ case "post": post(args,callback); break; // Add other cases as needed... } } private void post(Object[] params,WXJSBridgeCallback cb)throws JSONException{ JSONObject jsonParam = new JSONObject((Map<String,String>)params[0]); String url = jsonParam.getString("url"); Map<String,Object> mapData = jsonParam.toMap(); OkHttpClient client = new OkHttpClient(); RequestBody body = FormBody.create(MediaType.parse("application/json;charset=utf-8"),new Gson().toJson(mapData)); final Request request = new Request.Builder() .url(url) .post(body) .build(); Call call = client.newCall(request); call.enqueue(new Callback(){ @Override public void onFailure(Call call,IOException e){ runOnUiThread(() -> cb.invokeAndKeepAlive(e.getMessage())); } @Override public void onResponse(Call call,Response responce) throws IOException{ try(Response r=responce){ runOnUiThread(() -> cb.invoke(r.body().string())); } } }); } } ``` #### 封装 JS API 接下来是在前端部分封装好接口供 Vue 组件调用。编辑 plugin.js 文件导之前编写的 native bridge 函数,并暴露给外部使用: ```javascript // 导自己定义的插件 js var network_request_plugin = require('./native/network_request'); export function performNetworkOperation(operationType,options){ plus.bridge.exec('network-request',operationType,[options],function(result){ console.log('Result:',result); },function(error){ console.error('Error occurred during operation.',error); }) }; ``` 上述例子中,`plus.bridge.exec()` 是用来触发本地层功能的关键语句之一,其中第一个参数指定了目标服务名称即上面提到过的 `"network-request"` 。第二个参数代表具体动作标识符如 `"get"` 或者 `"post"` 等等。第三个参数是一个数组形式传递的数据对象列表。最后两个回调分别接收成功响应或者失败原因作为输参数[^4]。 #### 测试与发布 确保所有步骤完成后,可以在模拟器上测试该插件是否按预期工作。一旦确认无误便能按照官方文档指导将其打包成正式版本部署至应用商店[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

break妖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值