ミリ秒の計測を行う

1
2
3
4
5
6
7
8
9
// 時間計測を開始する
NSDate *startTime = [NSDate date];
 
// 時間計測する処理を行う
 
// 経過時間を計測する
NSTimeInterval elapsedTime = [startTime timeIntervalSinceNow];
NSString *elapsedTimeString = [NSString stringWithFormat:@"Elapsed time: %f 秒", -elapsedTime];
LOG(@"%@", elapsedTimeString);

Viewイメージをキャプチャーし、PNG画像で保存する

画面に表示されていないビューのキャプチャーを行う。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// UIImage を PNG画像データへ変換する
+ (BOOL)saveUIImage2PNG:(UIImage *)image FileName:(NSString *)fileName
{
    NSData *data = UIImagePNGRepresentation(image);  
    NSString *pngFilePath = [NSString stringWithFormat:@"%@/%@.png", [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"], fileName];  
    NSLog(@"%@", pngFilePath);
 
    BOOL result;
    if ([data writeToFile:pngFilePath atomically:YES]) {
        result = YES;
    } 
    else {
        result = NO;
    }
 
    return result;
}
 
// Viewイメージをキャプチャーする
// 備考: 画面に表示していなくてもキャプチャーできる
+ (UIImage *)captureViewImage:(UIView *)view 
{   
    UIImage *capture; 
 
    UIGraphicsBeginImageContext(view.bounds.size);
 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    capture = UIGraphicsGetImageFromCurrentImageContext();
 
    UIGraphicsEndImageContext();
 
    return capture;
}

CoreData マイグレーション

CoreData のマイグレーションの手順は、以下の通り。

1. モデルバージョンを追加し、モデルを変更する
2. Mapping Model を追加する
3. マイグレーションコードを追加する
– (NSPersistentStoreCoordinator *)persistentStoreCoordinator メソッドにマイグレーションの指定を行う処理を追加する

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 Returns the persistent store coordinator for the application.
 If the coordinator doesn't already exist, it is created and the application's store added to it.
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }
 
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataSample.sqlite"];
 
    // マイグレーションの指定
	NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
							 [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
							 [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
 
    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
    {

iPad ライブラリ

– iPad で、縦横画面で2ペインを実現できる (UISplitViewController 代替)
UISplitViewController を適用しただけでは、デバイスが縦向きの場合はポップオーバーされ、横向きの場合のみ2ペイン構成とされる。
MGSplitViewController は、デバイスの向きが縦横の場合も容易に2ペインが実現でき、root と detail の入れ替え、分割方向も垂直平行と切り換えられる。

Matt Legend Gemmell
MGSplitViewController for iPad

iPhone からサーバへhttp通信でファイルアップロードする方法

サーバ側 PHPプログラム
※ 本PHPプログラムは、ファイル名: file_upload.php とする。
※ 本PHPプログラムのディレクトリ配下に”files”ディレクトリを作成しておく。
アップロードされるファイルは、filesディレクトリ配下に作成される。

1
2
3
4
5
6
7
8
9
10
11
12
<?php                                                                                                                         
$target_path = "files/";
 
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
 
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { 
    echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded"; 
} 
else{ 
    echo "There was an error uploading the file, please try again!"; 
}
?>

クライアント側プログラム
※ ASIHTTPRequest (http://allseeing-i.com/ASIHTTPRequest/)からライブラリ取得する。
iOS用サンプル プログラムの以下の箇所を変更し動作させる。
※ pathForResource メソッドでパスが取得できない場合、プロジェクトの登録情報が不正な場合がある。
問題のリソースファイルを再度、プロジェクトに登録し直せば解決する場合が多い。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@implementation UploadViewController
 
- (IBAction)performLargeUpload:(id)sender
{
    // 以下、ファイルアップロード検証用コード    
    [request cancel];
 
    // 上記のphpプログラムURL
    NSURL *url = [NSURL URLWithString:@"http://xxxxxx/file_upload.php"]; 
    [self setRequest:[ASIFormDataRequest requestWithURL:url]];
 
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0
    [request setShouldContinueWhenAppEntersBackground:YES];
#endif
 
    NSBundle *bundle = [NSBundle mainBundle];
    // アップロードテストするファイル
    NSString *pathUploadFile = [bundle pathForResource:@"info" ofType:@"png"];
    NSLog(@"%@", pathUploadFile);
    [request setFile:pathUploadFile forKey:@"uploadedfile"];
 
    [request setUploadProgressDelegate:progressIndicator];
    [request setDelegate:self];
    [request setDidFinishSelector:@selector(uploadFinished:)];
    [request setDidFailSelector:@selector(uploadFailed:)];
 
    [request startAsynchronous];
 
    [resultView setText:@"Uploading data..."];
 
// ↑ファイル アップロード検証用コード

shareKitを利用するための手順

iPhone アプリから twitter 連携を行い、メッセージ投稿・画像投稿を実装する場合、shareKit が良いかなと思います。
(メッセージ投稿を実装できるライブラリは他にもありますが、画像投稿ができなかったりするようです。)
以下、利用するための手順です。

twitter APIを取得(画像投稿も行う場合、bitly APIも取得)
shareKit の SHKConfig.h にAPI登録で取得した情報を設定する

twitter api 登録は以下のURLから行う
twitter api登録

api 登録を行い、以下の情報を入手する
– API Key
– Consumer Key
– Consumer secret

bitly 登録は以下のURLから行う
bitly登録

api 登録を行い、以下の情報を入手する
ー API Key

上記の情報を SHKConfig.h に設定する

twitter API 登録時の注意点
アプリケーションの種類は、「ブラウザアプリケーション」を選択すること
コールバックは、「shareKitのヘッダに登録するURLと同じ」にすること
標準のアクセスタイプは、「Read & Write」を選択すること
xAuth 認証を行う場合、別途申請が必要となる
(SHKConfig.h のコメントとして注意点が記載されています)

実装の注意点
shareKit ライブラリは、通信中に画面の連続タップなどをブロックする処理がありません。
不要なイベントをブロックする処理を追加する必要があります。
shareKit ライブラリは画面の回転に対応していますが、回転に対応する必要がないアプリの場合、回転をしない様にコードを変更する必要があります。(当然ですね。。。(・_・)(._.))
twitter ログイン処理に関してもキャンセル後、通信を中断する処理がありません。
通信を中断する処理を追加する必要があります。

NSOperationQueue の処理が実行できない場合

非同期通信を行う場合、NSOperation, NSOperationQueue を利用するかと思いますが、なぜか動かない…と調査したところ、iOS 4より NSOperationQueue の仕様が変更されているとのこと。
以下の様にすることで iOS 4 でも動作しました。

しかしながら、iOS 4 で動作するコードは、iPad 3.2 Simulator では問題があるようなので、respondsToSelector で判断し、処理を変更する必要があるみたいです。

1
2
3
// iOS4 からメッソドが変更され、メインスレッドに明示的に関連づける必要がある
//    _queue = [[NSOperationQueue alloc] init];
_queue = [NSOperationQueue mainQueue];

ユニークな識別子を作成する

1
2
3
4
5
    // ユニークな識別子を作成する
    CFUUIDRef uuid;
    uuid = CFUUIDCreate(NULL);
    _identifier = (NSString*)CFUUIDCreateString(NULL, uuid);
    CFRelease(uuid);