2012年5月15日火曜日

この世界にあらず


 「なな字引」のレビュー欄でも何度か要望を頂いている件について、こちらで回答しておこうかと思います。


・メール送信機能に画像添付も出来るようにしてほしい

 結論から言いますと、残念ながらこの機能への対応は行いません。


 理由としては何点かあります。
 まず第一に、なな字引のメール送信機能は標準で提供されている「EmailComposeTask」を使用していますが、そのEmailComposeTask機能に画像添付の機能が存在しないためです。よって、現状の仕様上、対応することはまず無理です。
 とはいえこれは、Socket通信する処理を自分で作ってやれば解決できます。が、それはやりません。これが第二の理由につながりますが、それやると結構作り変えになりますからです。Socket通信なんて実は書いたことないので、当然開発には時間がかかるでしょう。デバッグもしかり。そこまでして作り変えるほどの必要性があるのか、と思っているわけです。
 最後に、「現状のままでも手間はさほど変わらない」という点です。
 今の「EmailComposeTask」を用いた仕様のままでも、OS標準のメーラー画面に遷移したあとで画像添付することは出来ます。メニューバーにボタンが出てますね。それを押して画像選ぶだけなので、今のままでもいいんじゃないかな?と思ってます。結局画像を選ぶ手間は一緒ですしね。

 というわけで、残念ながら「メール送信時に画像添付」は対応しません。あしからず……。

2012年5月3日木曜日

死せる生

まさかの3月・4月投稿0でした、けど生きてます。

 2月の記事にも書いた通り、なな字引のSkydrive対応を進めております。現状処理の実装は終わっていて、バグ出しをしている段階です。多分粗方出せたと思うので、今晩にでも更新申請を出す予定です。今回でバージョンが 1.215 ⇒ 1.300 になります。追加機能は、

 ・Skydriveからのインポートに対応
 ・Skydriveへのエクスポートに対応
 ・TSV形式のファイルフォーマットに対応
 ・一部バグフィックス

 となっております。
 TSV形式に対応することにより、顔文字内に「,」を使っているものも正常に取り込めるようになります。

 Skydrive対応には、MSの「LiveSDK」を使用しました。このSDKを使えばSkydriveに限らず、WindowsLiveIDを使ったサービスへのアクセスや情報取得が容易に出来るようになるため、お奨めです。ネット上で調べてもあまりサンプルソースの量は多くありませんが、さほど難しい内容でもないので、ある程度は自力でどうにかなると思います。


 とはいえ、全く詰まらずに作業を進められたわけではありませんでした。
 折角なので、大幅に詰まって悩んでしまった部分について、記事にして残しておこうかと思います。何回かに分けて。何をどこまで書くかは気分次第。




WebBrowserComponent権限に関する注意点
 LiveSDKで個人的にもっとも感動した点が、認証の部分です。
 通常の認証方法の場合、twitterなどのようなOAuth認証方式だったと思うのですが、そこは所詮日曜プログラマーな私、そんな認証なんて一度も扱ったことがないので、なんか苦手意識が強くありました。概略図とか見ると、なんかサーバにリクエスト投げてその結果を受け取ってさらにまた投げて……とか、ややこしそうにしか見えなかったので。
 しかし、LiveSDKを使えばそんな手間はいりません。LiveSDKを参照設定に追加してやって、XAMLに名前空間の定義とボタンを1つ配置して、認証結果をオブジェクトで受け取るだけです。


名前空間の追加例
xmlns:Microsoft_Live_Controls="clr-namespace:Microsoft.Live.Controls;assembly=Microsoft.Live.Controls"

サインイン用のボタンを配置する例(ボタンはLiveSDKに含まれています)
Microsoft_Live_Controls:SignInButton x:Name="btnSignIn" ClientId="**********" Branding="Skydrive" Scopes="wl.skydrive_update" SessionChanged="btnSignIn_SessionChanged"


 ソースコード内では、サインインボタンの「SessionChanged」発生時に、
e.Status == LiveConnectSessionStatus.Connected 
 ってな感じでログイン成功したかどうか判定してやって、成功してたならば e.Session を LiveConnectClient型として受け取ってやるだけです。ね、簡単でしょう?





 この画像にあるボタンオブジェクトが、SignInButtonです。
 SignInButton のプロパティ値「Branding」を"Skydrive"にしておくと、このようにSkydriveへのサインインになります。もちろんWindowsLiveへのログインなど、他のものも設定できます。細かい話については他の人のblogとかを参考にしてね!(逃





 で、そのボタンを押すと、自動的にこんな画面に遷移します。あとはここにLiveIDとパスワードを入力してサインインし、アプリがアクセスすることを許可するためのボタンをポチっと押してやるだけです。ここら辺の処理はすべてLiveSDK内部に組み込まれているため、こちらが何か実装する必要は一切ありません。
 で、許可ボタンを押すとアプリの画面に戻って前述の「SessionChanged」イベントが発生する、という仕組みです。
 サンプルアプリを作ってみて試したところ、実にすんなり実装出来たので、よしではなな字引にも埋め込んでやろう……と思ったのですが、なな字引内ではなぜかSignInButtonを押したところでエラーになりました。(ここからが本題です)





 こんな感じの見慣れぬエラーが。
 「UnauthorizedAccessException」 というエラーメッセージを翻訳機にかけたところ、不正アクセス例外と出ました。どうも、何かへのアクセス権限がなくて怒られているらしいです。
 最初に疑ったのは、SignInButtonプロパティの「Scopes」の設定ミス。ここで、Skydriveへのアップデート権限を定義しているのですが、これのスペルミスとか。しかしどうも違うようで、次に疑ったのが「ClientId」のミス。LiveSDKを使うには、Liveの開発者用ページでアプリを登録しておき、ClientIdを取得しておいて、ボタンのプロパティ値に設定しておく必要があるのです。しかし、これも正しかった。
 では何ぞや……と、新規プロジェクトを作り直したり他のアプリに埋め込んでみたりと色々試行錯誤した結果、どうもなな字引だけがエラーになっているようでした。
 なな字引だけが他のアプリと特別違っているところ……特に心当たりがなかったので、もう手当たり次第に色々試していましたが、エラーは解決せず。そろそろ心が折れそうだと思っていたとき、ふと、気になる設定を思い出しました。

 WPのアプリは、必要とする権限を「WMAppManifest.xml」で定義しています。しかしこれ、実はAppHubへアップロードしたときに自動的に判定されるため、自分でいじる必要はさほどありません。
 しかし何回か前のアップデートのとき、「機械任せにせず、ちゃんと自分で明示的にアクセス権限を定義しておくのが礼儀だよね(キリッ」とか考えながら中身をいじっていたことを思い出しました。

 中身を確認すると…… <Capability Name="ID_CAP_WEBBROWSERCOMPONENT"/> がコメントアウトされていました。

 SignInButtonをクリックした直後の画面を、もう一度見てください。そう、これは内部的にWebBrowserComponentを使用しているのです。それのアクセス権限をはく奪していたからこそのエラーだったわけです。
 コメントアウトを解除したところ、正常にアクセスできるようになりました。こんなことで1日悩んでいた自分が恨めしい……ですが、WMAppManifest.xmlをいじったことを忘れていると、なかなか気付きにくいエラー原因かと思います。
 新規でプロジェクトを作る場合は引っかかりにくいとは思いますが、もし既存アプリへの機能追加を考えている人は、一応この点にも注意してみてください。