Tag Archives: プログラミング言語

iOS SDK:他のアプリからドキュメントを取り込む仕組み

0
Filed under iOS SDK, iPadアプリ, iPhoneアプリ
Tagged as , , ,

他アプリと連携

iOSアプリを作っていて、「他のアプリからドキュメント(データファイルや画像ファイル)を取り込めるようにしたい」と思って調べた内容のまとめです。

「自分のアプリ内のドキュメントを他のアプリで開く」というのは UIDocumentInteractionController あたりをキーワードに検索してみるといろいろ出てくると思います。
この辺りの、iOSでファイルを共有する概要や実装手順については、下記ページが分かりやすいです。

今回やりたかったのは、↑このページの、項目3. Accepting Incoming Documents (Document Reader)というのがそれで、「他のアプリからドキュメントを取り込む」仕組みです。

取り込みの概要

ファイル取り込みの仕組みは本当にシンプルで、するべきことは次の2つ。

  • 対応ファイル形式の定義
  • 送られてきたドキュメントの処理

これを順番に説明したいと思います。

対応ファイル形式の定義

Xcodeでプロジェクトを選択し(1)、”ターゲット”(2) の “Info”(3) を開き、リスト内にある “Document Types”(4) に追記します。
Addボタンから、Add Document Typeを選択します(5)。
これで、
Document Typesに項目が追加(6)されるので、これを編集します。

次に、この項目の設定内容について説明します。

Document Types – Name

上記画像では「型紙(ZIP)」としているところですが、これは単に項目の名前。
他のアプリから見たときにこの名前が見えるわけでも無いようです。
自分で分かりやすいように命名すればOKです。

Document Types – Types

ここが肝で、対応ファイルの形式を書きますが、ファイルの拡張子ではありません。
Uniform Type Identifiers、略して UTI と呼ばれる識別子を列挙します。
一覧はiOS Developer Libraryの Uniform Type Identifiers Reference というページにあります。
例を挙げると、次のような感じになります。

  • PDF — com.adobe.pdf
  • PNG — public.png
  • ZIP — com.pkware.zip-archive

複数のファイル形式に対応することも可能で、例えば、PNG/JPEG/GIFを同等に扱う場合、次のようにTypesに入力します。

public.png, public.jpeg, com.compuserve.gif

Document Types – Icon

Iconには他のアプリで対応ファイルを開いたときにPOP内に表示するアイコン画像を指定できます。
指定しない場合、デフォルトのアプリアイコンを使った画像が表示されます。
自分で準備する場合、iPhone用には、22×29, 44×58、iPad用には、64×64、320×320の画像を用意する必要があり、ドロップシャドウとページカールエフェクトがかかるので、それを想定して作る必要があり、他にもマージンの設定が細かく決まっていて結構面倒なので、オリジナルを用意するのは相当余裕がある人だけでいいんじゃないでしょうか。
詳しくはこちらです↓

なんと、ここまでの設定だけで、特定のファイル形式に対して自分のアプリを開けるようにする準備は完了です!
かなり簡単ですね。

読み込みの仕組み

で、次にやるべきは、他のアプリから特定のファイルを指定し、自分のアプリを開いたあとの処理の実装。
UIApplicationDelegate インターフェイスの実装をしているクラスの、次のメソッドが呼び出されますので、この中に処理を書けばOKです。
- (BOOL)application:(UIApplication *)application openURL:(NSURL*)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
urlには次のようなファイルパスが入ってきます。

file://localhost/private/var/mobile/Applications/XXXXX/Documents/Inbox/sample.zip

自分のアプリの、Documents/Inbox/ フォルダ内にコピーされており、そのファイルへのパスが関数に渡ってくる、という仕組みです。
この Documents/Inboxフォルダですが、ここは書き込みできず、読み込みと削除しか出来ません。
そのため、もらったファイルは、自分でどこか適当な場所に移動することから始めるとよさそうです。

読み込みコード – サンプル

例えば、openURLに渡ってきたファイルの拡張子を判定し、Documentsディレクトリ直下に移動するには、次のようなコードになります。( application:openURL:sourceApplication:annotation: 内に書くことを想定しています)

