2015年9月15日火曜日

Missing one of the key attributes 'action#name,category#name' on element intent-filter at AndroidManifest.xml:16:13

私の場合はimagepickerプラグインが原因でした。
確かに AndroidManifest.xmlで intent-filterが空になっています。

<activity android:label="@string/multi_app_name" android:name="com.synconset.MultiImageChooserActivity" android:theme="@android:style/Theme.Holo.Light">
            <intent-filter />
        </activity>


Githubのイシューでも上がっています。

この問題はImagePickerを使った場合に必ず起こる訳ではありませんでした。(条件不明?)
AndroidManifest.xmlの問題の箇所はplugins/android.jsonから転記されているのでそちらを修正します。

暫定修正方法

メンテナンスに難が出るのであまり取りたくはない方法ですが暫定対応方法を記載いたします。

plugins/android.json

"xml": "<activity android:label=\"@string/multi_app_name\" android:name=\"com.synconset.MultiImageChooserActivity\" android:theme=\"@android:style/Theme.Holo.Light\"><intent-filter /></activity>",

の行を探して<intent-filter />を削除します。
すでにAndroidManifest.xmlがある場合はきれいにしてからビルドします。

2015年9月14日月曜日

プラグインをまとめてアップデート

Cordovaのコマンドラインツールにはプラグインをまとめてアップデートするオプションがないので一つづつアップデートをする必要があります。
これまで list で一覧を取得してループで全部アップデートするスクリプトを書いて使っていたのですがもっと高性能なツールを作っている方がいらっしゃいました。

cordova-plugin-update を使うと一度にアップデートかつバージョンを選んだりできます。(ただしnpm管理のもののみ)

(1)インストール


npm install -g cordova-plugin-update

(2)config.xmlでプラグインを管理


cordova plugin add hoge --save
でconfig.xmlにプラグインの情報を書き込んでいない場合は
cordova plugin save
で一度書き込む必要があります。

(3)対話式にアップデート


以下のコマンドを実行
cordova-plugin-update  

対話式に表示されます
A newer versions of `cordova-plugin-whitelist` is available (currently 1.0.0)

  1) 1.1.0
  2) Don't update

Install (1/2)? 1

(4)まとめてアップデート

以下のコマンドを実行
cordova-plugin-update  --all


スプラッシュスクリーン表示


1. splashscreenプラグイン追加


cordova plugin add cordova-plugin-splashscreen

2. config.xmlにファイルパス追加

<platform name="android">
        <splash src="res/android/splash-port-ldpi.png" density="port-ldpi" /><!--200x320-->
        <splash src="res/android/splash-port-mdpi.png" density="port-mdpi"/><!--320x480-->
        <splash src="res/android/splash-port-hdpi.png" density="port-hdpi"/><!--480x800-->
        <splash src="res/android/splash-port-xhdpi.png" density="port-xhdpi"/><!--720x1280-->
        <splash src="res/android/splash-land-ldpi.png" density="land-ldpi" />><!--320x200-->
        <splash src="res/android/splash-land-mdpi.png" density="land-mdpi"/><!--480x320-->
        <splash src="res/android/splash-land-hdpi.png" density="land-hdpi"/><!--800x480-->
        <splash src="res/android/splash-land-xhdpi.png" density="land-xhdpi"/><!--1280x720-->
    </platform>

<platform name="ios">
        <splash height="480" src="res/ios/Default~iphone.png" width="320" />
        <splash height="960" src="res/ios/Default@2x~iphone.png" width="640" />
        <splash height="1136" src="res/ios/Default-568h@2x~iphone.png" width="640" />
        <splash height="1334" src="res/ios/Default-667h@2x~iphone.png" width="750" />
        <splash height="2208" src="res/ios/Default-736h@3x~iphone.png" width="1242" />
        <splash height="1242" src="res/ios/Default-Landscape-736h.png" width="2208" />
        <splash height="1024" src="res/ios/Default-Portrait~ipad.png" width="768" />
        <splash height="768" src="res/ios/Default-Landscape~ipad.png" width="1024" />
        <splash height="2048" src="res/ios/Default-Portrait@2x~ipad.png" width="1536" />
        <splash height="1536" src="res/ios/Default-Landscape@2x~ipad.png" width="2048" />
    </platform>

