2014年1月21日火曜日

Google Play ServicesでGCMを使ってみる(Google Play Services APKの存在チェック編)

詰まったところをピンポイントで覚え書き。
GCMを使おうとSDK Managerで「Google Cloud Messaging for Android Library」をインストール。。。
Derecatedになってるぞ!
GCMのオフィシャルサイトで確認してみると、「Google Play Services」を使いなさいとのこと。
いつの間に変わったのよ!?って、Google I/O 2013の時ですよね。そいえば中継見てましたよ。時間的にめっちゃ眠かった(笑)
そんなこんなでオフィシャルサイトの「Implementing GCM Client」ページを見ながら環境作りました。書いてあるまんま! とりあえずPlay ServicesのAPKがあるかどうかをチェックする必要があるらしいので、そこだけ書いて動かしてみよう。
ManifestにパーミッションとReceiverを追加しておけばよし。ここはGoogle Play Servicesに変わる前と一緒みたい。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.helloworld.app" >
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <permission android:name="com.helloworld.app.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="com.helloworld.app.permission.C2D_MESSAGE" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:theme="@style/Theme.AppCompat"
            android:name="com.helloworld.app.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver
            android:name=".GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.helloworld.app" />
            </intent-filter>
        </receiver>
        <service android:name=".GcmIntentService" />
    </application>
</manifest>
で、チェック用のメソッドがこれ。
private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;

private boolean checkPlayServices() {
    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (resultCode != ConnectionResult.SUCCESS) {
        if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
            GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                    PLAY_SERVICES_RESOLUTION_REQUEST).show();
        } else {
            Log.i(TAG, "This device is not supported.");
            finish();
        }
        return false;
    }
    return true;
}

2014年1月20日月曜日

MacにCordovaをインストール

OS X MavericksにCordovaをインストールしたのでその記録を思い出しながら残しておきます。
難しいことは何もないのでスムーズに完了します。

まずはCordova利用アプリの開発環境に必須となったNode.jsからインストールします。
Node.jsのインストールはHomebrewでサクッと終わります。
Homebrewがまだインストールできていない場合はOS X MavericksにHomebrewをインストールするを参照して準備してください。
brew install node
これでNode.jsとnpmのインストールが終わりました。

次はいよいよCordovaのインストールをします。
今度はHomebrewではなく、先ほどインストールしたnpmを使います。
npm install cordova
お手軽すぎますが、これで完了です。
念のためCordovaコマンドが使えるようになっていることを確認するという意味でCordovaのバージョンを確認してみましょう。
cordova -version
おしまい。

OS X MavericksにHomebrewをインストールする

OS X MavericksにHomebrewをインストールしたので、その記録を思い出しながら残しておきます。
そもそもHomebrewは何者かというと、OS X用のパッケージ管理システムです。Linuxだとyumとかapt-getとかありますが、そんな感じです。
インストールはたった1コマンド流すだけです。
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
たったこれだけでパッケージ管理システムが使えるようになります。
インストールできたらこのコマンドでチェックしておきましょう。
brew doctor
パッケージを追加するにはこれ。
brew install [パッケージ名]
管理下にあるパッケージの一覧を取得するにはこれ。
brew list -l
こんな感じでサクッとインストールができました。

2014年1月17日金曜日

Android Studio 0.4.2でHello world!

久しぶりにAndroid Studioを起動するとバージョンが上がってました。
試しに空っぽのプロジェクトでビルドしてみると、ビルドはすんなり通りました。ビルドはね!

こんな感じでほとんどデフォルトです。
まずは「New Project...」でプロジェクトの新規作成ウィザードを起動します。
アプリ名等々はてきとうに。Minimum required SDKとTarget SDKはあえてLevel 10に落としてます。
まだまだGingerbread残ってますしね。2014/2/8時点で21.2%らしいです。
それと、カスタムアイコンを用意するのも面倒なのでCreate custom launcher iconのチェックは外しておきます。
あとはそのまま。

2014年1月16日木曜日

Storyboardを使っているときにAppDelegateからアクティブなUIViewControllerを取得する

タイトルの通りのことをやりたかったんでググってみました!
みんな思うところは同じなんだね。たくさん見つかったよ。
と、思いきや。。。
見つかったのは任意のUIViewControllerをインスタンス化してそこへ画面遷移させようとかそういったものばかり。
つまり、今あるUIViewControllerのインスタンスを取得するのではなく、別ものを作ってしまうということ。
これでは意味がないのですよ!!!

あれこれ試行錯誤しているうちに、オフィシャルのAPIドキュメントに辿り着き(はじめから見ておけよ 汗)、 見つけましたよ、実質的に今表示されているUIViewControllerのインスタンスをとってくる方法。

[self.window.rootViewController presentedViewController];

これで今アクティブになっているUIViewControllerのインスタンスがとれます。
self.window.rootViewControllerはメインのUIViewControllerなので、このUIViewControllerが表示しているUIViewControllerを取得するとそれが今アクティブになっているUIViewControllerというわけです。

間違っていたり、もっとスマートなプロパティなりメソッドなりがあれば指摘いただけると助かります。

2014年1月13日月曜日

Apache Cordova初めませんか

スマホやタブレット向けアプリの開発をしたい!
でもJavaやらObjective-Cやうんぬん。。。多すぎて面倒。
最近の自分はWebばっかりしかさわってないし~

そんなボクの救世主的な存在がApache Cordovaです。
そしてこれをAdobeがごにょごにょしてリリースしているのがPhoneGapです。

こいつを使うとHTML/Javascriptだけでアプリを作ってしまうことができます。

JavaやObjective-Cを全然知らないし、これから勉強するのも億劫だーなんて人でも安心。
Ver.3からだったと思いますが、ネイティブコードに一切触れることなくアプリが作れるようになりました。
それまではお決まりテンプレートでひな形は手作りしないといけなかったりしましたが、今では完全なネイティブコードレスが実現できるようになっています。
そのかわり、node.jsが必須になりましたが。Webやってればnode.js使っている人も増えてきているのではないでしょうか。
とは言え、実行環境の構築からとなると壁を感じてしまう人が居るのも事実。。。ですが、Cordovaを使うためだけと割り切ればお決まりコマンドをちょびっと覚えるだけで事足ります。簡単です。

ちなみに、どうしてもということがあれば、ネイティブコードを作ってJavascriptと連携させることもできます。

肝心の導入方法やらチュートリアル的なものはまたそのうち。
使っていて見えてきたメリットやデメリットも挙げていけるといいなと思います。