1
2
3
4
5
6
7
8
9
10
11
12
// 拡張子で処理分岐:zipの場合.
if( [[url pathExtension] isEqualToString:@"zip"] ){
  // ここでzipの処理.
  NSArray* paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);
  NSString* pathDocumentRoot = [paths objectAtIndex:0];
  NSString*	pathTempZip	= [pathDocumentRoot stringByAppendingPathComponent:[url lastPathComponent]];
  NSFileManager* fm	= [NSFileManager defaultManager];
  NSError* error = nil;
  if( [fm moveItemAtPath:[url path] toPath:pathTempZip error:&error] ){
    // zip移動成功後の処理.
  }
}

テストできるアプリ

さて、これで準備は出来たのですが、一般的に出回っているアプリ内のうち、どのアプリからなら送れるか?ということですが、やっぱりDropboxが便利ですね。
ただ、テキストファイル(.txt)、zipファイル(.zip)、はいけるんだけど、PNGとか画像そのものはダメでした。
これは、標準メーラーも同じ。
GoodReaderでは、画像も書き出しが出来たので、これを使ってみるといいと思います。
GoodReader for iPhone 3.13.1(¥450)
カテゴリ: 仕事効率化, ユーティリティ
現在の価格: ¥450(サイズ: 24.2 MB)
リリース日: 2009/02/28

ss1 ss2


[AD]

↓enchant.jsの書籍が出るらしい!

HTML5とJavaScriptでスマートフォンゲーム作成! ゼロからはじめるenchant.js入門【公式ガイド】

著者/訳者:布留川英一 伏見遼平 田中諒

出版社:アスキー・メディアワークス( 2012-02-18 )

定価:¥ 3,150

Amazon価格:¥ 3,150

大型本 ( 272 ページ )

ISBN-10 : 4048862588

ISBN-13 : 9784048862585


HTML5, CSS, jQueryの基本コードパッケージ

0
Filed under プログラミング言語, 仕事ツール
Tagged as , , , ,

ちょっとしたテストとか、JavaScriptの動作チェックとかやる度にゼロからHTMLを書いていました。
まだ、これまではその間隔が2,3ヶ月に1度くらいだったのであまり苦痛ではなかったのですが、最近1ヶ月に1度はやっている気がする。
大抵のテストではjqueryを使いたくなるので、それをダウンロードして、読み込ませたりするし、当然CSSも必要。
でも、CSSのプロパティとかどういうパラメータ名だったっけ?とか、jqueryってどういう使い方だったっけ?と基本的なところので悩み、なんとなく、こんな感じのような。。ちがうなぁ、と試行錯誤の繰り返し。

サンプルファイルアーカイブ

今更ですが、この作業があまりに無駄に感じたので、その最初のところまでをシンプルにしてまとめたものをアップしておきます。ご自由にお持ちください!

大抵のウェブコンテンツ制作者の方には不要だと思いますが、誰よりも自分のために公開!

Read More »

svnの差分があるファイルをリストアップしたらawkが面白いことを知った

0
Filed under Subversion, プログラミング言語, 仕事ツール
Tagged as , , ,

svn diff

subversionで変更一覧を見るには次のコマンドを入力します。

1
$ svn diff

これで、ファイル名に続いて差分がdiff形式で表示されます。
しかし、変更箇所の詳細は不要で、変更ファイルのファイル名だけが欲しい、という状況になり、一覧を調べるのに何か便利なコマンドがないかと調べて、awkと組み合わせてリストアップするコマンドを見つけました。

1
$ svn diff | awk '/^Index/ {print $NF}'

参考サイト:http://www.02.246.ne.jp/~torutk/subversion/intro.html

エイリアス化

これを毎回入力するのは面倒なので次のように .bash_profile に書いて、エイリアス登録。

1
alias svn_diff_list='svn diff | awk "/^Index/ {print $NF}"'

awk導入

