2012年8月19日

ある拡張子のファイルを自分のアプリで開けるように

これもわかりやすい情報があんまり無いなあ。
いや標準的なUTIの記述例ならあるんだけど。

例として、.abcという拡張子のファイルを、Safari等から自分のアプリ(com.hoge.yourAppというIDのアプリで)で開けるようにする場合。
多分正解では無いと思うけど、試行錯誤の結果、こんな感じで動きましたよという例として書いときます。

プロジェクトのInfoタブの「Document Types」と「Exported UTIs」をいじります。



ってな感じで、

info.plistとしては


<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>abc</string>
<string>ABC</string>
</array>
<key>CFBundleTypeIconFiles</key>
<array>
<string>icon</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>plain/abc</string>
</array>
<key>CFBundleTypeName</key>
<string>hogehoge File</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>com.hoge.yourApp</string>
</array>
</dict>
</array>





<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array/>
<key>UTTypeDescription</key>
<string>hogehoge File</string>
<key>UTTypeIdentifier</key>
<string>com.hoge.yourApp</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>abc</string>
<string>ABC</string>
</array>
</dict>
</dict>
</array>



って感じ。
いらないのもあったりしそうだけど、あくまでも動いた例ってことでご了承を。
(MIME-Typeは要らないかも)


あとはAppDelegate.mを修正。 こっちは楽勝。

//オプション付きで起動されるとき

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if (launchOptions) {
        NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
        if ([url isFileURL]) {
            //とか、なんか処理;
        }
    }
    return YES;
}




//起動中に他のアプリから呼び出されるとき

- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url {
    if ([url isFileURL]) {
            //とか、なんか処理;
    }
    return YES;
}











2012年8月13日

UISplitViewController 1

覚書的な。
UISplitViewControllerって結構iPadでは必須コントローラだと思ってたので使ってみた。
しかし!ちょっと使いづらくないだろうか? みんなよく頑張ってるなと。
MGSplitViewController for iPadとかそういうの使うのかな?
まあ極力標準パーツで組みたい僕は標準のUISplitViewControllerで頑張ってみた。

とりあえず、右のDetailビューの中で、左右のPan(ドラッグ)を使いたかったんだ。
UIPanGestureRecognizer組み込んで、ポートレート表示で右にドラッグしたら、、、

マスタービューがひょこっと出てきやがる!

(ランドスケープ表示でも右ドラッグはUISplitViewControllerに奪われてる。)
どうにかならんもんかねこれ?
とりあえず、自前Panは2本指にすればいいかなって思って2Touchesに変更しても、まだひょこっと出てくる!

うーむ、どうやらUISplitViewControllerのUIPanGestureRecognizerのmaximumNumberOfTouchesが-1(無限)になってるらしい・・・
ってことで、こいつを無理やり1本指オンリーに変える。
DetailのコントローラのviewDidLoadあたりで、UIPanGestureRecognizerを探し出す。

for (UIGestureRecognizer *g in self.splitViewController.view.gestureRecognizers) {
    if ([g isKindOfClass:[UIPanGestureRecognizer class]]) {
        [(UIPanGestureRecognizer *)g setMaximumNumberOfTouches:1];
    }
}

これで自前の2本指ドラッグと共存できるようになりました。