読者です 読者をやめる 読者になる 読者になる

くうと徒然なるままに

超高校生級のXamariner です。

Visual Studio Team Services で Xamarin.iOS をビルドする!

Xamarin.iOSVSTS でビルドする

VSTS とは

VSTS とは、 Microsoft の提供している開発者が開発を効率的に行えるようにするサービスです。

VSTS に含まれている機能

アジャイル開発とかをしやすくするための機能がたくさん含まれてます。 今回は、VSTS 自体についての記事ではないので詳しくは、ぐぐってください。

やっていく

VSTS で Xamarin.iOS のプロジェクトをビルドするための ビルド構成を作る

VSTS で Xamarin.iOS をビルドするときに、 Xamarin.Android のプロジェクトが混じっているとビルドに失敗します。 ということで、新しく、 Xamarin.iOSをビルド専用のビルド構成 を作ります。

Visual Studio で Xamarin,iOS の含まれているソリューションを開き、構成マネージャーを開いて新規構成を選ぶ

この時に、設定のコピー元は、 Release を選んだ方がいいと思います。

Xamarin.iOS のビルドに必要なプロジェクト以外のチェックを外して、 iOS Release という名前で保存する

自分の場合、こんな感じになりました。

これを、アクティブソリューションプラットフォームを iPhone, iPhone Simulator と2つ切り替えて設定します。

Github との連携設定

今回は、 Github においてある Visual Studio の Xamarin Template で作ったまんまの コードをビルドしていきたいと思います。

Github との連携するために Github による VSTS に対する認証が必要です。

ここで、 上部にあるツールバーの一番右に配置してある歯車のアイコンにマウスをホバーさせると出てくるメニュー の中から Services を選択します。

Services の画面

New Service Endpoint の部分をクリックし、 出てくるドロップダウンボックスから Github を選択します。

すると、Github との連携の設定画面が出てきます。 Authorize をクリックしてください。

出てきた、 Github との連携の設定画面

ID/Pass を入力して、認証してください。 Github との認証が完了した画面

iOS アプリをビルドするために手持ちの Mac マシンに Build Agent をインストールしてく

現在、 VSTS で提供されている ビルドマシンは、以下の3種類あります。
ビルドマシンは、 VSTS でアプリ等をビルドするタスクが発行されたときにビルドをするためのマシンです。

  • Hosted (メイン, Windows機)
  • Hosted Linux Preview (プレビュー, Linux)
  • Hosted VS 2017 (プレビュー, Windows)

名前を見ればどのようなマシンかはわかるかと思います。
まぁ、プレビューなので選択しは実質1つだけですが。

iOS アプリのビルドをするためには、 Mac マシンが必要

iOS アプリをビルドするためには、 Apple利用規約の関係で Mac マシン上でビルドしなければいけません。
ところが、VSTS でビルドのために使えるマシンは、上で書いてあるように、 Windows (一応、Linux)しかありません。 Mac は使えない感じです。

どうすれば、 iOS アプリをビルドできるでしょうか?

ちゃんと、やり方は用意されています。
手元にある Mac マシンをビルドするために使います。具体的には、 VSTSiOS アプリのビルドするタスクが呼び出されたら、 VSTS の Build Agent がインストールされたマシンが代わりにビルドを行います。

Build Agent … 知らない子ですね。

Build Agent とは、

Build Agent とは、 Hosted ビルドマシンでは無理な場合(今回のように Mac が必要なときや、Hosted マシンの1か月の利用時間制限を使い切ってるとき)に設定して使うときに使うソフトウェア?です。

VSTS のサイトから無料で入手することができます。

今回は、このソフトウェアを Mac マシンにインストールしていきます。
(Mac Book Air をビルドマシンにしてるから、Mac mini ほしい…)

www.amazon.co.jp

Build Agent を入手する

Build Agent は上でも書いた通り VSTS のサイトから入手することができます。 具体的には、 設定画面Agent QueueDownload Agent のボタンからダウンロードで入手できます。

Build Agent を Mac へ設定している様子を動画で撮影してみました。

Build Agent にした Mac マシンでビルドするための証明書を作る

iOS アプリをビルドするためには、 アプリパッケージを作るための、証明書が必要です。 しかし、証明書を作るためには、 XCode を利用して作られます。つまり、Xamarin Studio や Visual Studio では作成できない。 また、証明書の判別は、 Bundle identifier を利用して行われています。
ということで、

