github で Forkしてみる

2011年11月25日金曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

github にはソースを自分用にカスタマイズできる Fork という機能があるらしい。試してみた。

最初に github に自分のアカウントでログインしておきForkしたいソースのページを開く。そして右上の "Fork" ボタンを押す。

これだけ。自分のリポジトリに Forkされたリポジトリが作成される。

一旦、Fork したものは自分ですきなようにできる。例では MTStatusBarOverlay というライブラリを Fork してみた。

このライブラリにはサンプルアプリが付いていなかったので自分で作ってみる。Forkした先ほどのリポジトリを Clone して手元の PCへ持ってくる。

(参考)

Xcode でプロジェクトを開き、新しいターゲットを追加する。


簡単な動作確認なので Single View Application を使う。
ターゲットが追加された。

スキーマも一緒に作ってくれるのですぐにビルドできる。

アプリを動作させる為に必要なファイル一式も作成されている。

適当にコードを書いて動作確認が終わったらコミットする。GitHub.app で cloneしたならコミットもここでできる。
コミットが終わった。続いて github と同期を取る(git push する)。

完了。


github サイトで確認。でてる。

一旦 Fork してしまえば元のソースを気にせずカスタマイズができる。検証目的でいろいろコードを修正したい場合も便利。


[Mac] Lion から導入された XPC Services

2011年11月24日木曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

Mac OS X 10.7 から XPC Services という仕組みが導入された。

リファレンスによれば XPC Services は単一のアプリケーション専用に利用できる軽量なヘルパーツール(lightweight helper tools)と定義されている。アプリのバンドル内に組み込んで実行時に利用するのでこの点を見れば通常のライブラリと似ている。ライブラリと大きく異なるのは、XPC Services はアプリとは独立して動作していて、XPC Services がクラッシュしてもアプリに影響を与えない点。XPC Services は launchd管理下にあり、èµ·å‹•・停止の他、クラッシュした場合の再起動まで面倒見てくれる。こう見ると XPC Services はOS上のプロセスに近い(プロセスなのかまでは調べきれなかったがプロセス間通信と説明されているのでそうなんだと思う。Mac OS X で何か軽量なプロセスが用意されているのだろうか。)。

アプリが XPC Services を利用する場合は XPC Services API を利用する。このAPIは GCDをサポートしている。


XPC Services を使う用途として次の2点が挙げられている。
  1. 安定性の向上 〜 XPC Services が落ちてもアプリには影響を与えない。
  2. セキュリティの向上 〜 XPC Services毎にアクセス制御を細かく設定できて、アクセス可能な範囲を本体のアプリとは分離できる。Sandboxでの利用が想定されている。

Xcode4.2では XPC作成用のテンプレートが用意されている。
XPCを利用するには XPCをテンプレートから作成し、アプリに組み込めば良い。

以下はテンプレートから生成されたコード。
static void TestService_peer_event_handler(xpc_connection_t peer, xpc_object_t event) 
{
 xpc_type_t type = xpc_get_type(event);
 if (type == XPC_TYPE_ERROR) {
  if (event == XPC_ERROR_CONNECTION_INVALID) {
   // The client process on the other end of the connection has either
   // crashed or cancelled the connection. After receiving this error,
   // the connection is in an invalid state, and you do not need to
   // call xpc_connection_cancel(). Just tear down any associated state
   // here.
  } else if (event == XPC_ERROR_TERMINATION_IMMINENT) {
   // Handle per-connection termination cleanup.
  }
 } else {
  assert(type == XPC_TYPE_DICTIONARY);
  // Handle the message.
 }
}

static void TestService_event_handler(xpc_connection_t peer) 
{
 // By defaults, new connections will target the default dispatch
 // concurrent queue.
 xpc_connection_set_event_handler(peer, ^(xpc_object_t event) {
  TestService_peer_event_handler(peer, event);
 });
 
 // This will tell the connection to begin listening for events. If you
 // have some other initialization that must be done asynchronously, then
 // you can defer this call until after that initialization is done.
 xpc_connection_resume(peer);
}

