cordova 插件使用记录

日期:2016-3-28 13:51 | 标签: cordova | 阅读:2073

cordova 插件是 hybrid 应用的桥梁,系统级操作一般使用插件处理。

注意事项

localNotification

在黑屏情况下无法弹出提示(有些情况是可以的,使用 ios 实测发现),id不是随机生成的,还得自己制定。

RongCloud IMLib Plugin for Cordova

要使得Android系统和IOS系统能够正常通信,必须按照以下说明进行配置!

IOS

找到appFolder/platforms/ios/appFolder/Plugins/cordova-plugin-media/CDVSound.m 在audioFile.recorder前加入

NSDictionary *recordSetting = @{AVFormatIDKey: @(kAudioFormatLinearPCM),
                               AVSampleRateKey: @8000.00f,
                               AVNumberOfChannelsKey: @1,
                               AVLinearPCMBitDepthKey: @16,
                               AVLinearPCMIsNonInterleaved: @NO,
                               AVLinearPCMIsFloatKey: @NO,
                               AVLinearPCMIsBigEndianKey: @NO};

改完后结果为

NSDictionary *recordSetting = @{AVFormatIDKey: @(kAudioFormatLinearPCM),
                               AVSampleRateKey: @8000.00f,
                               AVNumberOfChannelsKey: @1,
                               AVLinearPCMBitDepthKey: @16,
                               AVLinearPCMIsNonInterleaved: @NO,
                               AVLinearPCMIsFloatKey: @NO,
                               AVLinearPCMIsBigEndianKey: @NO};
audioFile.recorder = [[CDVAudioRecorder alloc] initWithURL:audioFile.resourceURL settings:recordSetting error:&error];

无法编译通过

编译时提示

 visible @interface for 'CDVPlugin' declares the selector 'initWithWebView:' self = [super initWithWebView:theWebView];

后来吧 [super initWithWebView:theWebView] 替换为 [super init] 则不报错了。在融云 Cordova 库中也有相关的讨论

Android

找到appfoldere/platforms/android/src/org/apache/cordova/media/AudioPlayer.java,在其中 startRecording中 case NONE:中加入并替换(相同的替换,不同的加入)

   this.recorder.setAudioSamplingRate(8000);
   this.recorder.setAudioEncodingBitRate(7950);
   this.recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
   this.recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

Android 7.0 后

IPC 进程异常退出,后来发现是少了 .so 文件,详情参见 这个

平台api不一致

iOS和Android的群组信息不一致 issue

二维码扫描

QRScanner

cordova-plugin-qrscanner
支持更多的配置,能够做扫码动画效果。

BarcodeScanner

二维码扫描插件,这个插件本人印象非常深刻,其插件配置plugin.xml中有一条配置

<uses-feature android:name="android.hardware.camera" android:required="false" >

表示不对camera这个特性做硬性要求,而事实上是有些插件,比如我使用的phoneRTC,其在plugin.xml却有这一条

<uses-feature android:name="android.hardware.camera" >

从而导致插件冲突,从而build失败,最终解决方案很简单,把android:required="false"去掉即可。

Cordova File plugin

其文件地址一般显示为

cdvfile://localhost/persistent

更多可参考:http://blog.csdn.net/xundh/article/details/50727682

Cordova 热刷新

使用库: cordova-app-loader
参考: https://github.com/markmarijnissen/cordova-app-loader
方案: 在服务端发布www里面的内容,并在客户端与服务端都设置好配置文件,每次启动时进行匹配,如有变更则下载文件并替换。
原理:是更新到localstorage还是文件系统?

微信分享

很多人可能在用cordova-plugin-wechat,这个插件代码更加规整,作者也在一直维护,可惜在微信返回APP时会重启,这个问题纠结我好久都得不到解决,无奈只好使用com.phonegap.plugins.weixin,这个插件作者已经停止维护很久了,但是有个好处,不会在从微信返回APP时重启。
@update at 2016-08-1 有人在issue中这么说(本人未试验):

找到答案了,在config.xml文件加一行

<preference name="AndroidLaunchMode" value="singleTask" />

