プログラムTips
プログラムに使えそうなサイトいろいろ列挙します
MITライセンスの使い方
http://www.catch.jp/oss-license/2013/09/27/mit_license/自作ソースコードに、MITライセンスを適用する3つのやり方 | オープンソース・ライセンスの談話室
メールライブラリ
github.com
配列を一つの値で初期化
challengeandresponse.blogspot.jp
neue cc - Reactive Extensions入門 + メソッド早見解説表
[Unity] ネットワークの接続状態を取得する | ftvlog
PCLの暗号化ライブラリ
www.nuget.org
Unity 〜 バックグラウンドへの移行と復帰を検知する方法 〜
Windowsサービスを楽に開発~TopShelf~Windowsサービスを楽に開発~TopShelf~ | 84zume Works
C#でお手軽ファイル暗号化
適当なクラスをMessagePackでシリアライズしてからAESで暗号化してファイルに保存、保存したファイルから複合化してデシリアライズしてみました。
今回のソースは以下で公開しています
github.com
シリアライズに使用したMessagePackについては
neue cc - C#(.NET, .NET Core, Unity, Xamarin)用の新しい高速なMessagePack実装
を参考にしてください。
MessagePackAnalyzerをインストールしないとMessagePack関係のコーディングが面倒なので気をつけてください
シリアライズするクラスはPublicにしないと例外が出ます。うっかりPublicを付け忘れると悲惨なことになります。
以下は暗号化関係のソースです
https://github.com/reniris/EasyEncrypt/blob/05dceefdc37aa0a3617c68faa40d664705f244b8/EasyEncrypt/Encrypt.cs
暗号化、複合化部分は抽象化してあるので、拡張しやすくなっているはずです。
暗号化キーは、指定されていない場合は自動生成するようになっています。
最初の一回だけキーを生成してどこかに保存しておいて、次からはそのキーを使うというようなやり方を想定しています。
ネットにある暗号化のサンプルはキーを直接ソースに書いてあるのが多かったので、ソースにキーを書かないことを意識しました。
Xamarinでツイートアプリつくるよ(5) トークンを再利用する
前回のプログラムではアプリを再起動するたびに認証されていたが、今回は認証情報を保存して、一度認証できれば以降認証しないようにした。
MainSetting.csを更新
中身は以下URL
NyanTweet/MainSetting.cs at 8ed0211012ad24ea7f56b738417dcf180e5b9dce · reniris/NyanTweet · GitHub
Tweet.csを更新
NyanTweet/Tweet.cs at 8ed0211012ad24ea7f56b738417dcf180e5b9dce · reniris/NyanTweet · GitHub
MainPageViewModel.csを更新
中身は以下URL
NyanTweet/MainPageViewModel.cs at 8ed0211012ad24ea7f56b738417dcf180e5b9dce · reniris/NyanTweet · GitHub
MainSetting.csについて解説
アクセストークンをプロパティに追加
ファイルへの読み書きタイミングを調整
読み込みをLoad関数に、書き込みをSave関数にまとめました。
setterがprivateの場合[JsonProperty]属性がないとシリアライズ・デシリアライズできないので注意
Tweet.csについて解説
ツイートと認証を分離
MainPageViewModel.csについて解説
コマンドにファイルの読み書きを明示的に追加
プロパティのsetterでファイル書き込みするとタイミングによっておかしなことになるため、ファイル書き込みは明示的に関数で設定するように変更しました。
参考サイト
github.com
Xamarinでツイートアプリつくるよ(4) Twitter認証PINなし そして絶望へ
ツイートアプリを名乗っているくせにTwitterのTの字すら出てこなかった当アプリですが、今回とうとうTwitter認証を実装します。
PINを使用せずに認証しようとしたらうっかり地獄の蓋を開けてしまいました
今回の記事を含むソースは以下に公開しています(APIキーなどを除く)
GitHub - reniris/NyanTweet: 定型短文ツイートプログラム
方法は以下を参照
wplogs.com
リソースファイルTwitterAPIKey.resxをNyanTweetプロジェクトへ追加して、AccessToken、AccessTokenSecret、APIKey、APISecretを文字列リソースとして追加しておいてください。ここはGitHubには公開されていません
- Twitter認証クラスを実装
PINを使用して認証する場合
var session = CoreTweet.OAuth.Authorize(ConsumerKey, ConsumerSecret); var url = session.AuthorizeUri; Device.OpenUri(new Uri(url)); string PINcode; //ここにPINを入れる tokens = CoreTweet.OAuth.GetTokens(session, PINcode); var res = await tokens.Statuses.UpdateAsync(new { status = "にゃーん" });
こんな感じで簡単に書けるのですが、PINを使わない場合はそう簡単にいきません。
ググってもなかなかいい感じのコードが見つからなくて苦労しました。
PINを使わずに認証する場合はコールバックURLが必要です。Twitter Appshttps://apps.twitter.com/で適当なURLを設定しておいてください。プログラムで使うURLと違っていても大丈夫です。
ASP.NETでのコールバックURLは使用例が見つかったのですが、Xamarinではどうすればいいかわからずにしばらく悩む羽目になりました。
どうやらカスタムURLスキーマというものを使って自分自身を再起動すればいいようです。二重起動しないよう念のためLaunchModeをLaunchMode.SingleTaskにしておいてください。
カスタムURLスキーマの設定方法はちょまどさんのサイトを参考にしてください
chomado.com
Twitter認証をざっくり解説
- ブラウザで認証ページを開いてコールバックでパラメータを取得
Device.OpenUri(new Uri(session.AuthorizeUri));でええやんと思っていたら結果を待ってくれないので、結果を待ってくれる機種依存コードを
xamarinhelp.com
forums.xamarin.com
を元に実装、だがどうやってもキャンセルが返ってくるという謎の現象に悩まされるため、OnActivityResultではなくOnResumeを使うことにした。
しかしsession.AuthorizeUriにはパラメータが入らないことに気づかず絶望、数日悩む羽目になった。
パラメータはコールバックのカスタムURLスキーマについているため、OnResumeからURLを返すように変更してようやくパラメータを取得できた。
- クエリパラメータをパース
ネットで見つけたコードをそのままコピペ。特に難しいことはない。
- oauth_token と oauth_verifierを取得
もう何も怖くない
- トークン取得して有効性確認
var res = await t.Account.VerifyCredentialsAsync(); if(res.IsVerified == false) return null;
とかやってたせいで常にnullが返っていた。最後の最後まで苦しめてくれます。
当方にはMacもiPadもないのでiOS部分は実装していません。今回実装されたAndroid版をもとに誰か実装してください。
あと、今回のバージョンではアプリを再起動するたびに認証を求められます。この辺はあとで修正します。
Xamarinでツイートアプリつくるよ(3) ファイル読み書き
ファイルへ設定を保存できるようにするよ
設定をJSON形式で読み書きするからPCLStorageとJSON.NETをNugetで追加しておいてね
MainSetting.csを更新
中身は以下URL
https://github.com/reniris/NyanTweet/blob/835cbb0523cf537c34cb6574a845d6de39d53d0b/NyanTweet/NyanTweet/Model/MainSetting.cs
MainPageViewModel.csを更新
中身は以下URL
https://github.com/reniris/NyanTweet/blob/835cbb0523cf537c34cb6574a845d6de39d53d0b/NyanTweet/NyanTweet/ViewModel/MainPageViewModel.cs
MainSetting.csについて解説
JSONへシリアライズ、デシリアライズ、ファイルへの読みこみ、書きこみを追加
インスタンスの作成を必ずファイルから読むように変更して、ファイルがない場合はデフォルト値をnewするようにしました
MainPageViewModel.csについて解説
58行目
private MainSetting _setting = MainSetting.LoadJson();
ファイルから設定を読み込むように変更
この変更を実装することによって、真ん中の大きいボタンに表示されている文言を変更した後、再起動しても変更されたままにすることができます。
Xamarinでツイートアプリつくるよ(2) ボタンにコマンドをバインディング
今回はメインのUIを作ってボタンクリックでコマンドを実行するよ
必要なライブラリReactivePropertyをインストールするために、PCLプロジェクトを.NET Standardに変更しておいてね
やり方はググれ。VisualStudio2015だとなぞのビルドエラーがたくさん出て、夜眠れなくて朝起きれないことになるのでVisualStudio2017を使おう
ダウンロードサイトはこちら
www.visualstudio.com
日本語サイトはわからなかったけど、このページからダウンロードできない英語力ではプログラムなんてできないのであきらめよう
NugetでReactivePropertyを検索してインストール
.Net Standardプロジェクトになっていればインストールできるはず
それらが終わったらクラスを追加していきます
まずは設定用のModel、MainSetting.csファイルを追加
中身は以下URL
NyanTweet/MainSetting.cs at 08034ba7a8a27b7dfe6fb5badea5f88fbded3b8b · reniris/NyanTweet · GitHub
プロパティ一つとデフォルトの文字列があるだけのクラスです
ViewModel、MainPageViewModel.csを追加
中身は以下
NyanTweet/MainPageViewModel.cs at 08034ba7a8a27b7dfe6fb5badea5f88fbded3b8b · reniris/NyanTweet · GitHub
UIにバインディングするプロパティとコマンドです
View、MainPage.xamlを追加
中身
NyanTweet/MainPage.xaml at 08034ba7a8a27b7dfe6fb5badea5f88fbded3b8b · reniris/NyanTweet · GitHub
メインのUIです
MainPage.xamlについて解説
8行目
<ContentPage.BindingContext> <vm:MainPageViewModel /> </ContentPage.BindingContext>
これでバインディングが可能になります。WPFでいうDataContextです。
13行目
<Button Text="{Binding TweetWord.Value}" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" FontSize="Large" Command="{Binding TweetCommand}" />
メインの大きいボタンです。
表示テキストにTweetWordプロパティ、コマンドにTweetCommandプロパティをバインドしています。TweetWord.ValueとなっているのはReactivePropertyを使っているからです。
他のコントロールについては変わりないので特に解説しません。
MainPageViewModel.csについて解説
92行目
this.TweetCommand.Subscribe(_ => this.Message.Value = this.TweetWord.Value);
これだけで大きいボタンを押すと、下のほうにメッセージを出すことができます。
Xamarinでツイートアプリつくるよ(1) まずは最初のPageを差し替える
Xamarinの練習のためにツイートプログラムを作るよ
まずはXmarinのプロジェクトを作る(ここはほかのサイトのほうが詳しい)
それから、View、ViewModel、Modelフォルダを作る
ViewにMainPage.xamlを作って
App.csのコンストラクタを以下のように変更
public App() { this.MainPage = new View.MainPage(); }
こうすると、最初に表示されるページがMainPage.xamlに差し替えられるよ
今回の記事で使っているソースコードはGitHubで公開しています
まだたいしたことはできないけど、最終的には設定した文を手動ツイートするプログラムになる予定だよ