プロフィール

pikab1

Author:pikab1
ただのチキンプログラマです。よろしく。


個人で作ったアプリ

AkiyoshiFan AkiyoshiFan ハンター文字 まとめDL

初/中級開発者におすすめ


カテゴリ


Twitter


月別アーカイブ


最新トラックバック


最新コメント


検索フォーム

ブロとも申請フォーム

QRコード

QR

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


Objective-Cでファイルの一部分のデータを取得する

ファイルから一部分のデータだけ取得します。
ObjCでは標準で用意されていないので、Cを使って書きました。
NSInputStreamでも実装可能ですが、こちらもoffsetを指定できず、lengthだけなので、前から順にロードして希望の位置までスキップする必要があったのでいけてないなと思ってやめました。

// 1024byteの位置から500byte分だけ取得する
NSData *data = [NSData dataWithContentsOfFile:path atOffset:1024 withSize:500];

+ (NSData *) dataWithContentsOfFile:(NSString *)path atOffset:(off_t)offset withSize:(size_t)bytes
{
FILE *file = fopen([path UTF8String], "rb");
if(file == NULL)
return nil;

fpos_t fsize = 0;
fseeko(file, 0, SEEK_END);
fgetpos(file, &fsize);

fpos_t diff = fsize - offset;
if (diff < bytes) {
bytes = diff;
}

void *data = malloc(bytes);
fseeko(file, offset, SEEK_SET);
fread(data, 1, bytes, file);

fclose(file);

NSData *result = [NSData dataWithBytes:data length:bytes];

free(data);

return result;
}

AddressBook.frameworkのiOS6対応

iOS6からプライバシー設定が追加されました。

今まで連絡帳に普通にアクセスできましたが、iOS6からはユーザ側に連絡帳のアクセス許可を求めて、許可が貰えればアクセスできるようになりました。

つまり、実装方法によっては、許可を貰った時点で既に連絡帳の取得処理を通過してしまっていて、初回時のみ連絡帳データを保持していない状態になってしまいます。

・もちろん一回アプリのタスクを切れば問題ないです。
・プライバシ設定から「許可」「拒否」の設定を変更するとアプリが再起動されます。

ここから本題ですが、iOS6からそれに対応できるようにメソッドがいくつか追加されています。

Added ABAddressBookCreateWithOptions()
Added ABAddressBookGetAuthorizationStatus()
Added ABAddressBookRequestAccessCompletionHandler
Added ABAddressBookRequestAccessWithCompletion()
Added ABAuthorizationStatus
Added CF_ENUM() (no architecture available)
Added kABAuthorizationStatusAuthorized
Added kABAuthorizationStatusDenied
Added kABAuthorizationStatusNotDetermined
Added kABAuthorizationStatusRestricted
Added kABOperationNotPermittedByUserError

Handlerとかがあるので大体分かると思いますが、

ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) {

こんな感じで許可を得てから連絡帳にアクセスするようになります。
まぁGPSの許可を得る時とかと同じイメージですね。
今までのABAddressBookCreate()は非推奨になりました。


ソースコードもざらっと抜粋して書いときます。

if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined) { // 未設定
ABAddressBookRef book;
ABAddressBookRequestAccessWithCompletion(book, ^(bool granted, CFErrorRef error) {

});
} else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted ||
ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied) { // 拒否
UIAlertView *alert =
[[UIAlertView alloc] initWithTitle:@"お知らせ" message:@"連絡先へのアクセスが禁止されています。\n設定>プライバシー>連絡先から、アクセスの設定を\"オン\"に変更してください。"
delegate:self cancelButtonTitle:@"確認" otherButtonTitles:nil];
[alert show];
[alert release];
return;
} else if (ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized) { // 許可

}


もちろん
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0) {
も忘れずに。

iOS6の画面回転対応

iOS6で「shouldAutorotateToInterfaceOrientation」メソッドが非推奨になりました。
非推奨というか完全に呼ばれなくなりました。
以下のリンク参照

Deprecated UIViewController Methods

以下、変更点のソースコードだけ書く。

//=====================
// AppDelegate.m
//=====================

//navigationController = [[UINavigationController alloc] initWithRootViewController:controller];
navigationController = [[CustomNavigationController alloc] initWithRootViewController:controller];

//[window addSubview:navigationController.view];
self.window.rootViewController = navigationController;

//=====================
// CustomNavigationController
//=====================

- (NSUInteger)supportedInterfaceOrientations{
return self.topViewController.supportedInterfaceOrientations;
}

- (BOOL)shouldAutorotate {
return self.topViewController.shouldAutorotate;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return self.topViewController.preferredInterfaceOrientationForPresentation;
}

//=====================
// それぞれのビューコントローラー
//=====================

// ios6 サポート向き
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}

// ios6 ロテート許可
- (BOOL)shouldAutorotate {
return YES;
}

// ios6 初期向き
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return UIInterfaceOrientationPortrait;
}

// ios5 ロテート許可
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation {
return YES;
}


今現在の情報だと「preferredInterfaceOrientationForPresentation」を使っていない人がちょいちょい見られるけど、これ設定しておかないと、例えば、横画面から縦専用画面に移動した際に大変な事になる。

【追記】
例えUIInterfaceOrientationMaskAllを設定していても、Info.plistの「Supported Interface Orientations」が優先されるので注意。

【追記2】
返り値が間違っていたので、UIInterfaceOrientationPortraitに修正しました。

情報元
http://hiiro-game.seesaa.net/article/293374528.html
http://stackoverflow.com/questions/12406748/ios-6-autorotation-in-simulator-varies-from-actual-ios-6-device
http://grembe.wordpress.com/2012/09/19/here-is-what-i/

«  | ホーム |  » page top


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。