Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

Android P で targetSdkVersion を 28 に指定した場合に HTTP 通信が失敗する

こんにちは。エクセルソフトの田淵です。

Android P (API 28) から、App Transport Security(ATS)のように HTTPS 通信以外はブロックされるようになりました。

developer.android.com

クリアテキスト トラフィックをオプトアウトする

注: このセクションのガイダンスは、Android 8.1(API レベル 27)以下を対象とするアプリにのみ適用されます。Android 9(API レベル 28)以降では、クリアテキストのサポートがデフォルトで無効になっています。

とのこと。こんな感じで接続できません。

f:id:ytabuchi:20190826170553p:plain:w300

Android ネイティブと同じなので、Qiita の以下の記事をそのまま参照()しました。

qiita.com

方法は 3つあります。

1つは接続先のサイトが HTTPS になること。

後 2つは Android 側の設定を変更すれば対応できます。

手順は Windows の Visual Studio 2019 ですが、Visual Studio for Mac の場合も概ね同じ操作方法です。(xml の開き方が少し違う)

また、Xamarin.Android、Xamarin.Forms 共に操作するのは Android プロジェクトだけなので、同じ方法です。

network-security-config を使う方法

一番最初の Android Developer の記事

developer.android.com

にも詳しく書いてありますが、社内向けのアプリで追加の CA を信頼したり、デバッグ用の CA を追加したりする場合は、上記のページが参考になると思います。

Android プロジェクトの Resources フォルダ以下に xml フォルダを作成し、network_security_config.xml を作成します。

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>
  <base-config cleartextTrafficPermitted="false" /> <!-- デフォルトの設定 -->
  <domain-config cleartextTrafficPermitted="true"> <!-- ドメイン毎の設定 -->
    <domain includeSubdomains="true">10.0.2.2</domain> <!-- Debug port for localhost -->
    <domain includeSubdomains="true">www.mext.go.jp</domain>
  </domain-config>
</network-security-config>

サンプルとして、デバッグ用の localhost の IP アドレスと「文部科学省 http://www.mext.go.jp」を許可してみました。

その後、Properties フォルダ以下の AndroidManifest.xml を右クリックして、「ファイルを開くアプリケーションの選択」から「自動エディターセレクター (XML)」などで XML を開き、Application 内に以下の属性を追加します。

android:networkSecurityConfig="@xml/network_security_config"

Xamarin.Forms プロジェクトの manifest の場合は以下のようになりました。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
          android:versionCode="1" 
          android:versionName="1.0"
          package="dev.ytabuchi.xf_cleartraffictest" 
          android:installLocation="auto">
  <uses-sdk android:minSdkVersion="21" 
            android:targetSdkVersion="28" />
  <application android:label="XF ClearTrafficTest App"
               android:networkSecurityConfig="@xml/network_security_config">
    
  </application>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

この設定を行った後のビルドでは、標準で開くように設定してある Microsoft の WebView の記事の後で、入力欄に入力済みの文部科学省のサイトを開くと開けています。

その後、総務省 http://www.soumu.go.jp の URL を手動で入力して Go ボタンで移動してみると開けません。

以下、スクリーンショットです。(左が Xamarin.Forms で右が Xamarin Android)

f:id:ytabuchi:20190826170241p:plain:w300 f:id:ytabuchi:20190826174515p:plain:w300

f:id:ytabuchi:20190826174536p:plain:w300 f:id:ytabuchi:20190826174551p:plain:w300

f:id:ytabuchi:20190826170553p:plain:w300 f:id:ytabuchi:20190826174613p:plain:w300

App Transport Security と同じように個別に設定していくのでより安全な方法です。

もう 1つはすべての HTTP を許可する方法です。(今後の Google Play へのアップロードで network-security-config じゃないと許可されなくなるかもしれませんね。)

サンプルを作りました。(network-security-config ブランチ)

github.com

usesCleartextTraffic を使う方法

上記と同様に AndroidManifest.xml を開き、以下の属性を追加します。

android:usesCleartextTraffic="true"

Xamarin.Android プロジェクトの manifest は以下のようになりました。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
          android:versionCode="1" 
          android:versionName="1.0" 
          package="dev.ytabuchi.xa_cleartraffictest" 
          android:installLocation="auto">
  <uses-sdk android:minSdkVersion="21" 
            android:targetSdkVersion="28" />
  <application android:allowBackup="true" 
               android:icon="@mipmap/ic_launcher" 
               android:label="@string/app_name" 
               android:roundIcon="@mipmap/ic_launcher_round" 
               android:supportsRtl="true" 
               android:theme="@style/AppTheme"
               android:usesCleartextTraffic="true">
    
  </application>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

この設定を行った後のビルドでは、まったく同様の操作で、標準で開くように設定してある Microsoft の WebView の記事の後で文部科学省のサイトを開くと開けて、更に、総務省のサイト http://www.soumu.go.jp も開けています。

f:id:ytabuchi:20190826175421p:plain:w300 f:id:ytabuchi:20190826175438p:plain:w300

こっちの方が簡単ではありますね。

こっちのサンプルは manifest ブランチです。

github.com

Xamarin 気になった方は

Visual Studio 2019 をインストールして触ってみてください。手順書は 2017 のものですが こちらのエントリー が参考になるかと思います。 JXUG リンクページ に参考資料を纏めてますので併せてどうぞ。

エクセルソフトでは Xamarin のトレーニングサービスを行っています。基本的なアプリを手を動かし一緒に作ることで Xamarin を使えるようになって頂く内容ですが、ご要望に応じて講習内容のカスタマイズも可能です。詳しくは @ytabuchi まででお問い合わせいただくか、下記のページをご覧ください。

Xamarin トレーニング : XLsoft エクセルソフト

Xamarin の情報が欲しい方はこのブログも購読いただいたり、私のTwitterアカウントをフォローいただいたりすると嬉しいです。

私が所属している エクセルソフト の宣伝を少しさせてください。弊社は開発者向けの様々なソフトウェアを扱っています。Office/PDF ファイルを .NET/Java で操作するライブラリ Aspose(アスポーズ)、Windows アプリ、Web ページ、iOS/Android アプリの UI テストができ、RPA ツールとしても使える TestComplete などお勧めです(^^) また、Visual Studio Professional/Enterprise with MSDN も販売してますし、日本で売っていない海外のソフトウェア、開発ツールなどを弊社経由で日本円で購入頂くことも可能です。ご興味あれば覗いてみてください。

以上です。

エクセルソフト | ダウンロード | 学習用リソース | JXUG リンクページ | ブログ購読