Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード Twitter

2012-07-25

Beta 版の Xcode で開いたプロジェクトが現行 Xcode で起動しなくなった場合の対処法

NDA があるので Xcode のバージョンがいくつとか、環境の細かいことは省きますが(そしてこの問題が他の環境でも起きているのか、起きているとしてこの対処法が通用するのかは不明ですが)とりあえず僕のところでは以下で直りました。


  1. Xcode を閉じる(Beta版、現行版共に)
  2. DerivedData(~/Library/Developer/Xcode/DerivedData)配下のデータを消去。ゴミ箱も空にする。
  3. 現行版Xcodeで該当プロジェクトを開く


2012-07-24

ひとつのプロジェクトで複数の Bundle identifier を使い分ける方法

インハウスビルド用のエンタープライズアカウントとリリース用アカウントがある場合、


  • com.shu223.hoge(リリース用の Bundle ID)
  • com.shu223.hogeep(エンタープライズ用の Bundle ID)

といった感じで、同じアプリでありながら、2つの Bundle identifier を使い分ける必要があります。



Info.plistには Bundle identifier を一つしか設定できないので、次のような方法で使い分けることが考えられます。


  • In House ビルド用の Info.plist を追加し、Build Configuration を追加して Build Settings の "Info.plist File" で使用する Info.plist を指定する
  • In House ビルド用のターゲットを追加し、Build Settings の "Product Name" にそれぞれ別々のものを指定し、Info.plist の Bundle identifier は ${PRODUCT_NAME:rfc1034identifier} を用いて指定する

前者の方法だと、Info.plist に変更を入れる際に両方の Info.plist を変更する必要があり保守性が損なわれるので、後者の方法がおすすめです。



2012-07-23

In-App Purchase の脆弱性への対応方法

巷を騒がせている In-App Purchase の脆弱性問題ですが、iOS Developer Library に対策方法についての記事が掲載されていました。


「自分とこのサーバーから App Store サーバーにレシート送ってチェックしているタイプのアプリはいいけど、そうじゃない場合は脆弱性の影響を受ける可能性がありますよ、次のように対策してくださいね」ということが書かれているのですが、

Check that the SSL certificate used to connect to the App Store server is an EV certificate.

Check that the information returned from validation matches the information in the SKPayment object.

Check that the receipt has a valid signature.

Check that new transactions have a unique transaction ID.

この記事には添付ファイルがついていて、そのあたりの実装をすでにやってくれている VerificationController なるクラスが入っています



VerificationController を用いた脆弱性対策の実装方法

VerificationController クラスはシングルトンとして実装されていて、sharedInstance 以外には verifyPurchase:というメソッドを一つもっているだけなので、中身はややこしいですが扱いやすいかと思います。


手順は以下の通りです。


1. VerificationController をダウンロード&プロジェクトに追加

https://developer.apple.com/library/ios/releasenotes/StoreKit/IAP_ReceiptValidation/VerificationController.zip


2. Security.framework をプロジェクトに追加


3. verifyPurchase: メソッドをコール

transactionState が SKPaymentTransactionStatePurchased または SKPaymentTransactionStateRestored になった場合に、verifyPurchase: メソッドをコールしてチェックを行います。


4. base64まわりのメソッドを実装

ビルドしてみると #warning が仕込まれていて気づくようになっているのですが、

  • encodeBase64:length:
  • decodeBase64:length:
  • base64_decode()
  • base64_decode()

の実装が空になっているので自分で実装する必要があります。


#base64 の Objective-C 実装は巷にたくさん転がっているものの、型とか引数とか微妙に違ってて、そのものズバリ、なものはなかなか見つかりませんでした。これはめんどくさい。。



2012-07-22

UIWebView からアプリ内に入れたカスタムフォントを使う

Info.plist に "Fonts provided by application" で追加したカスタムフォントを、UIWebView で表示する web コンテンツから参照する方法です。


CSS の font-face で、次のように指定します。

@font-face {
  font-family: "{CSS内で使用する名前}";
  src: local("{フォント名}");
}

font-family には CSS内で使用するフォントファミリー名を任意でつけます。(ただし既存のフォント名とかぶらないように)


local に指定するのはフォント名です。これはネイティブ側で

[UIFont fontWithName:@"{フォント名}" size:20];

といった感じで指定するフォント名と同じです。


このフォント名は僕は Font Book で開いて調べてます。

(調べ方はこちらの記事がキャプチャ付きでわかりやすいです)



