Author Archives: Admin

初めて投稿します。今日は、先日リリースしたぐっすリンを開発する上ではまったMediaPlayerの落とし穴について話したいと思います。

 

ぐっすリンでは音を同時再生して音を組み合わせる機能があり、それをMediaPlayerを複数使って 実現しています。

また、音の種類が豊富で全43種類あります。そのためアプリの容量が60MBくらいになってしまい、Google Playにアップロードできなくなってしまいました。

考えた結果、音ファイルは別途サーバに置き、初回起動時に取得するようにしました。

サーバから取得したファイルは

/data/data/{アプリ毎領域}/files/

に置くようにしました。実装後、Nexus5で一通り動作確認して問題なさそうだったのでXperia(OS 4.0)でも動作確認してみたら・・・

落ちた。なぜだろうと思ったら、MediaPlayerのインスタンスが作られてなくて落ちてました。

ログを見てみると


<span class="pun" style="color: #000000;">E/MediaPlayer(21268): error (1,-2147483648)</span>

調べてみると参照したいファイルの読み取り権限がないと上記のようなエラーが出るようでした。

OS4.1, 4.2の端末で試してみたら問題なく再生できたので4.0の端末で発生する問題のようでした。

試行錯誤した結果、サーバからデータを取得するときに

 

bos = new BufferedOutputStream(new FileOutputStream(file));

となっていたところを

if (Build.VERSION.SDK_INT &amp;amp;amp;amp;amp;amp;amp;amp;lt;= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
 bos = new BufferedOutputStream(context.openFileOutput(getFileName(entry.getName()), Context.MODE_WORLD_READABLE));
} else {
 bos = new BufferedOutputStream(new FileOutputStream(file));
}

このようにサーバから取得して保存するときに権限を変えてあげると4.0でも再生することができました。
MODE_WORLD_READABLEはすべてのアプリからアクセスできてしまうのでセキュリティ上あまりよろしくありませんが、他に良い方法が見つかりませんでした。

時間があるときに改善したいと思います。

Swift2.0となり多くの関数やクラスが追加、削除されました。その中の幾つかを紹介したいと思います。

・実装を隠したい場合用いる構造体
実装する型を隠蔽するための型が作られました。これは実装がArrayやDictionaryにかかわらず、同じ型として扱うことができるようになります。

・struct AnyForwardCollection
前方向コレクションとして扱うことができます。Indexは常に増えることしかできず、減少させることはできません。
・struct AnyBidirectionalCollection
双方向コレクションとして扱うことができます。Indexは増減させる事ができます。最後から参照することはできません。
・struct AnyRandomAccessCollection
コレクションとして扱うことができます。Indexは増減させる事ができます。最後から参照することもできます。
・protocol AnyCollectionType
これらの構造体はAnyCollectionTypeを実装しています。このプロトコルが実装されている場合、===と!==を使うことができます。AnyCollectionTypeである場合、ラップしているコレクションに対して、’==‘や’!=‘を行った時と同様の結果が得られます。

・struct AnyGenerator
Sequenceとしても扱えるGeneratorとして用いることができます。
・struct AnySequence
配列操作が可能な型として隠ぺいすることができます。

・CFunctionPointerがなくなる
影響はよくわからない。

・CollectionTypeの必要なメソッドが追加
countやmapなどほとんどのコレクションで実装されていた機能がCollectionTypeに追加されました。これによってCollectionType全般を扱うような関数で扱える幅が増えました。

・mapなどの関数が削除
CollectionTypeに実装されるようになったので、実質影響はないがコンパイルエラーになるので修正は必要

・protocol CustomPlaygroundQuickLookable
実装することで、Playgroundで値が表示されるようになります。

・protocol ErrorType
実装されているenumをthrowすることができます。

 Social.framework を使う事によって、非常に簡単に様々なSNSに投稿することができる。このiOS8.3のSocial.frameworkにはバグがある。設定アプリでFacebookにログインして、Facebookアプリをインストールして、アプリを起動している状態の場合にバグが起こる。setInitialText:でテキストが設定されない。画像を添付してあっても実際には投稿されない。addURL:でURLを添付しても意図したものでなくなるなどの症状が発生する。UIActivityViewControllerでも同様のバグがみられる。
 このバグは、Appleに報告されているようなので次のバージョンでは治ると思われる。
 このバグを回避するには、Social.frameworkを使わないようにする必要がある。Facebook iOS SDKを組み込むことで回避することができる。

参考

http://stackoverflow.com/questions/29862869/ios-8-3-slcomposeviewcontroller-facebook-bug
https://developers.facebook.com/bugs/962985360399542/

追記 2015/7/2

この問題は現在解決されています。

株式会社プラスアールでは、iOS or Android or PHPのエンジニアを募集しています。
http://www.plusr.co.jp/recruit/programmer

今回は下の問題が解けたら書類選考なしにいたします。さらに、面接の際にバックジョイをプレゼントしちゃいます。

image_backjoy

求人への応募はしないという方でも、問題が解けた&弊社まで景品をとりに来ていただけるようでしたら、先着5名様に限りバックジョイをプレゼントいたします。

こぞってご応募ください。

[問題]

以下の表はそのマスとその周囲8マスに含まれている爆弾の個数を表しています。フィールドに含まれている爆弾の位置を(x,y)としたとき、その積k(=x*y)が小さい順にアルファベットを並べるとある単語が完成します。

マインスイーパの説明

解けた方は次のメールアドレスまでご連絡ください!
[完成したメッセージ]-[kの総和]@plusr.co.jp
※[]は要りません。
※作成したプログラムのGithubへのリンク又は、プログラムを添付してください。
※面接の日程についてはメールで調整致します。

求人に応募しない方は、”解けた!”というご連絡だけでも構いません。
景品だけ希望の場合はその旨ご記載ください。
例:「景品ほしい」

よろしくお願いいたします!

※求人の定員に達し次第終了しますので、解けた方はすぐにご連絡下さい。

1 2 3 4 5 6
1  1 i  2 p  2 a  1 g  1 x  1 u
2  1 c  2 t  2 e  2 h  2 r  2 a
3  1 g  2 q  1 i  2 r  3 n  3 z
4  2 r  2 d  2 g  2 o  3 e  2 o
5  2 v  2 n  2 o  1 w  3 y  2 s
6  2 b  2 t  2 r  1 p  2 w  1 a
7  2 g  2 u  2 i  1 x  3 q  2 u
8  2 e  2 t  2 s  1 m  2 x  1 n

Objective-CではURLエンコード/デコードをするのがちょっと面倒です。

JavaScriptのencodeURIComponent()と同じように使えるC関数を提供するライブラリを書きました

使い方は単純です。

AZEncodeURIComponent(@"日本語"); // -> "%E6%97%A5%E6%9C%AC%E8%AA%9E"
AZDecodeURIComponent(@"%E6%97%A5%E6%9C%AC%E8%AA%9E"); // 日本語

CocoaPods経由でインストールできます。

pod "AZEncodeURIComponent"

単純なライブラリですが、何故かこれだけを提供するものがなかったので書きました。。