3. 画像ファイル設置

1つ1つの画像を作るのは面倒なのでプログラムを使って 2208pixelx2208pixel以上の1つの画像から全部の画像を作ります。

これでスプラッシュスクリーンが表示されるようになります。アプリが起動すると自動的に非表示になります。

(Option)ページの初期化が終るまで表示する

シングルページアプリの場合は初期処理に時間がかかるので、初期処理が終るまでスプラッシュスクリーンを表示し続けたい事があります。

(1)自動的に非表示にならないようにする

config.xml
  <preference name="AutoHideSplashScreen" value="false" />
  <preference name="SplashScreenDelay" value="10000" />

(2)マニュアルで閉じる

hoge.js(初期化が終ったら)
   navigator.splashscreen.hide();

SplashScreenDelayは十分に長い時間にする必要がありますが、hide()メソッドが過去動作しない不具合があったことがあり、SplashScreenDelayの時間分表示されてしまったので、初期化が終わるぐらいの適度な長さにしておくのが万が一にもいいと思います。

(Option)任意のタイミングで表示

(未検証) データを全て消すのに時間がかかる場合などにスプラッシュスクリーンを表示して、処理が終ったら最初の画面に戻る場合に使えるかもしれません。

navigator.splashscreen.show();//表示
navigator.splashscreen.hide();//非表j

注意?

  • アプリを起動 -> スプラッシュスクリーン表示される
  • 戻るボタンでアプリ停止
  • アプリを起動 -> スプラッシュスクリーン表示されない
戻るボタンの場合はアプリはおちておらずブラウザは死んでいる(?)

2015年9月12日土曜日

menubuttonが動作しない

document.addEventListener("menubutton",menuBtnClicked, false);
が動作しません。

JIRA menubutton event not firing で議論されている通りの状況のようです。

deviceready has not fired after 5 seconds

cordovaアプリの起動に10秒近く時間がかかるようになった場合はログを見ると下記のようなワーニングが出ているかもしれません。
調査した結論としては原因不明でした。

deviceready has not fired after 5 seconds. cordova.js:1183
Channel not fired: onPluginsReady cordova.js:1176
Channel not fired: onCordovaReady cordova.js:1176

一応10秒待つとdevicereadyが無理にでも発火されるのかアプリ自体は起動します。
たくさんの人が困っているようですが原因や答えが分かる人はいないようでした。


私の場合はこの問題が起こる前にCrosswalkのアップデート(plugin1.3.1,Crosswalk14)を行っていたので、Crosswalkを一度rmし、addしたところ直りました。

2015年9月11日金曜日

Angularjs1.x逆引き


オブジェクトのプロパティ全体を監視

$scope.$watch("targetObj",function(){
},true)
最後のtrueが無い場合はオブジェクトの参照を監視している。これでプロパティに変更があった場合もOK

モジュールを後からロード

ocLazyLoadを使用する。

2015年9月4日金曜日

ビルド中に処理を挟みたい(hookフォルダの使用方法)

ビルド時などに圧縮処理を挟んだりしたい場合はhookフォルダを使うとよさそうです。
/hooks/README.mdに説明が書かれていますがとりあえず実行する所までメモ。

簡単なサンプル

処理をフックするタイミングはたくさんありますがここではafter_prepareを選びました。before_buildもよく使われるタイミングのようです。
  • /hooks/にafter_prepareフォルダを作成
  • after_prepareフォルダの中にsample.jsを作成
  • sample.jsに以下を記入

#!/usr/bin/env node
console.log("Hello Hook");

  • コマンドなどでsample.jsに実行権限を付与します
  • cordova build を実行するとHello Hookと出力されます

環境変数

hook内のjsでは以下のような環境変数(一部)が使えます。

// cordovaプロジェクトフォルダへの絶対パス
var rootdir = process.argv[2];
// android
var platform = process.env.CORDOVA_PLATFORMS;
//node /usr/local/bin/cordova build android
var command = process.env.CORDOVA_CMDLINE;

Tips

after_prepareに2つファイルをいれると2つ実行されますが、順番は名前順(?)のような気がします。