2012-07-21

『第3回 iphone_dev_jp 東京iPhone/Mac勉強会』で vImage について発表してきました

先日の記事で第2回勉強会向けに用意していた発表内容について書きましたが、本日(7/21)開催された第3回で発表の機会をいただいたので、資料とサンプルコードをアップデートして発表してきました。


iOS 5 から Accelerate.framework に追加された高速画像処理ライブラリ、vImage についての話です。


前回との差分は、サンプルコードでできる画像処理が増えたこと(回転とか膨張/収縮とか、前回記事のときから倍ぐらい対応メソッドが増えてます)と、資料でそのへんについて触れているp19〜p25あたりと、OpenCV, CoreImageとの比較を表にしたp26あたりです。




資料の内容抜粋

  • vImageとは
    • Accelerate.framework内のライブラリ
    • iOSデバイスのハードウェア向けに最適化されていて高速
    • 畳み込みや幾何変換,ヒストグラム計算などの画像処理系の関数をまとめたものでiOS5から利用可能
  • 何がいいの?
    • シンプルに書ける
    • 速い・・・14倍高速!!
    • 省電力・・・90%off!!
  • vImageの使い方
    • Accelerateフレームワークをプロジェクトに追加し、 Accelerate.hをインポートすればOK
#import <Accelerate/Accelerate.h>
    • とりあえずvImageConvolve_ARGB8888() ひとつで色々できる
      • ブラー、エッジ抽出、エンボス、先鋭化 etc...
  • その他の使い方
    • 回転
    • 膨張/収縮
    • ヒストグラム均一化
  • サンプルコード:https://github.com/shu223/vImageCategory
  • vImage vs OpenCV vs CoreImage
  • ドキュメント
    • WWDC2011のセッションビデオ&スライド
      • 概要を知るには一番わかりやすい
    • vImage Programming Guide
      • 処理前後のサンプル画像や、フィルタ配列の図もあってわかりやすい
    • vImageリファレンス
      • たくさんあるので必要に応じてどうぞ・・・
      • Conversion / Convolution / Decompression / Geometry / Histogram / Morphology / Transform etc...
  • vImageを使用している画像処理ライブラリ

サンプルコード

githubに上げたサンプルコードは UIImage のカテゴリとして作ってあってAPIも下記のようにシンプルにしてあります。

// Convolution Oprations
- (UIImage *)gaussianBlur;
- (UIImage *)edgeDetection;
- (UIImage *)emboss;
- (UIImage *)sharpen;
- (UIImage *)unsharpen;

// Geometric Operations
- (UIImage *)rotateInRadians:(float)radians;

// Morphological Operations
- (UIImage *)dilate;
- (UIImage *)erode;
- (UIImage *)dilateWithIterations:(int)iterations;
- (UIImage *)erodeWithIterations:(int)iterations;
- (UIImage *)gradientWithIterations:(int)iterations;
- (UIImage *)tophatWithIterations:(int)iterations;
- (UIImage *)blackhatWithIterations:(int)iterations;

// Histogram Operations
- (UIImage *)equalization;

実行して画面をタッチするとこんな感じで vImage による画像処理が適用されます。


f:id:shu223:20120721170411p:image:w320


※左上がオリジナル画像です。



反省など

一番肝心なところの調査が足りず、中途半端な発表をしてしまったなーと反省しております。


何がって、資料p26の vImage vs CoreImage vs OpenCV の部分、あそこで「どういう場合において vImage を選択するべきか」を明確に言えてないので、この発表を聞いたところで vImage を採用しようとか採用しないでおこうとか、判断できないところ。


  • CoreImage は内部的に vImage を使ってるのかどうか。
    • 全面的に使ってるのか、一部で使ってるのか。
  • vImage にできて、CoreImage にできないこと。その逆。
  • vImage, CoreImage, OpenCV, OpenGLESでの処理速度の比較(計測コード書く)

このあたりはまた追って調べたいと思います!



2012-07-12

Facebook SDK 3.0 for iOS のサンプルを一通り試してみました

今回は従来のように github からソース一式をとってくる方式ではなく、インストールパッケージをダウンロードしてインストールする方式になったようです。

https://developers.facebook.com/ios/


で、インストールはさくっと終わったのですが、どこに何がインストールされたのかわからなかったのでもう一度インストールし直して最後に出てくるドキュメントを確認しました。

TRY IT OUT

1. Test your install; build and run the project at ~/Documents/FacebookSDK/Samples/HelloFacebookSample/HelloFacebookSample.xcodeproj

