几年前使用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之间的相互调用和通讯相关推荐

  1. cordova与android通信_5:Cordova与原生交互--传值

    参考:https://www.jianshu.com/p/4069d360b890 相关命令 1.安装plugman npm install -g plugman 2.创建插件 plugman cre ...

  2. Android Bundle类,通过bundle实现在两个activity之间的通讯

    根据google官方的文档(http://developer.android.com/reference/android/os/Bundle.html) Bundle类是一个key-value对,&q ...

  3. Android向:实现同一局域网内两台手机之间的文件互传

    背景 最近要做一个demo,目的是实现局域网内的两台手机之间的文件互传.具体流程如下: 手机 A 从服务器上下载一个 apk 文件到本机上: 手机 A 在自己的某个端口上启动一个 Server 服务, ...

  4. java 两个日期的天数_计算Java 8中两个日期之间的天数

    我知道有很多关于如何获得的问题,但我想要和使用新的Java 8 Date api的例子. 我也知道JodaTime库,但我想要一种没有外部库的工作方式. 功能需要抱怨这些限制: 防止日期保存时间错误 ...

  5. Android加载网页JavaScript与Java之间的相互调用

    最近项目中涉及到Android中的网络通信与交互.html5等相关内容,由于之前没仔细研究过,在这里总结一下,下面是JavaScript与Java相互调用的一个小例子,废话不多说,直接上代码: < ...

  6. 川崎机器人总线通信_川崎机器人:PLC有那些功能?能实现机器人哪些通讯?

    川崎机器人:PLC有那些功能?能实现机器人哪些通讯? (一)运算功能 简单PLC的运算功能包括逻辑运算.计时和计数功能:普通PLC的运算功能还包括数据移位.比较等运算功能:较复杂运算功能有代数运算.数 ...

  7. arduino 与java通信_在Java应用程序与Arduino Uno之间建立串口连接

    在本篇文章中,我们将主要演示如何在Java应用程序和Arduino Uno之间建立串口连接.本文分为两个部分:在第一部分中,说明了如何从Java应用程序向Arduino发送文本(数字).此外,Ardu ...

  8. Android studio实现计算BMI指数(两个页面之间的跳转)

    BMI计算器所实现的内容 1.两个页面的跳转 a.intent组件 2.根据所选单选框中的按钮进行BMI指数的判断 a.单选按钮监听 具体代码呈现 bmicalculate.xml <?xml ...

  9. 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 ...

  10. 如何快速找出找出两个数组中的_找出JavaScript中两个数组之间的差异

    LeetCode今天面临的挑战是在数组中查找所有消失的数字. 蛮力 我们的输入包括一个缺少数字的实际数组.我们想将该数组与相同长度的数组进行比较,其中没有遗漏的数字.所以如果给定的话[4,3,2,7, ...

最新文章

  1. 长沙理工大学第十二届ACM大赛-重现赛 K - 大家一起来数二叉树吧
  2. 《深入理解Android:卷III A》一一2.3心系两界的MessageQueue
  3. Spring Boot + MyBatis + MySQL读写分离
  4. boost::mp11::mp_all_of_q相关用法的测试程序
  5. OpenCL(CUDA5.0) + Visual Studio 2010 环境配置
  6. 网络服务器分为文件服务器通信服务器和,近代中国落后、贫困的根本原因是()...
  7. requestfacade 这个是什么类?_Java 的大 Class 到底是什么?
  8. 搜索引擎的那些事(摘取价格数据)
  9. 水利水电工程与计算机技术应用,水利水电施工中计算机的应用
  10. python字典实现原理-哈希函数-解决哈希冲突方法
  11. 牛客NOIP暑期七天营-提高组1 解题报告
  12. Dart教程(四):语法
  13. 整整240套Axure原型设计元件库 组件库 控件库分享
  14. php 递归函数返回数组,php递归函数 PHP中Array相关函数简介
  15. centos 6.5 thinkpad trackpoint 中间键 滚动设置
  16. c语言库用不用下载杀毒软件,开源杀毒软件ClamAV需要你的支持和帮助
  17. 2020计算机考研初试考试先后顺序,2020考研初试考试时间及科目安排
  18. 码距与检错错位数、纠错位数的关系
  19. imp报IMP-00010,IMP-00013错误
  20. python将多个列表合并_Python将多个list合并为1个list的方法

热门文章

  1. css控制td比内容宽5px_CSS从零开始——布局
  2. java普通工程打war包_普通java工程(Java Project)打jar包
  3. 【转】C# SqlServer操作辅助类(SqlServerHelper.cs)
  4. C# DateTime的ToString()方法的使用
  5. Drupal 曝出代码执行高危漏洞,数百万网站受影响
  6. Java springcloud B2B2C o2o多用户商城 springcloud架构- ribbon
  7. centos7 yum安装zabbix监控
  8. UNIX发展历史流程图
  9. ssh 遍历IPS 进行连接
  10. 《编程原本 》一1.8 总结