int main(int argc, const char *argv[])
{
 xpc_main(TestService_event_handler);
 return 0;
一種のサーバとして動作するのでイベントが来たときの処理を書いていく。


アプリは XPC Services のconnectionç³» APIを使い、アプリと XPC間で通信を行う。以下は connection.h で定義されている関数。
xpc_connection_cancel
xpc_connection_create
xpc_connection_get_asid
xpc_connection_get_context
xpc_connection_get_egid
xpc_connection_get_euid
xpc_connection_get_name
xpc_connection_get_pid
xpc_connection_resume
xpc_connection_send_message
xpc_connection_send_message_with_reply
xpc_connection_send_message_with_reply_sync
xpc_connection_set_context
xpc_connection_set_event_handler
xpc_connection_set_finalizer_f
xpc_connection_set_target_queue
xpc_connection_suspend


参考情報


Mac OS X Technology Overview: Kernel and Device Drivers Layer
XPCの紹介


Daemons and Services Programming Guide: Designing Daemons and Services

XPCの概要


Daemons and Services Programming Guide: Creating XPC Services
XPC Services の利用説明


API Reference: XPC Services API Reference


App Sandbox Design Guide: App Sandbox in Depth
Sandbox での XPCの利用について。


- - - -
単一アプリ専用のプロセスを動かして利用するというアイディアは面白い。Sandbox での安全性を高めるのが目的と思われるが、うまく使えば再利用性の高い簡易サーバプロセスとして利用できそう。


新サイト「Cocoaの日々情報局」を開設しました

2011年11月21日月曜日 | Published in | 2 コメント

このエントリーをはてなブックマークに追加

サイトを新設しました。



最近このブログでiOSの開発情報提供を積極的にやってきましたが今後は「Cocoaの日々情報局」にその役割を移します。このブログ「Cocoaの日々」は前までのスタイル(開発日誌、検証情報や自作ライブラリの紹介など)に戻ります。

興味があれば新しいサイトをのぞいてみて下さい。
今後もよろしくお願いします。


[iOS] iOS5から追加された新しい通知の有無を判定する

2011年11月19日土曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

例えば UIKeyboardWillChangeFrameNotification の通知を受け取りたい。普通に NSNotificationCenter へ登録すればいいのだが、iOS 4 でこれを実行するとクラッシュする。
この通知は iOS5 から導入された新しいもので iOS4 に無いのが原因。この通知名は NSString* const で定義されている。
// UIWindow.h

UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification
     __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);

そこでこの定数の有無をチェックしたい。調べると Appleがドキュメントを出していた。

SDK Compatibility Guide: Using SDK-Based Development

この中に通知に関する記述がある(以下、引用)。
Check the availability of an external (extern) constant or a notification
name by explicitly comparing its address—and not the symbol’s bare name—to NULL or nil.

なるほど通知名のアドレスが NULLかどうかをチェックすれば良いらしい。さっきのコードはこう書ける。
if (&UIKeyboardWillChangeFrameNotification != NULL) {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWillChangeFrame:)
                                                     name:UIKeyboardWillChangeFrameNotification
                                                   object:nil];

通知シンボルの前にアドレスを表す & を付けるのがポイント。これを忘れるとやっぱり EXC_BAD_ADDRESS でクラッシュ。

- - - - -
上述の Apple のリファレンスには他にも互換性を保つための実装情報が載っていて参考になる。






[Info] Objective-C で Singleton Pattern

2011年11月18日金曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

+allocWithZone: までもオーバーライドしてとことんシングルトンにこだわった記事。大抵の場合ここまで必要は無いと思うがいつか役にたつかも。



参考情報


Cocoaの日々: [iOS][Mac] dispatch_once を使ったシングルトン

[Info] AFNetworking

| Published in | 0 コメント

このエントリーをはてなブックマークに追加

ポスト ASIHTTPRequest と注目されているネットワークライブラリ。


並列実行に NSOperation を使い Blocks を使った APIを提供している。

用意されているクラス、プロトコル、カテゴリの一覧
AFHTTPClient
AFHTTPRequestOperation
AFImageCache
AFImageRequestOperation
AFJSONRequestOperation
AFNetworkActivityIndicatorManager
AFPropertyListRequestOperation
AFURLConnectionOperation
AFXMLRequestOperation
Protocol References
AFMultipartFormData
UIImageView(AFNetworking)
基本となるHTTPアクセスの他、画像のキャッシュや JSON/XML/PropertyList処理なども用意されている。

以下、READMEから抜粋。
// JSON Request
NSURLRequest *request = [NSURLRequest requestWithURL:
    [NSURL URLWithString:@"https://gowalla.com/users/mattt.json"]];
AFJSONRequestOperation *operation =
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request
        success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
            NSLog(@"Name: %@ %@", [JSON valueForKeyPath:@"first_name"],
                   [JSON valueForKeyPath:@"last_name"]);
        } failure:nil];

NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[queue addOperation:operation];
データの種類ごと(上記例は JSON)に用意された AFHTTPRequestOperation を作成し、ここに Blocksで成功時の処理を書いておく。それを最後に NSOperationQueue へ投入するだけ。いくつかステップを踏む必要はあるが元々の NSOperationç³»APIを素直に活用しているので汎用性がある(あ、 JSONライブラリを別途用意する必要も無いのか)。

// Image Request
UIImageView *imageView = [[UIImageView alloc]
   initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"]
    placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];
URLから画像を取得して直接 UIImageViewを作成するメソッドもある。これは簡単でいいかも。

// File Upload with Progress Callback
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"avatar.jpg"], 0.5);
NSMutableURLRequest *request = [[AFHTTPClient sharedClient]
   multipartFormRequestWithMethod:@"POST" path:@"/upload"
   parameters:nil constructingBodyWithBlock: ^(id formData) {
  [formData appendPartWithFileData:data mimeType:@"image/jpeg" name:@"avatar"];
}];

AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc]
   initWithRequest:request] autorelease];
[operation setUploadProgressBlock:
  ^(NSUInteger totalBytesWritten, NSUInteger totalBytesExpectedToWrite) {
    NSLog(@"Sent %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite);
}];

NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[queue addOperation:operation];
POST/マルチパートによるファイルアップロード処理。簡潔でわかりやすい。setUploadProgressBlock: で進捗状況をハンドリング可能。

- - - -
比較的抽象度が高く複雑な記述なしに簡単に利用できそう。ASIHTTPRequest が機能を重ねていってAPIが肥大化気味で複雑になってしまったのに対し、よく使われる機能だけに的を絞ったある意味潔いシンプルなAPI思想が個人的には気に入った。実際に使って試してみたい。


参考情報


AFNetworking Reference
AFNetworking のリファンレンスマニュアル(appledoc)

iPhone アプリ開発コミュニティのネットワークライブラリが ASIHTTPRequest から AFNetworking への移行の流れ? - laiso - iPhoneアプリ開発グループ
...と、いうことらしい。ASIHTTPRequest のメンテが終了とは知らなかった。うーむ。

人気があるのは確かなようで GitHub の Weekly/Monthly Most Wached Project としても最近上位に来ている。
watch と fork は 1,283 123 と ASIHTTPRequest にはまだ及ばないものの相当数ある。

Gowalla Engineering / AFNetworking: A Delightful Networking Library for iOS and Mac OS X

AFNetworkingの解説記事。


[Info] アプリ紹介サイトを作る時に参考になる情報

| Published in | 0 コメント

このエントリーをはてなブックマークに追加

よく出来たアプリのサイトが60ほど紹介されている。

どのサイトも綺麗にできてる。
アプリ用のサイトを作る時の参考になる。

[Info] ネットワーク接続状況検出ライブラリ

2011年11月17日木曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

Abizern/NPReachability - GitHub


Blocks、KVOに対応。また ARCにも対応している。

typedef void (^ReachabilityHandler)(NPReachability *curReach);
- (id)addHandler:(ReachabilityHandler)handler;

@property (nonatomic, readonly, getter=isCurrentlyReachable) BOOL currentlyReachable;
@property (nonatomic, readonly) SCNetworkReachabilityFlags currentReachabilityFlags;

接続状況が変化した時に handerで定義した Blocksが実行される。引数に NPReachability を取り、接続・非接続の判断は currentlyReachableプロパティ、接続の種類(状況)は currentReachabilityFlagsプロパティで取得できる。

非常にシンプルで最低限の APIだけが提供されていてなかなかいい。


参考情報


Cocoaの日々: [iOS] ネットワーク接続状況取得ライブラリを公開
こちらも参考にどうぞ。



[Info] 日本語による ARC の紹介記事

| Published in | 0 コメント

このエントリーをはてなブックマークに追加

@natsun_happy さんによる ARCの解説。


ARCの基本的なところが押さえられているのでこの記事でひと通りの知識が得られる。

また図による説明がとてもわかりやすい。

- - - -
日本語での解説はうれしいし、
なによりも @natsun_happy さんの文章は読みやすいくてわかりやすい。
今後も期待。


[Info] iPhone版Safariのようなページ切替ビュー

| Published in | 0 コメント

このエントリーをはてなブックマークに追加


iPhone版Safariのようなページ切替ビュー。こんなやつ。
ページを挿入・削除するとアニメーションが起こる。

タップするとアニメーションして画面にフィットする。画面上部にヘッダビューを付けてカスタマイズすることができる。

使い方は、まずHGPageScrollView を作りメインのビューへ貼る。
HGPageScrollView *pageScrollView =
   [[[NSBundle mainBundle] loadNibNamed:@"HGPageScrollView" owner:self options:nil] objectAtIndex:0];

[self.view addSubview:pageScrollView];
サンプルではページの定義を XIBファイルで行っていた。XIBで定義すれば容易にカスタマイズできる。

後は Data Source/Delegate を実装すればいい。
@protocol HGPageScrollViewDataSource 
@required
// Page display. Implementers should *always* try to reuse pageViews by setting each page's reuseIdentifier. 
// This mechanism works the same as in UITableViewCells.  
- (HGPageView *)pageScrollView:(HGPageScrollView *)scrollView viewForPageAtIndex:(NSInteger)index;

@optional

- (NSInteger)numberOfPagesInScrollView:(HGPageScrollView *)scrollView;   // Default is 1 if not implemented

// you should re-use the UIView that you return here, only initialize it with appropriate values. 
- (UIView *)pageScrollView:(HGPageScrollView *)scrollView headerViewForPageAtIndex:(NSInteger)index;  

- (NSString *)pageScrollView:(HGPageScrollView *)scrollView titleForPageAtIndex:(NSInteger)index;  
- (NSString *)pageScrollView:(HGPageScrollView *)scrollView subtitleForPageAtIndex:(NSInteger)index;  

@end

@protocol HGPageScrollViewDelegate

@optional

// Dragging
- (void) pageScrollViewWillBeginDragging:(HGPageScrollView *)scrollView;
- (void) pageScrollViewDidEndDragging:(HGPageScrollView *)scrollView willDecelerate:(BOOL)decelerate;

// Decelaration
- (void)pageScrollViewWillBeginDecelerating:(HGPageScrollView *)scrollView;
- (void)pageScrollViewDidEndDecelerating:(HGPageScrollView *)scrollView;

// Called before the page scrolls into the center of the view.
- (void)pageScrollView:(HGPageScrollView *)scrollView willScrollToPage:(HGPageView*)page atIndex:(NSInteger)index;

// Called after the page scrolls into the center of the view.
- (void)pageScrollView:(HGPageScrollView *)scrollView didScrollToPage:(HGPageView*)page atIndex:(NSInteger)index;

// Called before the user changes the selection.
- (void)pageScrollView:(HGPageScrollView *)scrollView willSelectPageAtIndex:(NSInteger)index;
- (void)pageScrollView:(HGPageScrollView *)scrollView willDeselectPageAtIndex:(NSInteger)index;

// Called after the user changes the selection.
- (void)pageScrollView:(HGPageScrollView *)scrollView didSelectPageAtIndex:(NSInteger)index;
- (void)pageScrollView:(HGPageScrollView *)scrollView didDeselectPageAtIndex:(NSInteger)index;

@end


よく出来てる。見た目がなかなかいい。


[Info] 標準アプリ、フレームワークで使用されている画像を抽出する

2011年11月16日水曜日 | Published in | 2 コメント

このエントリーをはてなブックマークに追加

標準アプリ、フレームワークで使用されている画像を抽出するツール。


標準アプリ、フレームワークの画像

絵文字

プライベートAPI(UIGlassButton)を利用してボタン画像を生成するツール

シミュレータで実行して保存ボタンを押すと Mac上に画像一式が保存される。


なおシミュレータのデバイスを iPhone(Retina)で実行すると Retina用の解像度でファイルが保存される(@2x)。


[Info] Core Data 用 Active Record ライブラリ

| Published in | 0 コメント

このエントリーをはてなブックマークに追加

Ruby on Rails の Active Record にインスパイアされて作成されたライブラリ。Core Data をベースに Active Record 相当の APIを提供する。


Rails の Active Record ライクな APIが提供されている。以下 READMEからの転載。
NSArray *people = [Person findAll];
NSArray *peopleSorted = [Person findAllSortedByProperty:@"LastName" ascending:YES];
Person *person = [Person findFirstByAttribute:@"FirstName" withValue:@"Forrest"];

フェッチ
結果をブロックで処理できる。
[[Person findAll] each:^(Person* p) {
    NSLog(@"Found %@",p.name);
}];
NSArray* fatherArray = [[Person findAll] map:^id(Person* p) {
    return p.father;
}];
[fatherArray each:^(Person* p) {
    NSLog(@"Found %@",p.name);
}];

レコードの作成
Person *myNewPersonInstance = [Person createEntity];

レコードの削除
Person *p = ...;
[p  deleteEntity];

別スレッド実行用のメソッドもあり。専用の NSManagedContextObjectをスレッド毎に用意して処理している。
+ (void) performSaveDataOperationWithBlock:(CoreDataBlock)block;
+ (void) performSaveDataOperationInBackgroundWithBlock:(CoreDataBlock)block;

これまたブロック構文も用意されている(便利)。
typedef void (^CoreDataBlock)(NSManagedObjectContext *);

- - - -
結構便利なメソッドが提供されているので、Core Data を使う場合に利用を検討したい。






[Info] 写真ライブラリから複数画像を選択できるライブラリ

| Published in | 0 コメント

このエントリーをはてなブックマークに追加


サンプルの実行例。こんな感じで複数選択できる。

選択結果はデリゲートで受け取れる。
@interface ELCImagePickerController : UINavigationController {

 id delegate;
}

@property (nonatomic, assign) id delegate;

-(void)selectedAssets:(NSArray*)_assets;
-(void)cancelImagePicker;

@end

@protocol ELCImagePickerControllerDelegate

- (void)elcImagePickerController:(ELCImagePickerController *)picker
     didFinishPickingMediaWithInfo:(NSArray *)info;
- (void)elcImagePickerControllerDidCancel:(ELCImagePickerController *)picker;

アルバムの選択用のクラスも用意されている。

@interface ELCAlbumPickerController : UITableViewController {
 
 NSMutableArray *assetGroups;
 NSOperationQueue *queue;
 id parent;
    
    ALAssetsLibrary *library;
}

@property (nonatomic, assign) id parent;
@property (nonatomic, retain) NSMutableArray *assetGroups;

-(void)selectedAssets:(NSArray*)_assets;

@end

悪くない。

[Info] ノンブロッキング/非同期処理ライブラリ - libuv

2011年11月15日火曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

nodejs用に作られたもので WindowsのIOCP、Unix上の libenvをラップしている。Non-blocking TCP sockets ã‚„ Asynchronous DNS など標準では用意されていない便利な APIが提供されている。

joyent/libuv - GitHub

以下、Features を転載
  • Non-blocking TCP sockets
  • Non-blocking named pipes
  • UDP
  • Timers
  • Child process spawning
  • Asynchronous DNS via c-ares or uv_getaddrinfo.
  • Asynchronous file system APIs uv_fs_*
  • High resolution time uv_hrtime
  • Current executable path look up uv_exepath
  • Thread pool scheduling uv_queue_work
  • ANSI escape code controlled TTY uv_tty_t
  • File system events Currently supports inotify, ReadDirectoryChangesW and kqueue. Event ports in the near future. uv_fs_event_t
  • IPC and socket sharing between processes uv_write2

ネタ元はここ。
iOS 対応のパッチを提供してくれたとのこと。いいね。


[Info] UIView の contentStrecth による変形記事の紹介

| Published in | 0 コメント

このエントリーをはてなブックマークに追加

contentStretch を使った画像変形の解説。図入りでわかりやすい


例えばこんな設定をすると
imageView.frame = CGRectMake(10.0, 10.0, imageSize.width*1.2, imageSize.height); 
円形がこのように変形する。



[Info] iOS5から導入された Core Image のチュートリアル

| Published in | 0 コメント

このエントリーをはてなブックマークに追加


フィルタの適用や、適用後の画像をフォトアルバムへ書きだす方法などが説明されている。


(ネタ元)Twitter / @natsun_happy: Beginning Core Image in iO ...


[Info] メールアドレスピッカーライブラリ

2011年11月14日月曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

アドレス帳からメールアドレスを取得する簡易ライブラリ。利用しなくてもソースコードが参考になる(かも)。



[Info] 特定のファイルをiCloudバックアップ対象外にする

| Published in | 0 コメント

このエントリーをはてなブックマークに追加

iOS 5.0.1 から指定したファイルを iCloud および iTunes バックアップから除外できるようになった。その方法の紹介と関連してデータの種類毎の格納場所、バックアップの扱いの説明など。



データカテゴリ


データの用途によって4つのカテゴリが挙げられている。

カテゴリ用途ディレクトリバック
アップ対象
Critical Dataユーザが作成するデータ
または
再作成ができないデータ
Documents
Cached Data再ダウンロード
または
再作成が可能なデータ
Library/Caches×
Temporary Data使用期間の短い一時的な
データで保存が不要なデータ
tmp×
Offline Dataオフライン時に
利用するデータ
Documents または
Library/Private Documents
かつ拡張属性付与


拡張属性 "do not backkup"


iOS5.0.1 よりファイルに 拡張属性 "do not backup" を付与することで特定のファイルを iCloud/iTunesバックアップの対象外にできる。以下は Technical Q&A からの転載。
#include <sys/xattr.h>
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    const char* filePath = [[URL path] fileSystemRepresentation];
 
    const char* attrName = "com.apple.MobileBackup";
    u_int8_t attrValue = 1;
 
    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
    return result == 0;
}
拡張属性が認識されるのは iOS5.0.1以降。それ以前は機能しない(つまりバックアップされる)。