录音方案

  1. cordova-plugin-media
    主要是想基于这个做一个语音消息发送的应用。
    参考: https://github.com/apache/cordova-plugin-media
  2. capture.captureAudio
  3. 关于怎样播放www/目录内的视频,可以参考这个:http://stackoverflow.com/questions/4438822/playing-local-sound-in-phonegap
    function getPhoneGapPath() {
     // 获取首页路径
     var path = window.location.pathname;
     // 截取目录,-10是以首页为/www/index.html为例
     path = path.substr( path, path.length - 9);
     return 'file://' + path;
    };
    //播放示例
    var snd = new Media(getPhoneGapPath() + 'test.wav' );
    snd.start();
    
    使用上述方法在Android环境下可以运行通过,但是在ios环境下却毫无音响! 后来发现是路径问题,参考playing-local-mp3-android-cordova-media-undefined
    function getCordovaPath() {
     var path = window.location.pathname;
     if (device.platform == "Android") 
         path = "/android_asset/www/";
     return 'file://' + path;
    }
    
    此外,这个issue里边也有比较相关的介绍: https://github.com/eclipsesource/tabris-js/issues/484
    提问者使用下述路径在debug环境下播放成功
    asset = 'file:///android_asset/www/bundled_tabris_js_launcher/user_app/a.amr';
    media = new Media(asset, function() {
     console.log("works")
    }, function(r) {
     console.log("do not work", r)
    });
    media.play();
    
    当然,也可以直接参考官方文档说明:
    iOS Quirks:http://npm.taobao.org/package/cordova-plugin-media 里面有相关说明。

获取照片方案

  1. navigator.camera.getPicture
    • Camera.DestinationType.DATA_URL 返回base-64编码的图像
    • Camera.DestinationType.NATIVE_URI 返回图像的本地的URI
  2. 莫名其妙的 selected canceled

    在 config.xml 中添加 <preference name="AndroidLaunchMode" value="standard" />

phonertc

phonertc 安装文档
其实是基于webrtc的一个框架,已经在手机上调通视频通话和语音通话的功能。 这个插件要在IOS上编译运行,还真有点小麻烦

  1. Go platforms/ios and click on [ProjectName].xcodeproj to open it with XCode
  2. Go to your project settings
  3. In General, change Deployment Target to 7.0 or above
  4. Go to Build Settings and change:

    • a. Valid Architectures => armv7
    • b. Build Active Architecture Only => No
    • c. Runpath Search Paths => $(inherited) @executable_path/Frameworks
    • d. Objective-C Bridging Header => [ProjectName]/Plugins/com.dooble.phonertc/Bridging-Header.h
    • e. Embedded content contains Swift Code => yes
  5. Repeat steps 4a. - 4c. for the CordovaLib project

  6. Make sure your build target is an actual iPhone or iPad running on the arm7 architecture. The iPhone and iPad simulators are not emulators, and only run on i386. The compiled RTC libraries for ios have been built for arm7.

  7. 报错:Apple Mach-O Linker Error,原因是phonertc某个文件必须在bitcodeenabled关掉之后采用运行。

在运行过程中还会出现其它错误,但是只要按照错误说明进行修改,不久就可以运行了

Android 64位手机报错

解决方案该是删掉platform/android/lib下的arm64-v8a文件夹,但是里面的文件也必须删掉,从而会导致其它库无法运行,原理该是64位机发现有arm64-v8a文件夹后就不会去32位对应的文件夹中寻找文件,phonertc在64位对应的arm64-v8a文件夹下没有对应的.so文件,从而也就无法运行了。 我的办法是硬生生的给他创建一个好了(直接在plugin.xml里配置),32位是都直接会去找

<!-- 方案1 -->
<source-file 
src="src/android/armeabi-v7a/libRongIMLib.solibjingle_peerconnection_so.so" 
target-dir="libs/arm64-v8a"/>
<!-- 方案2 先拷贝-->
<source-file 
src="src/android/arm64-v8a/libRongIMLib.solibjingle_peerconnection_so.so" 
target-dir="libs/arm64-v8a"/>

但是问题来了,使用到fresco的64位操作系统能够运行正常,但是没有用到fresco的操作系统会报错(暂时是这么猜测的)。 这里有提到相关解决方案:链接,岂不是与上述方法冲突了呢?
还有一个方法是直接找到对应的包,csdn链接,问题是版本貌似对不上,/(ㄒoㄒ)/~~。看来,还是需要尝试自己编译webrtc源码了。

消息推送方案

极光推送

转场动画方案

自带不流畅。在Android内还会闪屏,imziv建议使用com.telerik.plugins.nativepagetransitions,这种方案适用于没有使用类似ionic这样的集成框架的用户使用,显然,我暂时用不着。

参考

cordova插件使用(下):http://www.codesec.net/view/175838.html
Cordova开发总结(插件篇) http://imziv.com/blog/article/read.htm?id=74

版权声明: 署名-非商业性使用-禁止演绎 4.0 国际(CC BY-NC-ND 4.0
Copyright ©2013-2017 | 粤ICP备14081691号 | yipeng手工打造 | 联系方式