2011年12月13日火曜日

iPhoneにおける画像処理

iPhoneにおける画像処理のやり方についてです。
iOS5になってCIImageが導入された事もあり、いくつかの選択肢があります。

例えば、Instagramのような色変換とかブラーならCIFilterを使う事で実現できます。

リアルタイムな処理をしようと思うとAVFoundationを用いて、その中で各フレームごとのバッファを投げてくれるメソッドがデリゲートにあるので、それを用いる事で何かしらの処理が出来ます。
メソッド名:captureOutput:didOutputSampleBuffer:fromConnection:

高速な実装を実現しようと思うと、GLESを使ったGPGPUという選択肢になると思います。
Appleのサンプル、GLCameraRippleはかなり高速に描画できていて驚きました。
サンプルソース

二つ目の方法で、画素単位まで触る事ができるけど実時間でなにかを使用と思うと、
とてもスピードが遅くなってしまいます。
なので、重ための画像処理をしようと思ったらGLESを学ぶしかないのかなー

2011年12月4日日曜日

Network activity indicator + NSURLConnection

iOSの通信中のサインとして、ステータスバーに表示されるあのクルクル回る奴
あれは Network activity indicator と呼ぶのですがあの表示は簡単にできます

    
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

もちろん、消すのも簡単にできます。
    
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

ネットワーク通信中を表すのによく使うんですが、
NSURLConnectionとかを使っていっぺんに複数の画像をDLしたりすることがありますよね。
そのときにDLを開始したときにインジゲータを表示して、全部のDLが終わったときにインジゲータを消したいと思います。

そういったときの対処法ですが、以下のURLにその答えが載っていました。
http://akira108.com/blog/?p=6

NetworkActivityIndicatorを管理するシングルトンクラスを作ってやって、インジゲータのカウンタを作ってやって管理します。
カウンタが1以上になると表示して、0になると消す。
インジゲータを表示するタイミングで、カウンタをインクリメント
消去するタイミングでカウンタをデクリメントさせるという使い方です!

2011年11月20日日曜日

認証からAPI利用まで


前回の投稿から丸一月経ってしまいましたorz



今回は認証とAPIの利用までを説明したいと思います。

大まかな認証からAPI利用までの流れは次の通りです

  1. ヘッダファイルのインクルード
  2. クラスMixiの初期化
  3. 認証
  4. APIの利用

1. ヘッダファイルのインクルード
SDKを利用するソースコードでヘッダファイルをインポート

#import "MixiSDK.h"

これでOK

2.クラスMixiの初期化
プログラムを起動するたびに、クラスを初期化する必要があります 


    
Mixi* mixi = [[Mixi sharedMixi] setupWithType:kMixiApiTypeSelectorGraphApi
                                   clientId:kMixiClientID
                                     secret:kMixiSecret 
                                      appId:kAppID];

clientIdやsecretはmixi Developer Centerより入手できます。
ログインしたら、Consumer IDやConsumer Secretと表示されているのがそれです。


3.認可
このアプリを、各ユーザーがアカウントを用いて利用することを認可します。
といっても、特別難しい事はありません。以下のコードで認可する事が出来ます。


[mixi authorize:@"r_profile", @"r_voice", @"w_voice", nil];    

Mixi#autorize:を用いる事で認可をすることができます。実際の動作としては、
mixi公式アプリに移り、そこから認可する、といった形に成ります。
このサンプルでは、profileのread、voiceの読み書きを認可しています。

認可の結果は
UIApplicationDelegate#application:openURL:sourceApplication:annotation:
で受け取る事が出来ます。

一度認可を行うと、この処理を呼ぶ必要はありません。認可されているかどうかは
[mixi isAuthorized]
で確認することが出来ます。
また、認可を外したい場合は、mixiの利用アプリ一覧からユーザーが解除します。

4.APIの利用
APIは

  1. HTTPリクエストを作る
  2. リクエストを投げる
  3. 結果を処理する
の三段階で行います。

まず、HTTPリクエストの作成です。エンドポイントを指定し、
リクエストのパラメータを決定します。
パラメータの取り方は何種類かあり、NSDictionaryで指定するもの、NSObjectで指定するものなどがあります。
例えば、NSObjectを列挙し、ボイスを投稿するのであれば

  
MixiRequest *request = [MixiRequest postRequestWithEndpoint:@"/voice/statuses" 
                 paramsAndKeys:voice, @"status", nil];

とすることで、POSTリクエストを作る事が出来ます。
voiceは投稿内容の入ったNSStringオブジェクトです。


つぎにリクエストを投げるのですが、これは
  [[Mixi sharedMixi] sendRequest:request delegate:self];
とすることで投げる事が出来ます。
delgateは結果を処理するクラスで、この場合は自分で受け取ってから処理を行います。