上記コマンドの後半はawkによる文字処理。
awkって名前は知っているけど、自分で使ったこと無いので、これを機にちょっと調べてみた。
awkの面白さが分かりやすかったのがこのページ(http://x68000.q-e-d.net/~68user/unix/pickup?awk)
ls -alで出てくる情報を空白区切りとみなして、5列目、9列目のみ表示したい場合には次のようなコマンドでOKなのだ!

1
$ ls -al | awk '{print $5,$9}'

おー!!これは面白い!!!
んで、そのなかでも、例えば、adminという文字列がある行のみ表示したい場合には、次のように正規表現で指定すれば、行を抽出できる。

1
$ ls -al | awk '/admin/ {print $5,$9}'

ちなみに正規表現にマッチした行をすべて表示するには次のような感じ。

1
$ ls -al | awk '/admin/ {print;}'

awk、奥が深いらしいのですが、導入はこれで十分ですね!あとは、必要に応じて調べればいい!


[AD]

↓AWKの項目もある!ちなみにAWKとは、作者3人の名前の頭文字。エイホ(Aho)、ワインバーガ(Weinberger)、カーニハン(Kernighan)。そう、あのカーニハンですよ!

言語設計者たちが考えること

出版社:オライリージャパン( 2010-09-27 )

定価:¥ 3,780

Amazon価格:¥ 3,780

大型本 ( 536 ページ )

ISBN-10 : 4873114713

ISBN-13 : 9784873114712


↓awkを本格的にプログラム言語として勉強するならこれが良さそう。

sed & awkプログラミング 改訂版

著者/訳者:Dale Dougherty Arnold Robbins

出版社:オライリー・ジャパン( 1997-10-01 )

定価:¥ 4,305

Amazon価格:¥ 4,305

大型本 ( 461 ページ )

ISBN-10 : 4900900583

ISBN-13 : 9784900900585


↓256倍シリーズのAWK本。

AWKを256倍使うための本 (Ascii 256倍)

著者/訳者:志村 拓 鷲北 賢 西村 克信

出版社:ASCII( 1993-08 )

定価:¥ 1,223

単行本 ( 277 ページ )

ISBN-10 : 4756101623

ISBN-13 : 9784756101624


Objective-Cの既存のクラスを拡張する仕組み

0
Filed under iPhone, Objective-C, プログラミング言語
Tagged as , , , , ,

Objective-Cには「カテゴリ」という機能があり、それについて調べたときのメモをまとめました。

その名は「カテゴリ」

ネットに転がっているソースを見ていて、それまで見たことなかった書き方があったときにはそれをどうやって調べたらいいのか、なかなか手こずります。その書き方そのものの名を知らないからです。
今回の例で言うと「カテゴリ」という機能のことで、下記のような感じで書かれていたら、それはカテゴリ機能を使っているのです。

1
@inteface NSString (HogeHoge)

このカテゴリ機能を活用すると、既存のクラスをちょっと機能拡張したい時に無駄なクラスを作る必要がなくなります。
例えば、文字列を扱うクラス NSString をに機能を追加したいことはよくあるのですが、NSStringの中身に応じたハッシュ値(MD5)を出力できるようなメソッドを追加する、という例に説明してみます。
MD5の機能実装の参考にしたのはこちらのサイト。関数の中身は全く同じです。

ざっくりしたカテゴリの書き方と使い方

まず、カテゴリ定義の書き方。
NSStringにMD5の機能を追加する場合、ファイル名は、NSString+MD5.h, NSString+MD5.m とするのがマナーのようです。
また、後述するソースを見ると分かるのですが、定義部は @inteface NSString (MD5)、実装部は @implementation NSString (MD5) という感じにして、あとは通常のクラス定義と同じように書きます。
次に使い方ですが、#import “NSString+MD5.h” として一緒にビルドすれば、そのソース内でNSStringインスタンスは全てMD5カテゴリの機能を持つことが出来ますので、下記のようなコードでMD5値を出力させることが出来ます。

1
2
NSString* strTest = @"テスト文字列";
NSLog( @"original[%@], MD5[%@]", strTest, [strTest MD5String] );

NSString+MD5 コード全容

1
2
3
4
5
6
7
//  NSString+MD5.h
 
#import <Foundation/Foundation.h>
 
@interface NSString (MD5)
- (NSString*) MD5String;
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//  NSString+MD5.m
 
#import "NSString+MD5.h"
#import <CommonCrypto/CommonDigest.h> // for CC_MD5
 
@implementation NSString (MD5)
- (NSString *) MD5String
{
  const char *cStr = [self UTF8String];
  unsigned char result[CC_MD5_DIGEST_LENGTH];
  CC_MD5( cStr, strlen(cStr), result );
  return [NSString stringWithFormat:
    @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
    result[0], result[1], result[2], result[3], 
    result[4], result[5], result[6], result[7],
    result[8], result[9], result[10], result[11],
    result[12], result[13], result[14], result[15]
    ];  
}
@end

iOS SDKのMD5関数についての説明

おまけとして、上記のソースの内容を説明します。
MD5への変換関数 CC_MD5はiOS SDKにC言語ライブラリが用意されています。(リファレンスはこちら

CC_MD5は、次のように定義されています。

1
2
extern unsigned char*
CC_MD5(const void *data, CC_LONG len, unsigned char *md);

data が元になるデータのポインタ。
len がdataの長さ。
md がMD5計算の結果を格納する出力用バッファへのポインタで、CC_MD5_DIGEST_LENGTHの長さが必要なので、予め用意しておきます。本当はCC_MD5_DIGEST_LENGTHの長さに合わせて、出力部分を対応できるよう書いておく必要がありますが、CC_MD5_DIGEST_LENGTHは、そうそう16から変わることはないので、出力部分を固定で16要素並べてstringWithFormatで出力させています。

クラスの機能分割、という視点

カテゴリについての詳しい説明は、「Dynamic Objective-C」という書籍にも3ページに渡って説明されているのですが、こちらでの視点はチョット違う。

Dynamic Objective-C

著者/訳者:木下 誠

出版社:ビー・エヌ・エヌ新社( 2009-03-27 )

定価:¥ 3,360

Amazon価格:¥ 3,360

単行本 ( 456 ページ )

ISBN-10 : 4861006414

ISBN-13 : 9784861006418


そのセクション名は「カテゴリ ―動的なメソッドの追加によるクラスの拡張」となっていながらも、最初の段落の説明は次にように書かれている。

Objective-Cには、カテゴリと呼ばれる機能がある。クラスが持つメソッドを、名前の通りカテゴリごとに分類するための機能だ。これを使うことで、大きなクラスでもコーディングしやすいように分割することができる。

そもそもカテゴリとは、クラス実装を分割するための仕組み、だというのだ。
なるほど、そう考えるとカテゴリが「カテゴリ」という名前の由来もわかるし、ウェブに転がるサンプルのファイル名がHOGEHOGE-FOO.hとかハイフン繋ぎになっているモノがあるのも理解できる。
MVCモデルでクラスを分けても大きくなってしまうクラスはあるし、その場合にはカテゴリを使った機能分割も視野に入れていいかもしれない。
その他にもObjective-Cの深いところをじっくり説明してくれている「Dynamic Objective-C」はおすすめ書籍です!

カテゴリで出来ないこと

後から知ったのですが、カテゴリ機能で「クラスのインスタンス変数の追加」は出来ないようですね。
これ、結構重要なポイントだと思います。

参考サイト:『kuro’s blog : Objective-C:カテゴリで「できること」と「できないこと」』


[AD]

↓「CHAPTER09 カテゴリ」とカテゴリについて章を割いて説明されているようです!

詳解 Objective-C 2.0 改訂版

著者/訳者:荻原 剛志

出版社:ソフトバンククリエイティブ( 2010-12-17 )

定価:¥ 3,990

Amazon価格:¥ 3,990

大型本 ( 608 ページ )

ISBN-10 : 4797361786

ISBN-13 : 9784797361780


↓昨年8月に亡くなった今敏が1985年〜1986年に連載していたマンガ!面白そう!

OPUS(オーパス)上(リュウコミックス) [コミック]

著者/訳者:今 敏

出版社:徳間書店( 2010-12-13 )

定価:¥ 980

Amazon価格:¥ 980

コミック ( ページ )

ISBN-10 : 4199502211

ISBN-13 : 9784199502217


↓PS3もXbox360も持っていないけど、これは面白そう!

キャサリン 特典 サントラCD付き

キャサリン 特典 サントラCD付き

定価:¥ 7,329

Amazon価格:¥ 4,860

カテゴリ:Video Game

発売日:2011-02-17