インライン画像付きHTMLメールは、以下のような構文となります。
<img src="cid:01@image.gif">
普通であれば<img src="image/01.gif">というような形になるところですが、インライン添付では画像が置いてあるURLとか無いので、かわりにcidという画像を結びつける記号を設置します。
ちなみに例ではgifという拡張子を指定していますが、別にそうする必要はありません。
@の前はランダムな値、@の後はドメイン名を指定し、<img src="cid:ecabf869473b42c110b1@example.jp">などとしている例が多いようです。
これは、cidは世界で一意であることが求められているためです。
で、具体的な画像は、BASE64エンコードでテキスト化した上でメール本文に格納されます。
Content-Type: image/gif; name="image01.gif"
Content-Transfer-Encoding: base64
Content-ID: <cid:01@image.gif>
R0lGODlh2QA9ALMIAFOKz6jK…(略)
メーラでは、<img src>のcidがこのContent-IDと結びつけられ、タグの部分に画像として展開され、表示されます。
では、もしこのcidが被ってしまうという事態があったらどうなるでしょうか。
一通のメールで同じcidを指定するというのは、単に同じ画像を連続で表示するというだけのことです。
複数のメールで同じcidを指定してみましょう。
GmailやPC用、iPhone用の多くのメールアプリでは、もしcidが被ったとしても、全く問題無く添付画像を表示します。
cidをメール単位で識別しているので、他のメールに同じcidが入っていたとしても顧みることは普通ないからです。
翻ってデフォルトメーラでは、中身を見たわけではないので推測ですが、以下のように動作していると思われます。
まず一通目のメールを見た際に、そのcidに対応する画像がキャッシュに登録されます。
そしてその後再度メールを見た際、cidに対応する画像がキャッシュに登録されていれば、その画像を表示します。
おそらく高速化のためにそうしているのだと思われますが…ここにひとつ落とし穴があります。
同じcidであればメールを気にせずキャッシュから読み込むんだよね。
どういうこと?
ちょっとRFC準拠が足りないメールアプリがあったとして、cidを連番で付けちゃう仕様になっていたとします。
一通目。
絶対に許さない<img src="cid:01@image.gif">
添付画像:
二通目。
ごめんね<img src="cid:01@image.gif">
添付画像:
Gmailから見ると送信したとおりのメールが見れます。
で、これをデフォルトメーラで見ると、
一通目。
絶対に許さない
二通目。
ごめんね
これじゃあ戦争になっちゃうよ!
問題は、送信側は全くこのことに気がつくことができないという点です。
たしかにRFCを守ってない送信側メーラが悪いと言えばその通りなのですが、メール単位で絞り込みは可能なわけなんだからそのくらい対応してやれと。
http://developer.apple.com/library/ios/
http://www.asahi-net.or.jp/~YY8A-IMI/20040913/ipad/uikit4.htm
http://iphone-tora.sakura.ne.jp/uitextfield.html
何故かどのサイトも日本語表記がなかったり半端だったりですが、突っ込める型と表記の対応は次のようになります。
UIReturnKeyDefault | Return | 改行 |
UIReturnKeyGo | Go | 開く |
UIReturnKeyJoin | Join | 接続 |
UIReturnKeyNext | Next | 次へ |
UIReturnKeyRoute | Route | 経路 |
UIReturnKeySend | Send | 送信 |
UIReturnKeyDone | Done | 完了 |
UIReturnKeySearch | Search | 検索 |
UIReturnKeyGoogle | 検索 | |
UIReturnKeyYahoo | Yahoo! | 検索 |
UIReturnKeyEmergencyCall | EmergencyCall | 緊急電話 |
で、このreturnKeyTypeに突っ込めるのはUIReturnKeyTypeなのですが、このUIReturnKeyTypeはenum型です。
つまり
UITextField.returnKeyType = @"(・∀・)";
みたいなことができないんだYo!
なんかこうUIReturnKeyType.addObject(UIReturnKeyHoge)みたいなものはないのか?
任意の文字に変更できないか探したんだけど日本語記事はまったく存在しないのな。
ようやく見つけたのが此処。
http://www.neoos.ch/news/46-development/54-uikeyboardtypenumberpad-and-the-missing-return-key
要するにキーボードに画像を重ねて表示する、って解決法でした。
がくり。
コメントを見ていたらもう少しスマートっぽいやり方が載っていました。
> I found a way to resolve this problem: use becomeFirstResponder and resignFirstResponder to handle keyboard notification on UITextField. Just look this image:
> http://www.yonsm.net/attachment/1283431378_38117112.png
> http://www.yonsm.net/attachment/1283431378_98952583.png
> http://www.yonsm.net/attachment/1283431378_246664d4.png
> or download the sample project: http://www.yonsm.net/attachment.php?fid=45
試してみたのですが見事にうまくいきませんでした。
そのKBCustomTextFieldってどこから来るの?