2013年2月25日月曜日

iOSアプリ開発時に必要になりそうなTipsたち


いくつか調べたのでまとめます
アイコンの光沢の消し方、必要なアイコン画像たち、アプリの表示名の変更方法です。

このエントリの目次
  1. アイコンの光沢の消し方
  2. 必要なアイコン画像たち
  3. アプリの表示名の変更方法
  4. さいごに

1.アイコンの光沢の消し方
-info.plistを修正します。
やり方は、iOS5でアプリケーションアイコンの光沢を消す | 袖触れ合うも多少の縁に書いてある通り。
iOS5でアイコンの光沢を消すには、 Icon files(iOS5) > Primary Icon > Icon already includes gloss effect をYESにする。



実機で確認するとき、上記設定が反映されない場合があります。
その際は、一度アプリを実機から削除してからもう一度ビルドすれば反映されます。

2.必要なアイコン画像たち
Q: How are the icon files in my application bundle used on iPad and iPhone? | iOS Developer Libraryを参照のコト。

実機で確認するとき、上記設定が反映されない場合があります。
その際は、一度アプリを実機から削除してからもう一度ビルドすれば反映されます。

3.アプリの表示名の変更方法
iOSアプリ名の変更方法 | trunk/UIを参照のコト。

実機で確認するとき、上記設定が反映されない場合があります。
その際は(ry

4.さいごに
いろいろ調べる必要がありますね、大変だ。

2013年2月24日日曜日

iOSのカメラアプリに写真と動画を切り替える機能を実装する


1行加えるだけです
前回のエントリで、必要最低限の機能を持つカメラアプリを作りました。
そのときは写真を撮る機能だけでしたが、今回は動画を撮れるようにします。

このエントリの目次
  1. コード
  2. さいごに

1.コード
以下のようにmediaTypesを指定するだけです。
    UIImagePickerController *imagePickerController =[[UIImagePickerController alloc] init];
    
    (略)
    
    //カメラと動画を選択可能にする
    imagePickerController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

こうすると
写真を撮る機能だけだったのが、


画面右下に、動画切り替えのパーツが表示されます。
2.さいごに
UIImagePickerController 以外にもカメラ機能を呼び出す方法があるようなので、そちらも試してみます。

2013年2月22日金曜日

iOS アプリで カメラ写真撮影 + 画像保存 を実装してみた


10行くらいで実装できました
実装内容は大きく分けて2つ。
カメラの呼び出しと、撮影した画像の保存。
これだけでした。

逆に言うと、実装したのは基本的なコトだけです。
機能の拡張は後のエントリで行います。

また、カメラ機能は実機でしか試せないようです。
(本エントリの「6.シミュレータで試すとエラーが出ると思います」を参照)。

このエントリの目次
  1. アプリの概要
  2. GitHubにソースを置きました
  3. モーダルビューでカメラを起動する
  4. 撮った写真をカメラロールに保存する
  5. ヘッダファイルに記述するデリゲート
  6. シミュレータで試すとエラーが出ると思います
  7. 参考にさせて頂いたサイト
  8. さいごに

1.アプリの概要
アプリを起動すると、モーダルビューでカメラが起動し、写真を撮れます。
撮ったあとは、画面右下のボタン(「Use」ボタン)を押して画像を保存できます。
「保存完了」とアラートが出れば、カメラロールに画像が保存されています。

2.GitHubにソースを置きました
ソースはこちら

3.モーダルビューでカメラを起動する
UIImagePickerController を使います。
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
    //カメラを起動
    [self kickCamera];
}

//カメラを起動
- (void)kickCamera
{
    UIImagePickerController *imagePickerController =[[UIImagePickerController alloc] init];
    
    //カメラ機能を選択
    imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    
    imagePickerController.delegate = self;
    
    //YESにしないと、UIImage(カメラで撮ったデータ) が取得できない
    imagePickerController.allowsEditing = YES;
    
    //モーダルビューでカメラ起動
    [self presentViewController:imagePickerController animated:YES completion:nil];
}

これだけで、下記のようにカメラが使えるようになります!
何もしなくても写真撮ったりキャンセルできたりします。