参考情報


setxattr(2) Mac OS X Developer Tools Manual Page

setxattr関数のマニュアル

[Info] BlocksKit

| Published in | 0 コメント

このエントリーをはてなブックマークに追加

Foundation ã‚„ UIKit ライブラリの様々なクラスのメソッドを blocks 化したライブラリ。 iOS 4.0+ 、 Mac OS X 10.6+ で利用可能。


以下、READMEより転載。

What's In The Box

  • Performing blocks on an NSObject.
  • Key-value observation () with block handlers.
  • Associated objects in an Obj-C API. (Not directly block-related.)
  • NSArray, NSSet, NSDictionary, and NSIndexSet filtering and enumeration.
  • Macros for more quickly typing out the above.
  • NSInvocation creation using a block.
  • NSTimer block execution.
  • Both delegation and block callbacks on NSURLConnection.
  • Delegate callback for NSCache.

UIKit Extensions
  • UIAlertView, UIActionSheet with block callbacks and convenience methods.
  • Block initializers for UIControl and UIBarButtonItem
  • Block-backed initializers for UIGestureRecognizer.
  • On-touch utilities for UIView.
  • Block callbacks for MFMailComposeViewController and MFMessageComposeViewController.
  • Delegate alternative for UIWebView.
これはいい。ちょっとした処理を書くのにいちいちメソッドを起こさなくて済む。本来は Appleが提供して欲しいものだが。
リファレンスマニュアルが appledoc形式で提供されている。
BlocksKit Reference