2. Check-out the tutorials available online at: https://developers.facebook.com/docs/getting-started/getting-started-with-the-ios-sdk

3. Start coding! Visit https://developers.facebook.com/ios for tutorials and reference documentation.


上記1に記載されている通り、~/Documents/FacebookSDKにインストールされます。




以下、サンプルを一通り動かしてみた中で、個人的に今後使いそうと思ったものを紹介させていただきます。



FriendPickerSample

友人一覧を表示し、ユーザーが選択した友人のリストをプロパティに保持してくれる FBFriendPickerViewController のサンプルです。


f:id:shu223:20140131074009j:image:w240


ソースを見ると、FBFriendPickerViewController を表示する部分のコードはこう実装されていました。

FBFriendPickerViewController *friendPicker = [[FBFriendPickerViewController alloc] init];
self.friendPickerController = friendPicker;

[friendPicker loadData];

// Create navigation controller related UI for the friend picker.
friendPicker.navigationItem.title = @"Pick Friends";
friendPicker.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] 
                                                  initWithTitle:@"Done" 
                                                  style:UIBarButtonItemStyleBordered 
                                                  target:self 
                                                  action:@selector(doneButtonWasPressed:)];
friendPicker.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] 
                                                 initWithTitle:@"Cancel" 
                                                 style:UIBarButtonItemStyleBordered 
                                                 target:self 
                                                 action:@selector(cancelButtonWasPressed:)];

// Make current.
[self.navigationController pushViewController:friendPicker animated:YES];

ユーザーが選択した友達のリストをプロパティから取得する部分のコードはこんな感じです。

for (id<FBGraphUser> user in self.friendPickerController.selection) {
    if ([text length]) {
        [text appendString:@", "];
    }
    [text appendString:user.name];
}


PlacePickerSample

FBPlacePickerViewController のサンプル。


そのままビルドして起動すると


f:id:shu223:20120712231037p:image:w240


こんな感じでシアトルのスポット一覧が出てきてイマイチありがたみがわかりづらいのですが、PPViewController.m の reflesh メソッド内の

[self searchDisplayController:nil shouldReloadTableForSearchScope:SampleLocationSeattle];

ここを、

[self searchDisplayController:nil shouldReloadTableForSearchScope:SampleLocationGPS];

こう書き換えると現在位置周辺のスポット一覧が出てくるようになるので若干新SDKのありがたみが増すかもしれません。


f:id:shu223:20120712231109p:image:w240



Hackbook

いろんなサンプルが入ったデモプロジェクトです。


目新しいものとしては、招待ダイアログのデモがありました。


f:id:shu223:20120712231236p:image:w240


アプリを使っている人のみをリストに出す、アプリを使ってない人のみをリストに出す、など様々なパターンのサンプルがあります。


写真のアップロードのデモも入っていたのですが、こちらは新しい写真投稿用ダイアログとかはなく、ボタンをタップすると勝手に写真がアップされてしまうという残念なサンプルでした・・・



ProfilePictureSample

FBProfilePictureView のサンプル。


f:id:shu223:20120712231352p:image:w240


切り抜きができますよ、ということ以外の違いはこのサンプルからはわからず。FBProfilePictureView のヘッダみてみると、userID プロパティと pictureCropping プロパティぐらいしかないので、userID に値をセットするだけで非同期でアイコン画像を取ってくる、的なことが売りなビュークラスなのかも。(※詳細未確認)



その他

SDK 3.0 の What's New はこちらにまとまっています。

https://developers.facebook.com/features/whats-new-ios-sdk-3/



2012-07-01

UIWebViewで表示中のHTMLコンテンツを取得する

UIWebView や UIWebViewDelegate には、ロードしてきたHTMLの内容を取得するためのプロパティやメソッドが見当たりません。


で、どうすればいいかというと、stringByEvaluatingJavaScriptFromString: メソッドで JavaScript を実行して、現在 UIWebView で表示中のHTMLの内容を取得することができます。


たとえば webViewDidFinishLoad: の中で下記を実行すると、

NSString *head = [self.myWebView stringByEvaluatingJavaScriptFromString:
                  @"document.head.innerHTML"];

HTMLの <head> タグの中身を NSString 型で取得できます。


同様に、<body> タグの中身は

NSString *body = [self.myWebView stringByEvaluatingJavaScriptFromString:
                  @"document.body.innerHTML"];

で取得できます。



2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2018 | 02 |