Xcode でダミーのプロジェクトを作成し、 Xamarin.iOS のプロジェクトの Bundle identifier と同じにして証明書を作ってあげる必要があります。 証明書の作成は、 XCode で、 Bundle identifier を同じにした 適当な iOS アプリをシミュレーターで動かすだけでおkです。

今回の場合は、 Build Agent に設定してあるマシンでも証明書を作らなければいけないので、下準備として、

Build Agent に設定してある Mac マシンの Xcode 上で Xamarin.iOSBundle identifier な証明書を作成する必要があります

新しいビルド定義を作成する

VSTS では、ビルド定義に従って、ビルドを行っていきます。まず、ビルド定義を作成していきます。

ダッシュボードにアクセス

ダッシュボードにアクセスするところから始めていきます。

Build && Release タブへ移動

継続的インテグレーションやリリースの管理はこのタブで行います。
すでに、 Android のビルド定義が1つされている感じです。

新しいビルド定義の作成

+New の部分をクリックして、新しいビルド定義を作成します。

新しいビルド定義ができた!

Github にある ビルドしたリポジトリを指定する

VSTS 自体にもコードを管理する機能がついています。しかし、ほかの ツール等への移行をしようとしたときに辛みが出てくるので、今回は、 Githubホスティングしているリポジトリをビルドしていきます。

Github にある リポジトリやブランチの選択

Xamarin Component Restore のタスクを削除

今回ビルドするプロジェクトでは、 Xamarin Component は使ってないため、タスクを削除します。

Xamarin.iOS のビルド設定

たぶん、一番メインのタスクです。

ビルドするソリューションの選択

ビルドするを選択するためにファイルピッカーを開いて設定していきます。

Xamarin Test Cloud のタスクを削除

Xamarin Test Cloud は様々なデバイスでのUIテストを行ってくれるものですが、今回は使用しないので削除します。

設定が完了

これで、ほとんどの設定が完了しました。

それでは、、、

設定を保存してから

ビルドするマシンを先ほど設定した Mac に変更して、

ビルド設定を iOS Release に変更、、、

緊張の…

ビルド…

成功!!

Xamarin.AndroidVSTS でビルドしたい場合は、こちらを見てね!

goo.gl

参考情報

VSTS + Xamarin (+ HockeyApp + Test Cloud) リンク集 – ちょ窓帳

Build your Xamarin app

Continuous Integration for iOS Apps with Visual Studio Team Services | Xamarin Blog

24 時間自宅で動かせる Mac 開発機がほしい!!!!!!!!!!!!!

www.amazon.co.jp

VSTS でビルドが完了したら Twitter に投稿する Microsoft Flow を作ってみた

VSTS でビルドが完了したら Twitter に投稿する Microsoft Flow を作ってみた

Microsoft Flow とは

サービス連携を簡単に、コーディングしなくても作成できるサービスです。
今回のように、VSTSTwitterだけでなく SlackやOnedriveとも連携できたりします。似たようなサービスはいろいろあるのですが、Microsoft Flow はMicrosoftが提供しているのもあってMicrosoftのサービス、特に Azure との連携が強化されています。

VSTS (Visual Studio Team Services) とは

Microsoftの提供している、チームでアプリケーションを開発するのを助けれくれるツール群の総称です。
継続的インテグレーション、自動テストやバックログ、タスクの管理などなど、さまざまな機能があります 特にアジャイル開発などに特化しています。

やっていく

1. 新しい フロー を登録する

Microsoft Fow では、サービス同士を連携させるための設定単位を フロー という名前で管理しています。

今回は、1からフローを作っていきます。テンプレートを使用することで楽に作れますが。。。

2. フローを編集していく

VSTS との連携を設定していく

フローの起点になるようなサービスを トリガーといいます。 今設定しているのは、トリガーです。

現れた画面のテキストボックスに Visual Studio Team Services と入力してください。

Visual Studio Team Services のアイコンが出てきます。    トリガーと書かれたリストビューにある、 Visual Studio Team Services - Buld Complete をクリックしてください

VSTS との連携設定に画面がでてきます。 どの VSTS アカウントと連携するのか、どのプロジェクトと連携するのか、ビルド結果でフィルターをかけるのか等を設定できます。

以下の場合は、 fumiya-kume というアカウントの、 AutoCalc というプロジェクトの、ビルドが成功したときにトリガーが発動するようになっています。

Twitter との連携を設定していく

Twitterとの連携を設定するために、 新しいステップをクリックしてください