viewDidAppearからカメラを起動していますが、iOS6以降の場合 viewDidLoadから起動しようとすると、
whose view is not in the window hierarchy uiimagepicker
こんな感じのエラーが出て動かないようです。

ちなみに
imagePickerController.sourceType
でカメラを指定してますが、UIImagePickerControllerSourceTypePhotoLibraryでフォトライブラリーを開いたり、 UIImagePickerControllerSourceTypeSavedPhotosAlbumでカメラロールを開いたりもできます。

4.撮った写真をカメラロールに保存する
以下が、必要なコード全てになります。
読めば内容は分かると思います!
//カメラ撮影後のデリゲートメソッド
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    //撮ったデータをUIImageにセットする
    UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
    
    //カメラロールに画像を保存
    UIImageWriteToSavedPhotosAlbum(image,
        self, 
        @selector(didFinishSavingImage:didFinishSavingWithError:contextInfo:),
        nil);
    
    //モーダルビューを消す
    [self dismissViewControllerAnimated:YES completion:nil];
}

//画像保存完了後。非同期で呼ばれる
- (void) didFinishSavingImage:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    
    //画像保存完了したよ、とアラートを出す
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
                                                    message:@"保存完了"
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
}

5.ヘッダファイルに記述するデリゲート
以下のようになります。
@interface CameraViewController : UIViewController
<UINavigationControllerDelegate, UIImagePickerControllerDelegate>

6.シミュレータで試すとエラーが出ると思います
こんなエラー。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Source type 1 not available'
これは、
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
で出るエラーで、カメラのソースタイプはシミュレータだと試せないようです。
なので、実機を使いましょう!

7.参考にさせて頂いたサイト
  1. イメージの取得と保存 | マルタケエビス
  2. Custom Camera App | Part 3: Assets Library | Developers' Realm
  3. [iPhone SDK] NSIvalidArgumentException: Source type 1 not available | Apple Support Communities

8.さいごに
思ったより簡単にカメラ機能などが使えて感動しました!
これからまだまだ改良しますので、また本ブログにまとめていこうと思います。

2013年2月11日月曜日

iOSアプリに「Facebook の Mobile App Install Ads によるログ計測機能」を組み込む


明けましておめでとうございます
2013年も10%ほど過ぎ、ようやく正月ボケがおさまってきました。
遅いな!

本年 一発目のエントリでは iOSアプリに「Facebook の Mobile App Install Ads によるログ計測機能」を組み込む方法を紹介します。
とても簡単です!

ちなみに、Facebook SDK の組み込み方は本ブログの iOSでFacebookアプリを作ってみる その1 にて紹介しています。

このエントリの目次
  1. Mobile App Install Ads とは
  2. このエントリのゴール
  3. アプリ情報入力時のTips
  4. Facebook SDK を組み込む
  5. コードを追加する
  6. アプリを起動して、実際にログを送ってみる
  7. 送られたログの確認方法
  8. さいごに

1.Mobile App Install Ads とは
Facebookが提供する機能で、
  1. Facebook のニュースフィードに アプリの広告(ターゲティング広告)とApp Store へのリンクを出せる
  2. 更に アプリがいつ何回インストールされたかを可視化できる
というサービスです。

Facebook、アプリストア直結のモバイル広告「Mobile App Install Ads」を一般公開 | ITメディア ニュースでは以下のように説明されています。
Mobile App Install Adsは、米AppleのiOS端末および米GoogleのAndroid端末上にアプリ広告を表示し、広告効果をモニタリングできるサービス。
広告主は、年齢や性別、「いいね!」などの(匿名化された)個人情報に基づいてターゲティングされたFacebookユーザーのモバイル端末上にアプリの広告を表示できる。

2.このエントリのゴール
ニュースフィードにアプリの広告とApp Storeへのリンクを出すのは、Facebookの開発者向けサイトでデータを入力すればできると思います。
(やったコトないです。が、広告の出し方がFacebookにリジェクトされる場合もあるようで、大変なようです)

ですが、アプリがいつ何回インストールされたかをモニタリングするためには、アプリにFacebook SDKと1、2行のコードを追加する必要があります。
そうすることで、アプリの起動時にFacebook にログが送られ、モニタリングできるようになるんです。
このエントリでは、そのやり方とログ確認のやり方を主に紹介します。

