2011年7月12日火曜日

UILocalNotification

UILocalNotificationは、アプリケーションが終了した状態でも指定時間になったらメッセージを表示する等の動作を行わせることができる機能です。


// ローカル通知を作成
UILocalNotification *ln = [[UILocalNotification alloc] init];

NSDate *dt;
dt = [NSDate dateWithTimeIntervalSinceNow:60]; // 60秒後に表示

// 通知時刻を設定
[ln setFireDate:dt];

// タイムゾーンを設定
[ln setTimeZone:[NSTimeZone localTimeZone]];

// メッセージを設定
[ln setAlertBody:@"起きて"];

// サウンド設定
[ln setSoundName:UILocalNotificationDefaultSoundName];

// ボタンタイトルの設定
[ln setAlertAction:@"Open"];

// ローカル通知を登録
[[UIApplication sharedApplication] scheduleLocalNotification:ln];

[ln release];

上記例の処理をアプリに行わせて終了させると、アプリが動作していなくても60秒後に「起きて」というメッセージが表示されるようになります。

サウンド設定にはサウンドファイル名を拡張子付きで指定しますが、再生時間が30秒未満、かつ以下の形式でないと無効となり、システムのデフォルトサウンドが再生されてしまうので注意が必要です。

●リニアPCM
● MA4(IMA/ADPCM)
● µLaw
● aLaw

上記ファイルはaiff, caf, wavのファイルです。

また、applicationIconBadgeNumberプロパティに任意の数字を指定することで、メールアプリなどでよく見られるようなバッヂが表示されるようになります。



2011年7月7日木曜日

特殊フォルダのパスを取得する

ドキュメントフォルダなどのパスの一覧を取得するには、NSSearchPathForDirectoriesInDomain関数を使用します。


NSArray * NSSearchPathForDirectoriesInDomains (
   NSSearchPathDirectory directory,
   NSSearchPathDomainMask domainMask,
   BOOL expandTilde
);


NSSearchPathDirectoryは、取得するパスの種類を指定します。
定数内容
NSApplicationDirectoryアプリケーションディレクトリ
(/Applications)
NSDemoApplicationDirectoryデモバージョンアプリケーション
ディレクトリ
(/Demos)
NSDeveloperApplicationDirectory開発用アプリケーションディレクトリ
(/Developer/Applications)
NSAdminApplicationDirectoryシステムとネットワーク管理者用
アプリケーションディレクトリ
(/Administration)
NSLibraryDirectoryライブラリディレクトリ
NSDeveloperDirectory開発ツールディレクトリ(/Developer)
NSUserDirectoryユーザディレクトリ(/Users)
NSDocumentationDirectoryドキュメンテーションディレクトリ
(/Library/Documentation)
NSDocumentDirectoryドキュメントディレクトリ
NSCoreServiceDirectoryコアサービスディレクトリ
(/System/Libary/CoreServices)
NSAutosavedInformationDirectory自動保存ディレクトリ
(~/Library/Autosave Information)
NSDesktopDirectoryデスクトップ
NSCachesDirectoryキャッシュディレクトリ
(Library/Caches)
NSApplicationSupportDirectoryアプリケーションサポート
ディレクトリ
(Library/Application Support)
NSDownloadsDirectoryダウンロードディレクトリ
NSInputMethodsDirectoryインプットメソッドディレクトリ
(Library/Input Methods)
NSMoviesDirectoryムービーディレクトリ(~/Movies)
NSMusicDirectoryミュージックディレクトリ(~/Musics)
NSPicturesDirectoryピクチャディレクトリ(~/Picture)
NSPrinterDescriptionDirectoryプリンタ情報ディレクトリ
(Library/Printers/PPDs)
NSSharedPublicDirectoryパブリックディレクトリ(~/Public)
NSPreferencePanesDirectoryプリファレンスペインディレクトリ
(~/PreferencePanes)
NSItemReplacementDirectory「NSFileManager」クラスの
「URLForDirectory:inDomain
:appropriateForURL:create:error:」
メソッドと組み合わせて使用する定数
NSAllApplicationsDirectory全アプリケーションディレクトリ
NSAllLibrariesDirectory全ライブラリディレクトリ


NSSearchPathDomainMaskは、取得するパスの範囲を指定します。
定数内容
NSUserDomainMaskユーザーのホームディレクトリ
NSLocalDomainMaskローカルマシン内
NSNetworkDomainMaskネットワーク内(/Network等)
NSSystemDomainMaskシステム内(/System)
NSAllDomainsMask全てのドメイン


expandTildeは、パスが長い場合にチルダをフルパスにするかを指定します。

NSString文字の配列がNSArrayに返却されます。

アプリで作成したドキュメントをMacと共有できるようにする

iPhoneアプリで作成したドキュメントをMacと共有するには、アプリのInfo.plistファイルを編集します。

ビルド設定の「Info」タグに行を追加し、「Application supports iTunes file sharing」 を追加し、タイプをBOOL型にしてYESにします。

これでiTunesのAppタグからアプリのドキュメントを共有できるようになります。

2011年7月5日火曜日

codesign failed

アップルのデベロッパー登録は1年毎に更新する必要がありますが、この時アップルの説明書の通りに更新しても、いざ新しくビルドを行おうとする時に以下のエラーが出てハマる場合があります。


iPhone Developer: ・・・・・・・・: ambiguous (matches "iPhone Developer: ・・・・・・・・・" in /Library/Keychains/System.keychain and "iPhone Developer: ・・・・・・・・・" in /Users/・・・・・/Library/Keychains/login.keychain)
Command /usr/bin/codesign failed with exit code 1

・・・の部分は開発者ごとに異なります。

この原因はキーチェインに以前登録した古い開発者用の証明書が残っていて、「証明書ユーティリティが新しいのと古いのとどっちを使っていいのか分からない」のが原因みたいです。
この場合、 【アプリケーション】→【ユーティリティ】にあるキーチェーンアクセスを起動してみると、☓印がついた証明書(期限切れの証明書)があると思うので、削除します。

☓印がついた証明書が見えない場合もあり(私はこれでハマりました)、この場合は検索ボックスで「iphone」と検索すると表示されるようになります。


【追記】
xcode4.0.1を使っている時にエラーが出る場合もあります。
この場合、xcode4.1がひっそりとリリースされていて、をれを使えば直る場合があります。
バージョン4以降は【product】→【edit scheme】でArchiveのBuild ActionをDistributionに変えておくのも忘れないようにしましょう。

【更に追記】
同じcodesignエラーですが、エラーの内容が以下の様になる場合があります。

Code sign error: The identity "iPhone Developer" doesn't match any valid certificate / private key pair in the default keychain.

これはキーチェインがデフォルトになっていないからだそうです。
【アプリケーション】→【ユーティリティ】でキーチェインアクセスを起動し、左上の窓からログインを右クリック。【キーチェーン”ログイン”をデフォルトにする】を選択するとエラーが出なくなります。