先ほどと同じように出てきた検索ボックスへ Twitter と入力します。

ツイートの投稿の部分をクリックします。 また、TwitterMicrosoft Flow の連携が済んでない場合はここでします。

ツイートするテキストの編集をします。

ただ単に文字をツイートするだけでなく、 VSTS のビルド結果も参照できるので、インタラクティブなツイートをできます。

ちらっと入力してみました。

右上の フローの作成 をクリックして完了です。
名前は付けなくても大丈夫です。よしなにいい名前をMicrosoft Flow がつけてくれます。

わーい!

ビルドするよ!

ビルドに成功したよ!

無事にツイートされたよ!

Android で 端末内にファイルが保存されたらアレコレしたいアプリの作り方

環境

解説

Android で、 ファイル操作に関する変更通知を受け取るために、 FileObserver というクラスがあります。 https://developer.android.com/reference/android/os/FileObserver.htmldeveloper.android.com FileObserver を継承したクラスを作りそこから 関数を呼び出してアレコレできます。

ソースコード

// import は省略

public class ObserbleFolder extends FileObserver {

    public ObserbleFolder(String path) {
        super(path);
    }

    @Override
    public void startWatching() {
        
        super.startWatching();
    }

    // 監視を終了したいときは、このメソッドを呼ぶ
    @Override
    public void stopWatching() {    
        super.stopWatching();
    }

    // ディレクトリ内で、変化が起きたら呼ばれるイベント
    @Override
    public void onEvent(int event, String path) {
        if(event == FileObserver.CREATE) {
            // 監視してるディレクトリ内でファイルが作成されたら呼ばれるメソッド
            }
        }
    }
}

Visual Studio Team Services で Xamarin.Android をビルドする!

VSTS こと、 Visual Studio Team Service とは、Microsoftが提供しているチームでの開発を支援するための環境です。

Visual Studio Team Services 以下、VSTS と記述します。

VSTS を使うメリット

Xamarin.Android と同じ会社が作っている製品ということで、 Xamarin のサポートが強力

たとえば、Xamarin Test Cloud を使う機能が標準で入っていたりします。 また、 Visual Studio 内からも少しごにょれるなど、 Xamarin の開発を行う上で、自然と使えるようになってます。

無料ではじめれる

5人までなら無料で使い始めれる、ビルドをいくつまで並列で行えるかのパイプラインも1本ならは無料で使えます。 お金がない自分にとっては、最適だとおもいました。

やること

1. VSTS のダッシュボード画面を開く

VSTS のアカウントは事前に作成してある前提で話を進めていきます。 また、新規プロジェクトを立ち上げてある状態です。

VSTS のダッシュボード画面

2. Github との連携

今回は、 Github においてある Visual Studio の Xamarin Template で作ったまんまの コードをビルドしていきたいと思います。

Github との連携するために Github による VSTS に対する認証が必要です。

ここで、 上部にあるツールバーの一番右に配置してある歯車のアイコンにマウスをホバーさせると出てくるメニュー の中から Services を選択します。

Services の画面

New Service Endpoint の部分をクリックし、 出てくるドロップダウンボックスから Github を選択します。

すると、Github との連携の設定画面が出てきます。 Authorize をクリックしてください。

出てきた、 Github との連携の設定画面

ID/Pass を入力して、認証してください。 Github との認証が完了した画面

3. ビルドタブへ移動

以下の写真に従い、 ビルド&リリース タブへ移動します。

ダッシュボード画面からビルド&リリース画面への移動

VSTS の ビルド&リリース画面

4. 新しいビルド定義を作成

ビルド定義とは、VSTS で Xamarin.Android をビルドするときにどのような方法でビルドするのか、どこへデプロイするのか、とかを決めます。基本的には、ここを編集していきます。

以下の写真のように、新しいビルド定義を作成します。 ビルド定義のテンプレートはいくつかありますが、ここでは、 Xamarin.Android の定義を使って作成していきます。

新しいビルド定義を作成する画面

Xamarin.Android のビルド定義を選択している画面

Xamarin.Android のビルド定義を作成し終えた画面

