cordova与android通信_使用Cordova插件实现两个app之间的相互调用和通讯
几年前使用Cordova 进行两个app之间的相互调用和通讯;当时也是几经折腾,今天把它整理出来,理一下思路,也方便有同样需求的朋友参考
一、require引入 plugin
require("cordova!com.lampa.startapp-master");
这个插件下载 https://github.com/dengxiaoning/com.lampa.startapp
(申明:该插件参考https://github.com/lampaa/com.lampa.startapp自己实现了ios的参数传递以及 downloadApps应用下载的功能)
二、源文件分析
首选来看看这个插件的实现
plugin.xml
指定了js module 的路径和调用时的名称target="startApp"
指定插件源文件路径,根据不同平台,定义插件包名、将文件写入平台指定的路径下
startApp.js
var exec = require('cordova/exec');
module.exports = {
set: function(params, extra) {
var output = [params];
if(extra != undefined) {
output.push(extra);
}
else {
output.push(null);
}
return {
start: function(completeCallback, errorCallback) {
completeCallback = completeCallback || function() {};
errorCallback = errorCallback || function() {};
exec(completeCallback, errorCallback, "startApp", "start", output);
},
},
/**
* extra values
*/
getExtras: function(completeCallback, errorCallback) {
exec(completeCallback, errorCallback, "startApp", "getExtras", []);
},
}
该js 实现了使用Cordova 调用android 和 ios 原生接口然后返回参数,
如:exec(completeCallback, errorCallback, "startApp", "start", output); 其中startApp指定调用的类名
【ios是@interface startApp : CDVPlugin,android是public class startApp extends CordovaPlugin】;
start指定调用该类的方法名;其他参数就是cordova 导出的成功、错误回调和携带返回数据。
startApp.java(中增加方法)
/**
* download application from market
* */
public void downloadApps(JSONArray args, CallbackContext callback){
JSONObject params;
try {
if(args.get(0) instanceof JSONObject){
params = args.getJSONObject(0);
if(params.has("application")) {
Uri uri = Uri.parse("market://details?id="+params.getString("application")+"");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
cordova.getActivity().startActivity(it);
}
if(params.has("downloadurl")){
cordova.getActivity().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(params.getString("downloadurl"))));
}
}
}
catch (JSONException e) {
callback.error("JSONException: " + e.getMessage());
e.printStackTrace();
}
catch (ActivityNotFoundException e) {
callback.error("ActivityNotFoundException: " + e.getMessage());
e.printStackTrace();
}
}
增加Android 根据路径下载apk的方法
startApp.h(中增加方法)
- (void)getExtras:(CDVInvokedUrlCommand*)command;
- (void)downloadApps:(CDVInvokedUrlCommand*)command;
- (void)exitApplication:(CDVInvokedUrlCommand*)command;
增加ISO平台下 获取应用调用时传入的参数,在未安装时根据url下载应用
startApp.m(中增加方法)
- (void)getExtras:(CDVInvokedUrlCommand*)command{
CDVPluginResult* pluginResult = nil;
// 从 url中获取保存的参数,将其返回给Cordova
NSString *userurl = [[NSUserDefaults standardUserDefaults] objectForKey:@"url"];
if(userurl == nil || userurl == NULL){
NSString *addResult = @"returnFalse";
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:addResult];
}else{
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:userurl];
[[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"url"];
}
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
-(void)downloadApps:(CDVInvokedUrlCommand*)command{
CDVPluginResult* pluginResult = nil;
NSString* scheme = [command.arguments objectAtIndex:0];
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:scheme]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:scheme]];
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:(true)];
}
else {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsBool:(false)];
}
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
- (void)exitApplication:(CDVInvokedUrlCommand*)command {
exit(0);
}
三、配置应用Scheme
3.1 使用xcode 手动配置
首先将该ios文件导入xcode,点击.xcodeproj后缀的文件,xcode将会自动打开,再找到 LSApplicationQueriesScheme 为应用添加允许访问的app的白名单。 然后添加Scheme(只有这样另一个app在添加白名单时才知道写什么)。具体操作如下图
找到info
添加白名单
配置应用Scheme
配置Scheme
注意这个配置Scheme是需要调用者app和被调用app都需要设置的
同时配置ios访问设备的一些权限,否则无权限访问时应用会崩溃
找到 你的项目名-info.plist 文件打开,在最后一个array标签下加入配置
NSPhotoLibraryUsageDescription
App需要您的同意,才能访问相册
NSCameraUsageDescription
App需要您的同意,才能访问相机
NSMicrophoneUsageDescription
App需要您的同意,才能访问麦克风
NSLocationUsageDescription
App需要您的同意,才能访问位置
NSLocationWhenInUseUsageDescription
App需要您的同意,才能在使用期间访问位置
NSLocationAlwaysUsageDescription
App需要您的同意,才能始终访问位置
NSCalendarsUsageDescription
App需要您的同意,才能访问日历
NSRemindersUsageDescription
App需要您的同意,才能访问提醒事项
NSMotionUsageDescriptionApp需要您的同意,才能访问运动与健身
NSHealthUpdateUsageDescription
App需要您的同意,才能访问健康更新
NSHealthShareUsageDescription
App需要您的同意,才能访问健康分享
NSBluetoothPeripheralUsageDescription
App需要您的同意,才能访问蓝牙
NSAppleMusicUsageDescription
App需要您的同意,才能访问媒体资料库
操作截图
找到 项目名-info.plist 文件
添加配置
3.2 使用plugin.xml自动配置
自己写的一个配置ios 相关权限和Scheme的xml
创建如上类似文件夹考入即可:
xmlns:android="http://schemas.android.com/apk/res/android"
id="cordova-plugin-plistconfig" version="5.3.0">
开启第三方应用
新开启第三方应用相关配置
MIT
cordova,sina
bapp
CFBundleTypeRole
Editor
CFBundleURLSchemes
aapp
App需要您的同意,才能访问媒体资料库
App需要您的同意,才能访问蓝牙
App需要您的同意,才能访问日历
App需要您的同意,才能访问相机
App需要您的同意,才能访问健康分享
App需要您的同意,才能访问健康更新
App需要您的同意,才能始终访问位置
App需要您的同意,才能访问位置
App需要您的同意,才能在使用期间访问位置
App需要您的同意,才能访问麦克风
App需要您的同意,才能访问运动与健身
App需要您的同意,才能访问相册
App需要您的同意,才能访问提醒事项
3.4 在ios 的 AppDelegate.m中增后参数接收(这个是重点)
// 在该方法中新增如下代码
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation{
NSString *URLString= [url absoluteString];
[[NSUserDefaults standardUserDefaults] setObject:URLString forKey:@"url"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
操作截图
四、js中调用
4.1 android平台
A应用调用B应用的方法
invokeBapp(){
var sApp;
sApp = startApp.set({// 设置应用包名----注意修改----该包名对应【被叫application】
"application" : "com.myapplication.bapp"// 替换为你真实的包名
}, {//传递给B应用的参数
"username" : "lili"
"userId" : "123456"
});
/*
* 监测应用是否安装
*/
cordova.plugins.fileOpener2.appIsInstalled(packageName, {
success : function(res) {
if (res.status === 0) {
startApp.downloadApps({
"downloadurl":“https://192.168.1.1:8080/bapp/bapp.apk” //替换为你服务器真实的apk路径
},function(success){
console.log("success");
},function(error){
alert(error);
});
} else {
sApp.start(function(success) { // success
console.log("OK");
}, function(error) { // fail
alert(error);
});
}
}
});
}
4.2 iOS平台
A应用调用B应用的方法
invokeBapp(){
var sApp;
var sendParams = "username:lili;userId:123456"; //传递给B应用的参数(ios不能传递json对象)
var twitter = “bapp://”; // B应用的Scheme(就是上面 第三 步配置的那个 再加上冒号和双斜杠就ok了)
sApp = startApp.set(twitter + sendParams + "");
/* 监测是否安装应用 */
sApp.check(function(values) {
sApp.start(function(success) { // success
}, function(error) { // fail
alert(error);
});
}, function(error) {
startApp.downloadApps({
"downloadurl":"itms-services:///?action=download-manifest&url=https://192.168.1.1:8080/bapp/dependence.plist" //替换为你服务器真实的plis路径(这里使用的是plist进行ipa下载,如果你已经发布到AppStore那就直接写AppStore下载路径了)
});
}
4.3 B应用接收参数
receiveAappParams(){
startApp.getExtras(function(res){
// to do something...
console.log(res);
});
}
五、配置 plist文件
由于没u有上传到商店,ipa无法在ios应用中下载,所有使用plis进行ipa映射,然后调用Safari进行下载安装
items
assets
kind
software-package
url
https://192.168.1.1:8080/bapp/bapp.ipa
kind
full-size-image
needs-shine
url
https://192.168.1.1:8080/bapp/icon.png
kind
display-image
needs-shine
url
https://192.168.1.1:8080/bapp/icon.png
metadata
bundle-identifier
com.myapplication.bapp
bundle-version
1.0.0
kind
software
title
客户咨询平台
ok到这里就结束了,写得不对 的地方请指正,有更好的方法请分享
cordova与android通信_使用Cordova插件实现两个app之间的相互调用和通讯相关推荐
- cordova与android通信_5:Cordova与原生交互--传值
参考:https://www.jianshu.com/p/4069d360b890 相关命令 1.安装plugman npm install -g plugman 2.创建插件 plugman cre ...
- Android Bundle类,通过bundle实现在两个activity之间的通讯
根据google官方的文档(http://developer.android.com/reference/android/os/Bundle.html) Bundle类是一个key-value对,&q ...
- Android向:实现同一局域网内两台手机之间的文件互传
背景 最近要做一个demo,目的是实现局域网内的两台手机之间的文件互传.具体流程如下: 手机 A 从服务器上下载一个 apk 文件到本机上: 手机 A 在自己的某个端口上启动一个 Server 服务, ...
- java 两个日期的天数_计算Java 8中两个日期之间的天数
我知道有很多关于如何获得的问题,但我想要和使用新的Java 8 Date api的例子. 我也知道JodaTime库,但我想要一种没有外部库的工作方式. 功能需要抱怨这些限制: 防止日期保存时间错误 ...
- Android加载网页JavaScript与Java之间的相互调用
最近项目中涉及到Android中的网络通信与交互.html5等相关内容,由于之前没仔细研究过,在这里总结一下,下面是JavaScript与Java相互调用的一个小例子,废话不多说,直接上代码: < ...
- 川崎机器人总线通信_川崎机器人:PLC有那些功能?能实现机器人哪些通讯?
川崎机器人:PLC有那些功能?能实现机器人哪些通讯? (一)运算功能 简单PLC的运算功能包括逻辑运算.计时和计数功能:普通PLC的运算功能还包括数据移位.比较等运算功能:较复杂运算功能有代数运算.数 ...
- arduino 与java通信_在Java应用程序与Arduino Uno之间建立串口连接
在本篇文章中,我们将主要演示如何在Java应用程序和Arduino Uno之间建立串口连接.本文分为两个部分:在第一部分中,说明了如何从Java应用程序向Arduino发送文本(数字).此外,Ardu ...
- Android studio实现计算BMI指数(两个页面之间的跳转)
BMI计算器所实现的内容 1.两个页面的跳转 a.intent组件 2.根据所选单选框中的按钮进行BMI指数的判断 a.单选按钮监听 具体代码呈现 bmicalculate.xml <?xml ...
- mysql query日期_如何获取mysql中两个日期之间的日期列表select query
尝试: select * from (select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) s ...
- 如何快速找出找出两个数组中的_找出JavaScript中两个数组之间的差异
LeetCode今天面临的挑战是在数组中查找所有消失的数字. 蛮力 我们的输入包括一个缺少数字的实际数组.我们想将该数组与相同长度的数组进行比较,其中没有遗漏的数字.所以如果给定的话[4,3,2,7, ...
最新文章
- 长沙理工大学第十二届ACM大赛-重现赛 K - 大家一起来数二叉树吧
- 《深入理解Android:卷III A》一一2.3心系两界的MessageQueue
- Spring Boot + MyBatis + MySQL读写分离
- boost::mp11::mp_all_of_q相关用法的测试程序
- OpenCL(CUDA5.0) + Visual Studio 2010 环境配置
- 网络服务器分为文件服务器通信服务器和,近代中国落后、贫困的根本原因是()...
- requestfacade 这个是什么类?_Java 的大 Class 到底是什么?
- 搜索引擎的那些事(摘取价格数据)
- 水利水电工程与计算机技术应用,水利水电施工中计算机的应用
- python字典实现原理-哈希函数-解决哈希冲突方法
- 牛客NOIP暑期七天营-提高组1 解题报告
- Dart教程(四):语法
- 整整240套Axure原型设计元件库 组件库 控件库分享
- php 递归函数返回数组,php递归函数 PHP中Array相关函数简介
- centos 6.5 thinkpad trackpoint 中间键 滚动设置
- c语言库用不用下载杀毒软件,开源杀毒软件ClamAV需要你的支持和帮助
- 2020计算机考研初试考试先后顺序,2020考研初试考试时间及科目安排
- 码距与检错错位数、纠错位数的关系
- imp报IMP-00010,IMP-00013错误
- python将多个列表合并_Python将多个list合并为1个list的方法
热门文章
- css控制td比内容宽5px_CSS从零开始——布局
- java普通工程打war包_普通java工程(Java Project)打jar包
- 【转】C# SqlServer操作辅助类(SqlServerHelper.cs)
- C# DateTime的ToString()方法的使用
- Drupal 曝出代码执行高危漏洞,数百万网站受影响
- Java springcloud B2B2C o2o多用户商城 springcloud架构- ribbon
- centos7 yum安装zabbix监控
- UNIX发展历史流程图
- ssh 遍历IPS 进行连接
- 《编程原本 》一1.8 总结