そして、結果の処理です。
今回はPOSTリクエストを投げました。成功した場合は、つぶやきの内容(多分)が帰ってきます。失敗した場合はエラーコードがおそらく帰ってくると思います。
APIを処理するメソッドは

- (void)mixi:(Mixi *)mixi didFinishLoading:(NSString *)data
- (void)mixi:(Mixi *)mixi didSuccessWithJson:(NSDictionary *)data
などがあります。API実行結果を表示するサンプルは以下のようになります。
- (void)mixi:(Mixi *)mixi didFinishLoading:(NSString *)data{
    NSLog(@"API実行結果%@", data);
}

以上でAPIの利用までができると思います。

2011年10月17日月曜日

SDKのダウンロードからプロジェクト設定まで

mixi SDK for iOS を使ったあれこれ、今回はSDKのDLからプロジェクトを作り、その設定まで行きたいと思います。

といっても、基本的にはmixi Developer Centerに書いてある事と被っています。


まずはSDKをDLします。
SDKのDLはここから
2011/10/17現在ではバージョンが1.1になっています。
適当な所に解凍します。



次に、Partner DashboardからAPIの利用登録を行います。
ここ→http://developer.mixi.co.jp/connect/mixi_graph_api/services/
を参考に登録を行います。ここで気をつけたいのが起動URIスキームです

起動URIスキームは、あるアプリケーションから別のアプリケーションを呼び出すときの引数のようなものです。
例えばSafariでYoutubeの動画を見ようとするとYoutubeのアプリが起動すると思います。
そのとき、どのアプリケーションを起動するか、指定するものが起動URIスキームらしいです。
起動URIスキームについては下記をご覧ください。
http://safx-dev.blogspot.com/2010/10/iosurl.html

Partner Dashboardにはこんな感じで、
起動URIスキームを入力する部分があると思います。赤塗りの部分へは、自分で用いるURIスキームの名前を登録します。
ここでは仮にhogehogeとします。
登録はこんな感じです。



次に、Xcodeで新しいプロジェクトを作ります。
テンプレートはSingle View Applicationで行きましょう。何でも多分大丈夫です。


解凍したSDKをプロジェクトに追加します






さらに以下の3つのフレームワークをプロジェクトに追加します。

  • CFNetwork.framework
  • Security.framework
  • SystemConfiguration.framework
そして、Targetsから起動URLを指定します。
  1. Addから URL Typesを選択
  2. IdentifierやIconは適当に入力
  3. URL Schemesは mixiapp-hogehoge
    と入力します。セミコロンやスラッシュは不要です。
こんな感じで指定します。

さらに、現在のSDKではARCを使うとエラーが発生します。なのでARCを使わないようにプロジェクトの設定を変更します。
Build SettingsからApple LLVM compiler 3.0 - Languageの項目、
Objective-C Automatic Reference CountingをNOにします。



実機でのコンパイル
実機でアプリを動かせるようにiOS Provisioning Portalから登録を行います。
ページ中程にあるLaunch Assistantから登録ができると思います。

以前と比べて、ぐっと簡単になったように思います。


あとはコンパイルをすれば完了です。
なにもコードを書いてないので、動かしてもなにもないと思いますが。

次回は認証までを紹介したいと思います!

2011年10月16日日曜日

mixi API SDK for iOSを使うときのあれこれ始めました。

iOSでmixi Graphを簡単に使う事ができる、mixi API SDK for iOSがmixiから発表されました。
でもあんまりこれを使っているとことか、サンプルコードがないみたいなので、勉強しつつ、どう使えばいいかを綴って行きたいと思います。

とりあえず必要な物
  • mac OSXの動くパソコンとXCode
  • iOSの動くデバイス
  • iOS developer programへの登録
SDKを使って認証を行うには、mixi公式アプリが必要なのですが、iOSシミュレータでは
mixi公式アプリを起動することができないので、そこから先に進めなくなります。

この辺りを準備しておけば大丈夫だと思います。


2011年10月8日土曜日

iOS, Objective-Cにおけるメモリ管理


iOSにおけるメモリ管理について
  • iOSではガベージコレクションが使えない
  • その代わりに参照カウンタ方式でメモリを管理する
ガベージコレクションが使えないのは驚きだった。

参照カウンタについて
  • [インスタンス retain]で参照カウンタを1追加
  • [インスタンス release]で参照カウンタを1減らす
  • 参照カウンタが0になったら自動解放される。
  • このときにdeallocメソッドがコールされる。

一時的に使う変数などは解放のし忘れなどが起こりがち、
そのために指定したタイミングでreleaseメッセージを送信してくれる自動解放プールという仕組みがある。
  • NSAutoreleasePool *pool = [[NSAUtoreleasePool alloc] init]で自動解放プールを作る
  • インスタンスに対してautorelase を実行する事で自動解放プールへ登録できる
  • [pool drain]でプールへ登録されていたインスタンスに対してrelaseメッセージが送信される