以下、リファレンスから少し抜粋してみる。

UIActionSheet(BlocksKit)
UIActionSheet *testSheet = [UIActionSheet sheetWithTitle:@"Please select one."];
 [testSheet addButtonWithTitle:@"Zip" handler:^{ NSLog(@"Zip!"); }];
 [testSheet addButtonWithTitle:@"Zap" handler:^{ NSLog(@"Zap!"); }];
 [testSheet addButtonWithTitle:@"Zop" handler:^{ NSLog(@"Zop!"); }];
 [testSheet setDestructiveButtonWithTitle:@"No!" handler:^{ NSLog(@"Fine!"); }];
 [testSheet setCancelButtonWithTitle:nil handler:^{ NSLog(@"Never mind, then!"); }];
 [testSheet showInView:self.view];

NSObject(BlocksKit)
[object performBlock:^(){
  [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
} afterDelay:0.5f];


UIGestureRecognizer もある。
UIGestureRecognizer(BlocksKit)
UITapGestureRecognizer *singleTap = [UITapGestureRecognizer recognizerWithHandler:^(id sender) {
     NSLog(@"Single tap.");
 } delay:0.18];
 [self addGestureRecognizer:singleTap];


- - - -
かなり便利なので、いったん使い始めたら以後このライブラリ無しではコーディングできなくなりそうで怖い。。

[Info] AppStoreからインストールしたアプリのデバッグ

| Published in | 0 コメント

このエントリーをはてなブックマークに追加

AppStore ã‚„ AdHocビルドからインストールしたアプリのデバッグ方法の説明。


iPhoneとMacを接続して Xcodeのオーガナイザを使うと、iPhoneのコンソール出力やアプリがクラッシュした時のログが取得できる。

クラシュログは iTunes経由で取得できるのでユーザに依頼してファイルを入手することも可能。以下はOS毎のログの置き場所。

またユーザが許可すればクラッシュレポートが Appleのサーバへ送られ、開発者は iTunes Connect で見ることができる。


人気の投稿(過去 30日間)