Hatena::Groupiphone-dev

noborunrunのiPhoneアプリ開発

公開中アプリ mStacks FilmTrackr PicTrackr

2013-08-23独自UTIを使用したファイル共有の方法

独自のファイル形式なり、拡張子なりを特定のアプリで開きたい。とか思った時に調べたので記載しておく。

受け取り側で指定した独自UTIがシステムに保持されて、UIDocumentInteractionControllerなどで拡張子を指定すると受け取り側アプリが候補に上がるようになる。

受け取る側の実装

info.plistに下記の設定をする

Export UTIs

<key>UTExportedTypeDeclarations</key>

<array>

<dict>

<key>UTTypeConformsTo</key>

<array>

<string>public.item</string>

</array>

<key>UTTypeDescription</key>

<string>my document type</string>

<key>UTTypeIdentifier</key>

<string>com.mycompany.myfiletypename</string>

<key>UTTypeTagSpecification</key>

<dict>

<key>public.filename-extension</key>

<array>

<string>ns</string>

</array>

</dict>

</dict>

</array>

XMLで書くとUIExportedTypeDeclarationsというキーの中に追加したいタイプ分のarrayを作成してその中にディクショナリを入れる。

ディクショナリの各項目は

  • UTTYpeConformsTo

UTTypeの指定を配列で行う。今回の場合はpublicの一番上の階層であるitemを指定した。

  • UTTypeDescription

ExportするUTIのTypeの説明文を入れる。

  • UTTypeIdentifier

他とかぶらないようにしたこのUTI TypeのiDentifierを入れる。

ドメインとかUserDefaultsに入れるような定義をすればよい。

  • UTTypeTagSpecification

拡張子など、ExportするUTIが持つタグをディクショナリで指定する。

ディレクトリに入れるキーは拡張子の場合はpublic.filename-extensionを指定して、その値に配列で登録したい個数分の拡張子文字列で指定する。

GUIで項目を追加すると下記の図のような形となる。

f:id:noborunrun:20130824022442p:image

Document Types

<key>CFBundleDocumentTypes</key>

<array>

<dict>

<key>CFBundleTypeIconFiles</key>

<array>

<string>document-320.png</string>

<string>document-64.png</string>

<string>nsicon</string>

</array>

<key>CFBundleTypeName</key>

<string>My file</string>

<key>CFBundleTypeRole</key>

<string>Viewer</string>

<key>LSHandlerRank</key>

<string>Alternate</string>

<key>LSItemContentTypes</key>

<array>

<string>com.mycompany.myfiletypename</string>

</array>

</dict>

</array>

XMLで書くとCFBundleDocumentTypesというキーの中に追加したいType分の配列を作成してその中にディクショナリを入れる。

ディクショナリの各項目は

  • CFBundleTypeIconFiles

使いたいアイコン画像を配列で指定する。

  • CFBundleTypeName

Typeの名前を指定する。

  • CFBundleTypeRole

Typeの役割を指定する。今回はViewerとした。

  • LSHandlerRank

アプリがこのドキュメントタイプをどの程度サポートしているかを示すランク。

優先度が高い方から

- Owner

- Alternate

- None

- Default

の順となる。

  • LSItemContentTypes

サポートするUTI形式の文字列配列で入れる。今回の場合はcom.mycompany.myfiletypenameをExport UTIsで指定していてそれを開きたいため、UTTypeIdentifierで入れたものと同じものを入れる。

GUIでは下記の図のような形となる。

f:id:noborunrun:20130824022443p:image

送る側の実装

受渡したいファイルなどを先にプロジェクトに追加するなりの用意をして、ボタンアクションなどで下記のようなコードを記載する。今回はサンプルにsample.nsというファイルを送ってみることにする。

NSURL* url = NSBundle mainBundle] URLForResource:@"sample" withExtension:@"ns"];

docInteractionCon = [UIDocumentInteractionController interactionControllerWithURL:url];

docInteractionCon.delegate = self;

if ([docInteractionCon presentOptionsMenuFromRect:self.view.frame inView:self.view animated:YES]){

}

else{

NSLog(@"There is no app for this file.");

}

受け取り側で登録したDocument Typesの中のLSItemContentTypesに指定した拡張子のファイルパスを取得して[UIDocumentInteractionController interactionControllerWithURL:]に渡してdocumentInteractionControllerを開けば受け取り側のアプリのアイコンが表示される。

2013-04-08

近況報告とか紹介とか

17:39

ご無沙汰しております。

ブログ書きたいといってからはや年月。いかがお過ごしでしょうか?

といって、書く内容が宣伝なんですがね。

まずは近況(というか、すでにだいぶ前のこと)報告。

・FilmTrackrバージョンアップ

iTunesArtwork

 色々と機能追加したバージョンアップをして、リリース出来ました。

 PVとかもつくったよ!

 https://vimeo.com/51990704

 デジカメウォッチさんに載せてもらったよ!

 http://dc.watch.impress.co.jp/docs/news/20120105_502725.html(最初)

 http://dc.watch.impress.co.jp/docs/news/20121120_574149.html(今回バージョン)

 AppStore

 https://itunes.apple.com/jp/app/filmtrakr/id489198234?mt=8

 

ところで、iPhoneアプリ作ってみたいなーとかいう方向けにスクールができるらしいので、ご興味があればいかがですか?

プログラミングとか敷居が高いなーって思ってるところを取っ払ってくれるそうです。

多分、iPhone開発に興味があったり、仕事でiPhoneアプリ開発のメンバーになったけどプログラマが何するのかよくわからないなーっていうデザイナさんとか、こんなことやってるんだーって理解ができていいのでは?という内容だと思います。