すでに、少しエラーが出てますね(^^;

5. 最低限必要ないプロジェクトを削除する

Xamarin Component Restore のタスクを削除する

とりあえず、 Xamarin Component Restore のタスクは今は必要ないので、削除します。

Xamarin Component Restore を削除している画面

Xamarin Test Cloud のタスクを削除

先ほどと同じように Xamarin Test Cloud のタスクも削除してください。

Xamarin Test Cloud のタスクを削除している画面

必要のないタスクを削除したあとの画面

6. Github からソースを取り込む設定をする

今回は、 Github で作成している Xamarin.Android のプロジェクトをビルドしていくので、

以下のように Get Source をクリックすると、ソースコードを取り込む元を選択できます。ここでは、 Github を選択してください。

7. ビルドするプロジェクトを指定する

Xamarin.Android のテンプレートで作成したビルド定義は、 .Droid と名前のついたプロジェクトを Xamarin.Android のプロジェクトと判断して、よしなにビルドしてくれます。
しかし、最新の Xamarin の作成する Xamarin のプロジェクトの名前は、 hoge.Android という形になっています。 そこで、少し手を加えてあげる必要があります。

Before

After

まだ続きます。

以前私のブログで紹介したバッドノウハウを使わなければいけません。
具体的には、 Xamarin.Android プロジェクトのビルド時にJDK8 を使うように明示的に指定しなければいけないgoo.gl

以下の感じで設定してあげてください。

Before

After

8. ビルドを実行する

ついに、ビルドの時間がやってきました。

右上の Save & Queue をクリックしてください。

Agent Type を Hosted へ変更し、 Queue をクリックすれば、完了です。

View post on imgur.com
i.imgur.com

おまけ

VSTS のビルドが成功したら Twitter に通知したりもできます ネコミミー

VSTS で Xamarin.Android のプロジェクトを ビルドしようとすると、 cannot access java.lang.Object ってエラーが出るから解決してみた

VSTS で Xamarin.Android をビルドしようとしたら、以下のようなエラーが出ました。

C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1862,3): Error : java\lang\Object.class(java\lang : Object.class)
cannot access java.lang.Object
Process 'msbuild.exe' exited with code '1'.

ぐぐったら以下のような情報にたどり着きました。

That error is telling you that the Java Class version that is being loaded was compiled with Java 8 (52) but Java 7 (51) is trying to load that compiled class. forums.xamarin.com

ふむ、

## JDK 8 でビルドされたクラスに JDK 7 を使用した状態で、アクセスしようとしているのか。

# そもそも、VSTS で現在ビルドしているAgent に JDK 7が入ってないのかなと思って少し調べてみました。

ちなみに、Hosted Agent でビルドしています。

Java Standard Edition Development Kit 1.8

www.visualstudio.com

ふむ、JDK 8 はちゃんと入っている。。。

# 解決方法は、 VSTS の Buld Defined で 明示的に JDK 8 を使用するように指定すれば大丈夫です。

Build Xamarin.Android Project の設定欄にある、 JDK Archtecture の設定項目を JDK 8 に変更すればいい感じです。

# わーい

# 参考ページ http://www.jamessturtevant.com/posts/Failed-build-in-Visual-Studio-Team-Services-after-xamarin-upgrade/www.jamessturtevant.com

株式会社はてなに入社しました

株式会社はてなに入社しました

今年も入社してみました。

株式会社はてなに入社しました - hitode909の日記

# Android の DCIM 上にある画像ファイルを ImageView に表示する

環境

やったこと

MainActivity.java

// Import とかは省略

public class MainActivity extends AppCompatActivity {

    public android.widget.ImageView ImageView;
    public Button Button2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView = (android.widget.ImageView)findViewById(R.id.imageView);
        Button2 = (Button) findViewById(R.id.button2);
        Button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // DCIM へのパスを取得
                File dir = new File(Environment.getExternalStorageDirectory() + "/" + Environment.DIRECTORY_DCIM );
                // DCIM 上の画像ファイルへのパスを設定
                File file = new File(dir.getAbsolutePath()+"/image.jpeg");
                // 正しい画像へのパスが取れているか確認のためにログ出力
                Log.d("画像を表示させるやつ",file.getPath());
                // 画像ファイルが存在してないときは Image View に表示させないようにしている
                if (file.exists()) {
                    // 画像が存在していたら ImageView に表示させる
                    ImageView.setImageBitmap(BitmapFactory.decodeFile(file.getPath()));
                }else{
                    // 画像ファイルを見つけれなかったら、調査のためにログ出力
                    Log.d("StorageAccessTest","File not found.");
                }
            }
        });

    }
}

AndroidManifest.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

実行結果

はまったこと

画像ファイルがあるはずなのに、 画像ファイルを見つけることができずに file.exists() が False を返していました。

原因を探ってみると、 Permission へ記述しなければいけないようでした。