3.アプリ情報入力時のTips
さて、Facebookにアプリ情報を入力する必要があるわけですが、正直「この項目は何なんだろう」というのがあると思います。
少なくとも僕はそうでした。

特に「アプリをFacebookに結合する方法を選択」のところは、説明がなさすぎていちいち調べてましたが、そこは一つのフォームを埋めるだけで事足ります。

今回必要なのは1つ
iPhoneアプリストアID(or iPadアプリストアID)のみです。


iPhoneアプリストアIDは、iTunes App StoreのURLから分かります。
アプリのURLが例えば以下の場合、
https://itunes.apple.com/jp/app/some-app-name/id999999999?mt=8
999999999 を入力します。
URL中の「id<数字>」の部分ですね。

iPhoneアプリストアID以外の情報は、Facebook での OAuth や、複数のアプリをまとめて効果測定したいとき(例えば有料、無料のアプリをまとめたいとき、とか)に入力します。

ここら辺は Facebook の説明が言葉足らずで初心者には分かりにくいですね…。

次はいよいよ実装に入ります。

4.Facebook SDK を組み込む
本ブログの iOSでFacebookアプリを作ってみる その1 にて、組み込み方を紹介しています。

一点だけ。
上記エントリの「5.SDKをアプリに組み込む」の最後の方で、plist の 「URL Schemesfb<Facebook App ID> を設定します。」とありますが、今回の実装では不要です。
設定しても別にいいんですが、そうすると冗長なURLスキームを入れることになるので、その点に注意です。

5.コードを追加する
AppDelegate.m を2カ所、編集します。

まず、必要なヘッダファイルをインポート。
#import <FacebookSDK/FBSettings.h>

続いて、Facebook にログを送る部分です。
- (void)applicationDidBecomeActive:(UIApplication *)application
{
    NSString *facebookAppId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"FacebookAppID"];
    [FBSettings publishInstall:facebookAppId];
}

FacebookAppID の値はiOSでFacebookアプリを作ってみる その1 でplist に設定しています。
で、ログ計測のおまじないメソッドを呼ぶときに、引数としてそれを参照しています。

これで実装完了です(はやっ!)

あとはログがちゃんと送られているか、確認するだけです!

6.アプリを起動して、実際にログを送ってみる
手順は簡単なのに、実はこれにけっこうハマりましたね!
  1. Facebook のアプリをインストール、サインインしておく
  2. ログ計測機能を組み込んだアプリを起動する

これだけなんですが。

ここで注意
テストなどでログ計測を複数回確認したい場合は、その都度 違うアカウントでサインインする必要がありそうです。

というのも、ある1つのFacebook アカウントから一度ログを送ると、それ以降はアプリの再インストールをしても、異なる端末にインストールしても、そのFacebook アカウントからはログが送られないみたいなので。
(少なくとも僕が実装したときはそうでした。間違っていたら教えて頂きたいです)

Android の場合は、ログ計測機能を組み込んだアプリを再インストールすれば、同じアカウントでも都度ログが送られると聞きましたが…。

7.送られたログの確認方法
まず、Facebook でログを確認する方法は 大きく分けて以下の2つがあります。
  1. ダッシュボードにてきちんとグラフ化されたものを見る
  2. 最後にログが送られた時間だけを見る

1つ目の方法:
時間が経たないと確認できません!
ログを送った次の日か数時間後か、それは分かりませんが、とにかくリアルタイムでの確認はできません。

2つ目の方法:
「最後にログが送られたのはhh:mm」という味気ない表示ですが、リアルタイムに確認できます。
遅くとも1分後には確認できるはずです。

なので
開発時のテストには2つ目の方法をとるとよいです。
Facebook開発者向けサイトのAppsページから確認できます。


確認できたら、「Facebook の Mobile App Install Ads によるログ計測機能」の組み込みは完了です。

お疲れ様でした!

8.さいごに
今回の話題に関する情報があまりネットになかったので、まとめてみました。

お役に立てれば幸いです。
それでは。

Related Posts Plugin for WordPress, Blogger...