初回が説明会が今週末の4月13日(土)午後2時くらいから渋谷であるみたいなので、ご興味があればぜひ!

0413_pr

そして、信頼のあのメンバーによるiOS6の開発本が発刊されました。

jpeg

本屋さんで見かけたら買いましょう。

2012-10-02

iOS6になってMapKitのAnnotationViewの上にオーバーレイが出るようになった

15:45

iOS6のMapKit絡みでもう一個。

どうやら、MKMapViewの構造が変わってAnnotationViewとOverlayViewの位置が変わったみたい。

で、オーバーレイしてるとそのしたにアノテーションが表示されちゃう。

f:id:noborunrun:20121002153555p:image:left

iOS4・iOS

<MKMapView>

| <UIView>

| | <MKScrollView>

| | | <MKMapTileView>

| | | <MKAnnotationContainerView>

| <UIImageView>

iOS

<MKMapView>

| <UIView>

| | <VKMapView>

| | | <VKMapCanvas>

| | <MKScrollContainerView>

| | | <MKAnnotationContainerView>

| | | | <UIImageView>

| | | | <MKPinAnnotationView>

| <MKAttributionLabel>

調査の結果、オーバーレイはUIViewで作成してMapkitのViewにaddSubview:してた。

まぁ、そうなるよね。という結果でした。

ちなみにiOS6ではここに入れれば問題ない。

[mapView subviews] objectAtIndex:0] subviews] objectAtIndex:0] addSubview:self];

それ以前は今調べてるとこ。

2012-10-01

iOS6になってMapKitのAnnotationViewのrightCalloutAccessoryViewでUIButtonが表示されなくなった時の対処法

05:13

UIViewとかUIImageViewとか入れてみるとちゃんと出る。UIButtonだけButtonTypeどれにしても出なかった。

ドキュメント見ると、

>>This property is set to nil by default. The right callout view is typically used to link to more detailed information about the annotation. The height of your view should be 32 pixels or less. A common view to specify for this property is UIButton object whose type is set to UIButtonTypeDetailDisclosure.

って書いてある。

ってかいてあ、、、

UIButtonのFrameを32で指定してみたらでた。

// annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

これを、こうした。

UIButton *aButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

[aButton setFrame:CGRectMake(0, 0, 32, 32)];

annotationView.rightCalloutAccessoryView = aButton;

もともとのやり方がひどすぎたって話なのかもしれないけども。

noborunrunnoborunrun2012/10/05 00:37@k_katsumi さんから、これしなくても大丈夫だよ。って話をいただいた。

2012-06-04

UIViewのanimationのOption

03:27

UIViewAnimationOptionLayoutSubviews

Lay out subviews at commit time so that they are animated along with their parent.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionAllowUserInteraction

Allow the user to interact with views while they are being animated.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionBeginFromCurrentState

Start the animation from the current setting associated with an already in-flight animation. If this key is not present, any in-flight animations are allowed to finish before the new animation is started. If another animation is not in flight, this key has no effect.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionRepeat

Repeat the animation indefinitely.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionAutoreverse

Run the animation backwards and forwards. Must be combined with the UIViewAnimationOptionRepeat option.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionOverrideInheritedDuration

Force the animation to use the original duration value specified when the animation was submitted. If this key is not present, the animation inherits the remaining duration of the in-flight animation, if any.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionOverrideInheritedCurve

Force the animation to use the original curve value specified when the animation was submitted. If this key is not present, the animation inherits the curve of the in-flight animation, if any.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionAllowAnimatedContent

Animate the views by changing the property values dynamically and redrawing the view. If this key is not present, the views are animated using a snapshot image.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionShowHideTransitionViews

When present, this key causes views to be hidden or shown (instead of removed or added) when performing a view transition. Both views must already be present in the parent view’s hierarchy when using this key. If this key is not present, the to-view in a transition is added to, and the from-view is removed from, the parent view’s list of subviews.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionCurveEaseInOut

An ease-in ease-out curve causes the animation to begin slowly, accelerate through the middle of its duration, and then slow again before completing.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionCurveEaseIn

An ease-in curve causes the animation to begin slowly, and then speed up as it progresses.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionCurveEaseOut

An ease-out curve causes the animation to begin quickly, and then slow as it completes.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionCurveLinear

A linear animation curve causes an animation to occur evenly over its duration.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionTransitionNone

No transition is specified.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionTransitionFlipFromLeft

A transition that flips a view around its vertical axis from left to right. The left side of the view moves toward the front and right side toward the back.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionTransitionFlipFromRight

A transition that flips a view around its vertical axis from right to left. The right side of the view moves toward the front and left side toward the back.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionTransitionCurlUp

A transition that curls a view up from the bottom.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionTransitionCurlDown

A transition that curls a view down from the top.

Available in iOS 4.0 and later.

Declared in UIView.h.

UIViewAnimationOptionTransitionCrossDissolve

A transition that dissolves from one view to the next.

Available in iOS 5.0 and later.

Declared in UIView.h.

UIViewAnimationOptionTransitionFlipFromTop

A transition that flips a view around its horizontal axis from top to bottom. The top side of the view moves toward the front and the bottom side toward the back.

Available in iOS 5.0 and later.

Declared in UIView.h.

UIViewAnimationOptionTransitionFlipFromBottom

A transition that flips a view around its horizontal axis from bottom to top. The bottom side of the view moves toward the front and the top side toward the back.

Available in iOS 5.0 and later.

Declared in UIView.h.