▼iPhoneプログラミングメモ▼
ユーティリティ

システム
//乱数シード
+ (void)srand {
    srand(time(0));
}

//乱数の取得
+ (int)rand:(int)num {
    return abs(arc4random())%num;
}

//現在時刻の取得
+ (double)currentTimeMillis {
    return (double)[[NSDate date] timeIntervalSince1970];
}

//年月日の取得(cal.year/month/day/hour/minute)
+ (NSDateComponents*)calendar {
	NSDate *date=[[[NSDate alloc] init] autorelease];
	NSCalendar *gregorian=[[[NSCalendar alloc] 
	    initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
	unsigned int unitFlag=NSMonthCalendarUnit|NSDayCalendarUnit|
	NSYearCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit;
	return [gregorian components:unitFlag fromDate:date];
}

アプリケーション
//URLスキームのオープン
+ (void)openURL:(NSString*)url {
    [[UIApplication sharedApplication] openURL:
        [NSURL URLWithString:url]];
}

//インジケーターの指定
+ (void)setIndicator:(BOOL)indicator {
    [UIApplication sharedApplication].
        networkActivityIndicatorVisible=indicator;
}

//自動ロックの指定
+ (void)setAutoLock:(BOOL)autoLock {
    [[UIApplication sharedApplication] 
        setIdleTimerDisabled:autoLock];
}

//ステータスバーの指定
+ (void)setStatusBar:(BOOL)statusBar {
    [UIApplication sharedApplication].
        statusBarHidden=!statusBar;
}

アプリ URLスキーム
Safari http://
https://
ftp://
通話 tel:123456789
SMS sms:12345689
メール mailto:npaka0@npaka.net?cc=npaka1@npaka.net&subject=Test&body=This%20is%20Test!

地図

maps://

デバイス
//システムバージョンの取得
+ (NSString*)systemVersion {
    return [[UIDevice currentDevice] systemVersion];
}

//バッテリ状態の取得
+ (UIDeviceBatteryState)batteryState {
    [UIDevice currentDevice].batteryMonitoringEnabled=YES;
    return [UIDevice currentDevice].batteryState;
}

//UIView→UIImage
- (UIImage*)view2image:(UIView*)view {
    UIGraphicsBeginImageContext(view.frame.size);
    CGContextRef c=UIGraphicsGetCurrentContext();
    [view.layer renderInContext:c];
    UIImage* image=UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

文字列
//Trim
+ (NSString*)trim:(NSString*)str {
    return [str stringByTrimmingCharactersInSet:
        [NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

//文字列の前方一致検索
+ (int)indexOf:(NSString*)str c:(NSString*)c {
    NSRange range=[str rangeOfString:c];
    if (range.location==NSNotFound) return -1;
    return range.location;
}

//文字列の後方一致検索
+ (int)lastIndexOf:(NSString*)str c:(NSString*)c {
    NSRange range=[str rangeOfString:c 
        options:NSCaseInsensitiveSearch|NSBackwardsSearch];
    if (range.location==NSNotFound) return -1;
    return range.location;
}

//文字列→データ
+ (NSData*)str2data:(NSString*)str {
    return [str dataUsingEncoding:NSUTF8StringEncoding];
}

//データ→文字列
+ (NSString*)data2str:(NSData*)data {
    return [[[NSString alloc] initWithData:data 
        encoding:NSUTF8StringEncoding] autorelease];
}

//URLエンコード
+ (NSString*)urlencode:(NSString*)str {
    NSString* result=(NSString*)CFURLCreateStringByAddingPercentEscapes(
        kCFAllocatorDefault,(CFStringRef)str,NULL,
        CFSTR(";,/?:@&=+$#!"),kCFStringEncodingUTF8);
    return [result autorelease];
}

ファイル操作

//ファイル一覧の取得
+ (NSArray*)fileNames:(NSString*)fileName {
    NSString* path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
	path=[path stringByAppendingPathComponent:fileName]; 
	return [[NSFileManager defaultManager] directoryContentsAtPath:path];
}

//ファイル・ディレクトリが存在するか
+ (BOOL)existsFile:(NSString*)fileName {
    NSString* path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
	path=[path stringByAppendingPathComponent:fileName]; 
	return [[NSFileManager defaultManager] fileExistsAtPath:path];
}

//ディレクトリの生成
+ (void)makeDir:(NSString*)fileName {
    if ([Util existsFile:fileName]) return;
    NSString* path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
	path=[path stringByAppendingPathComponent:fileName]; 
	[[NSFileManager defaultManager] createDirectoryAtPath:path attributes:nil];
}

//ファイル・ディレクトリの削除
+ (void)removeFile:(NSString*)fileName {
    if (![Util existsFile:fileName]) return;
    NSString* path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
	path=[path stringByAppendingPathComponent:fileName]; 
	[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
}

//データ→ファイル
+ (BOOL)data2file:(NSData*)data fileName:(NSString*)fileName {
    NSString* path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
	path=[path stringByAppendingPathComponent:fileName]; 
	return ([data writeToFile:path atomically:YES]);
}

//データ→ファイル(追加)
+ (BOOL)data2file_add:(NSData*)data fileName:(NSString*)fileName {
    NSString* path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
	path=[path stringByAppendingPathComponent:fileName]; 
    NSFileHandle* fh=[NSFileHandle fileHandleForWritingAtPath:path];
    if (fh) {
        @try {
            [fh seekToEndOfFile];
            [fh writeData:data];   
            [fh closeFile];   
            return YES;
         }
         @catch(id error) {
         }
    }
    return NO;
}

//ファイル→データ
+ (NSData*)file2data:(NSString*)fileName {
    NSString* path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
	path=[path stringByAppendingPathComponent:fileName]; 
	return [[[NSData alloc] initWithContentsOfFile:path] autorelease]; 
}

//ファイル→データ(部分)
+ (NSData*)file2data:(NSString*)fileName offset:(unsigned long long)offset 
    length:(unsigned long long)length {
    NSString* path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
	path=[path stringByAppendingPathComponent:fileName]; 
    NSFileHandle* fh=[NSFileHandle fileHandleForReadingAtPath:path];
    NSData* data;
    if (fh) {
        @try {
            [fh seekToFileOffset:offset];
            data=[fh readDataOfLength:length];
            [fh closeFile];   
            return data;
         }
         @catch(id error) {
         }
    }
    return nil;
}

//リソース→データ
+ (NSData*)res2data:(NSString*)res {
    NSBundle* mainBundle=[NSBundle mainBundle];
    NSString* path=[mainBundle pathForResource:res ofType:@""];
    return [NSData dataWithContentsOfFile:path];
}

//リソース→データ(部分)
+ (NSData*)res2data:(NSString*)res offset:(unsigned long long)offset 
    length:(unsigned long long)length {
    NSString* path=[[NSBundle mainBundle] pathForResource:res ofType:@""];
    NSFileHandle* fh=[NSFileHandle fileHandleForReadingAtPath:path];
    NSData* data;
    if (fh) {
        @try {
            [fh seekToFileOffset:offset];
            data=[fh readDataOfLength:length];
            [fh closeFile];   
            return data;
         }
         @catch(id error) {
         }
    }
    return nil;
}

//リソース→ファイル
+ (BOOL)res2file:(NSString*)res fileName:(NSString*)fileName {
    NSString* from=[[NSBundle mainBundle] pathForResource:res ofType:@""];
    NSString* to=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
	to=[to stringByAppendingPathComponent:fileName];        
    [[NSFileManager defaultManager] copyItemAtPath:from toPath:to error:nil];
    return YES;
}

リソースのHTMLの読み込み
//リソース→データ
- (NSData*)res2data:(NSString*)res {
    NSString* file=[[NSBundle mainBundle] pathForResource:res ofType:@""];
    return [NSData dataWithContentsOfFile:file];
}

//データ→文字列
- (NSString*)data2str:(NSData*)data {
    return [[[NSString alloc] initWithData:data 
        encoding:NSUTF8StringEncoding] autorelease];
}

//Webビューの更新
- (void)updateWebView:(UIWebView*)webView res:(NSString*)res {
    NSData*   data=[self res2data:res];
    NSString* html=[self data2str:data];
    NSString* path=[[NSBundle mainBundle] resourcePath];
    path=[path stringByReplacingOccurrencesOfString:@"/" withString:@"//"];
    path=[path stringByReplacingOccurrencesOfString:@" " withString:@"%20"];    
    path=[NSString stringWithFormat:@"file:/%@//",path];
    [webView loadHTMLString:html baseURL:[NSURL URLWithString:path]];
}

システムファイルのHTMLの読み込み
//ファイル→データ
- (NSData*)file2data:(NSString*)fileName {
    NSString* path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    path=[path stringByAppendingPathComponent:fileName]; 
    return [[[NSData alloc] initWithContentsOfFile:path] autorelease]; 
}

//データ→文字列
- (NSString*)data2str:(NSData*)data {
    return [[[NSString alloc] initWithData:data 
        encoding:NSShiftJISStringEncoding] autorelease];
}

//Webビューの更新
- (void)updateWebView:(UIWebView*)webView fileName:(NSString*)fileName {
    NSString* path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
	path=[path stringByAppendingPathComponent:fileName]; 
    path=[path stringByReplacingOccurrencesOfString:@"/" withString:@"//"];
    path=[path stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
    NSData* data=[Util file2data:path];
    NSString* html=[Util data2str:data];
    [webView loadHTMLString:html baseURL:[NSURL URLWithString:
        [NSString stringWithFormat:@"file:/%@//",path]]];
}

非同期通信
//HTTP通信
- (void)http2data:(NSString*)url {
    NSURLRequest* request=[NSURLRequest requestWithURL:[NSURL URLWithString:url]];
    [NSURLConnection connectionWithRequest:request 
        delegate:self];
}

//サーバからのレスポンス受信時に呼ばれる
- (void)connection:(NSURLConnection*)connection
    didReceiveResponse:(NSURLResponse*)response {
    _data=[[NSMutableData data] retain];
}

//サーバからデータ受信時に呼ばれる
- (void)connection:(NSURLConnection*)connection
    didReceiveData:(NSData*)data {
    [_data appendData:data];
}

//ダウンロード完了時に呼ばれる
- (void)connectionDidFinishLoading:(NSURLConnection*)connection {
    _textField.text=[self data2str:_data];
    [_data release];
    _data=nil;
}

バイブレーション
//バイブレーション
+ (void)vibrate {
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}


−戻る−