xamarinでDropBox連携チュートリアル


xamari.formでDropboxApiを利用します。
[チュートリアル](https://www.dropbox.com/developers/documentation/dotnet)を参考に試してみました。

## 前提
開発者向けのDropBox連携(≠ユーザーのDropBoxに連携では無い）
環境：VisualStudio for mac

ソース
https://github.com/xamarin-okinawa/sample-dropbox

下記トークンをDropBoxで取得したGenerated access tokenに書き換えれば動作します。
DropBoxSamplePage.xaml.cs

```csharp
private static string _GeneratedAccessToken = "Input Generated Access Token";
```

## 1.DropBoxでApp登録
アクセスキーが必要なのでDropBoxでAPP登録をしてGenerated access tokenを取得します。
<img width="854" alt="スクリーンショット 2017-06-25 18.45.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/48623/94a8d641-644d-6d68-aed9-2459451cc93d.png">



## 2. プロジェクトを作成
いつも通り空のプロジェクトを作成
<img width="1524" alt="スクリーンショット 2017-06-25 18.36.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/48623/7863246e-39fc-9c93-95a8-7cb59465217e.png">

## 3. パッケージをインストール
チュートリアルの[インストール](https://www.dropbox.com/developers/documentation/dotnet#install)に従ってDropBoxAPIをインストールします。
<img width="1524" alt="スクリーンショット 2017-06-25 18.38.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/48623/8f377522-85b2-8df7-924c-29c1a964c3c3.png">

## 4. DropBoxAPI接続確認
必要はパッケージは揃ったのでチュートリアルソースを元にサンプルを作成します。

```xml
.xaml
<Button x:Name="buttonConfim" Text="接続確認" />
```
 
```csharp
.cs
        public DropBoxSamplePage()
        {
            InitializeComponent();

            buttonConfim.Clicked += ButtonConfim_Clicked;
        }

		void ButtonConfim_Clicked(object sender, EventArgs e)
		{
            var task = Task.Run((Func<Task>)Confirm);
			task.Wait();
		}

        /// <summary>
        /// DropBox接続確認
        /// </summary>
        /// <returns>The confirm.</returns>
        private async Task Confirm()
        {
            using (var dbx = new DropboxClient(_GeneratedAccessToken))
            {
                var full = await dbx.Users.GetCurrentAccountAsync();
                System.Diagnostics.Debug.WriteLine("{0} - {1}", full.Name.DisplayName, full.Email);
            }
        }
```

これで画面を立ち上げてボタンクリックで確認。
<img width="487" alt="スクリーンショット 2017-06-25 19.03.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/48623/0270d7f9-1ad5-018c-62e3-f8a640d00835.png">

アプリケーション出力で開発者の情報が確認できればOK
<img width="426" alt="スクリーンショット 2017-06-25 19.01.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/48623/344acc82-e764-7b67-819b-e7d3f867c458.png">


## 4. テキストファイルアップロード
チュートリアルのもうひとつ。
ファイルのアップロードを試してみます。

```xml
.xaml
        <Entry x:Name="entText" Placeholder="文字を入力してください" />
        <Button x:Name="buttonOK" Text="ファイル更新" />
```


```csharp
.cs
        public DropBoxSamplePage()
        {
            InitializeComponent();


            buttonOK.Clicked += ButtonOK_Clicked;
            buttonConfim.Clicked += ButtonConfim_Clicked;
        }

		void ButtonOK_Clicked(object sender, System.EventArgs e)
		{
			var task = Task.Run((Func<Task>)Upload);
			task.Wait();
		}

		/// <summary>
		/// DropBoxアップロード
		/// </summary>
		/// <returns>The confirm.</returns>
		private async Task Upload()
		{
            string folderName = "datas";
			string fileName = "otameshi.txt";
			string content = entText.Text;

			using (var dbx = new DropboxClient(_GeneratedAccessToken))
			{
               
                using (var mem = new MemoryStream(Encoding.UTF8.GetBytes(content)))
				{
					var updated = await dbx.Files.UploadAsync(
						"/" + folderName + "/"  + fileName,
						WriteMode.Overwrite.Instance,
						body: mem);
					System.Diagnostics.Debug.WriteLine("Saved {0} rev {1}", fileName, updated.Rev);
				}
			}
		}
```

画面を起動して確認
<img width="487" alt="スクリーンショット 2017-06-25 19.39.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/48623/03059bdc-cecc-ed25-c4ea-d23834e07b43.png">


ファイル更新ボタンをクリックしDropboxでファイルが作成されていればOK
![スクリーンショット 2017-06-25 19.40.54.png](https://qiita-image-store.s3.amazonaws.com/0/48623/d5144a28-5294-dfab-f7c1-8570b6d74b5f.png)
![スクリーンショット 2017-06-25 19.41.01.png](https://qiita-image-store.s3.amazonaws.com/0/48623/ca7b206a-a0e3-d506-df54-9d4f664fe07f.png)

# まとめ
今回は開発者のDropBoxの連携でしたが、
次はユーザーのDropBox認証について検証します。