質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • C#

    6543questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Xamarin

    454questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

クラウドのAPIキーを保管する方法を探しています

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 189

 前提・実現したいこと

GitHubとVisual Studio App Centerを使用しています。

レポジトリに含めずにクラウドのAPIキー(FirebaseとVisual Studio App Centerのキー)を保管する方法を探しています。

詳細は以下の通りです。

  1. ソースコードはGitHubのリポジトリで管理しています。ブランチはfix-key-ciです。
  2. APIキーは.gitignoreにバージョン管理に含めないように設定したC#のソースに隠しました。
  3. ローカルでのビルドでは当然ながら動きます。
  4. Visual Studio App Centerでは、当然APIキーを隠したC#のソースがないのでビルドが失敗します。
  5. dotenv.netを使うことを考えました。
  6. .envファイルがiOS上で読めないというエラーが発生してしまいます。

 発生している問題・エラーメッセージ

.envが見つからない、とのことです。

System.IO.FileNotFoundException: An enviroment file with path ".env" does not exist.
  at dotenv.net.DotEnv.ConfigRunner (System.Boolean throwOnError, System.String filePath, System.Text.Encoding encoding) [0x00020] in <826db58b798e422cba1ad96b2a8aad6b>:0
  at dotenv.net.DotEnv.Config (System.Boolean throwOnError, System.String filePath, System.Text.Encoding encoding) [0x00006] in <826db58b798e422cba1ad96b2a8aad6b>:0
  at Gribouillage.App.OnStart () [0x00008] in /Users/yusuke/Projects/Gribouillage/Gribouillage.Mobile/Gribouillage/App.xaml.cs:40
  at Xamarin.Forms.Application.SendStart () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Application.cs:305
  at Xamarin.Forms.Platform.iOS.FormsApplicationDelegate.FinishedLaunching (UIKit.UIApplication uiApplication, Foundation.NSDictionary launchOptions) [0x00036] in <0aa4434e6c8849f1bca03cc1ef0ae57c>:0
  at Gribouillage.iOS.AppDelegate.FinishedLaunching (UIKit.UIApplication app, Foundation.NSDictionary options) [0x00018] in /Users/yusuke/Projects/Gribouillage/Gribouillage.Mobile/Gribouillage.iOS/AppDelegate.cs:27
  at at (wrapper managed-to-native) UIKit.UIApplication.UIApplicationMain(int,string[],intptr,intptr)
  at UIKit.UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate) [0x00005] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.12.0.4/src/Xamarin.iOS/UIKit/UIApplication.cs:79
  at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0002c] in /Library/Frameworks/Xamarin.iOS.framework/Versions/11.12.0.4/src/Xamarin.iOS/UIKit/UIApplication.cs:63
  at Gribouillage.iOS.Application.Main (System.String[] args) [0x00001] in /Users/yusuke/Projects/Gribouillage/Gribouillage.Mobile/Gribouillage.iOS/Main.cs:17

 該当のソースコード

Gribouillage.Mobile/Gribouillage/App.xaml.cs

using Prism;
using Prism.Ioc;
using Gribouillage.ViewModels;
using Gribouillage.Views;
using Gribouillage.Models;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using Prism.Unity;
using Microsoft.AppCenter;
using Microsoft.AppCenter.Analytics;
using Microsoft.AppCenter.Crashes;
using dotenv.net;
using System;

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace Gribouillage
{
  public partial class App : PrismApplication
  {
    public App() : this(null) { }

    public App(IPlatformInitializer initializer) : base(initializer) { }

    protected override async void OnInitialized()
    {
      InitializeComponent();

      await NavigationService.NavigateAsync("NavigationPage/LoginPage");
    }

    protected override void OnStart()
    {
      base.OnStart();

      DotEnv.Config(); // ここでエラーが発生します

      AppCenter.Start("ios=" + VisualStudioAppCenterToken.IOsKey +
                      "android="+ VisualStudioAppCenterToken.AndroidKey,
                typeof(Analytics), typeof(Crashes));
    }

    protected override void OnSleep()
    {
      base.OnSleep();
    }

    protected override void OnResume()
    {
      base.OnResume();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
      containerRegistry.RegisterForNavigation<NavigationPage>();
      containerRegistry.RegisterForNavigation<MainPage>();
      containerRegistry.RegisterForNavigation<LoginPage>();
    }
  }
}

Gribouillage.Mobile/Gribouillage/Models/VisualStudioAppCenterToken.cs

using System;
using dotenv.net;
namespace Gribouillage.Models
{
  public static class VisualStudioAppCenterToken
  {
    public static string AndroidKey => Environment.GetEnvironmentVariable("VsacAndroidKey");

    public static string IOsKey => Environment.GetEnvironmentVariable("VsacIosKey");
  }
}

 試したこと

.envファイルはGribouillage.Mobile/Gribouillageディレクトリに埋め込みリソースで配置しました。

 補足情報(FW/ツールのバージョンなど)

Xamarin.Forms 3.1.0.583994Prism.Unity.Forms 7.0.0.396、Visual Studio for Mac 7.5.4を使用しています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

dotenv.netを使うのではなく、App Centerの環境変数を設定して、ビルド前に実行するスクリプトで、設定した環境変数を用いて、ソースコードを書き換えてしまえばいいと思います。

まずは、ここを参考にして、App Centerの環境変数を設定します。今回の場合は、VSAC_ANDROID_KEYVSAC_IOS_KEYという名前で設定したとします。

次に、環境変数に変更するソースコードを用意します。VisualStudioAppCenterToken.csを以下のように修正します。

public static class VisualStudioAppCenterToken
{
    public static string AndroidKey => "VSAC_ANDROID_KEY";

    public static string IOsKey => "VSAC_IOS_KEY";
}

VSAC_ANDROID_KEYVSAC_IOS_KEYが設定した環境変数に変更されます。

最後に、ビルド前に実行するスクリプトの作成を行います。appcenter-pre-build.shという名前で、.slnがあるフォルダ内と、Androidの.csprojがあるフォルダ内に作成します。(参考)
appcenter-pre-build.shは以下のように記述します。

#!/usr/bin/env bash

sed -i '' "s/VSAC_ANDROID_KEY/$VSAC_ANDROID_KEY/g" $APPCENTER_SOURCE_DIRECTORY/Gribouillage.Mobile/Gribouillage/Models/VisualStudioAppCenterToken.cs
sed -i '' "s/VSAC_IOS_KEY/$VSAC_IOS_KEY/g" $APPCENTER_SOURCE_DIRECTORY/Gribouillage.Mobile/Gribouillage/Models/VisualStudioAppCenterToken.cs

これで、App Centerでビルドすれば、うまく動くはずです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/06 16:56

    ご回答ありがとうございます。
    間違えて自己回答でコメントしてしまいました。
    あとで試してみます。

    キャンセル

0

ご回答ありがとうございます。
sedで置き換えるとは盲点でした。

ただ、ローカルでのビルドでも同様にやりたいので、やるとなると以下のやり方のほうが良さそうな気がします。
https://qiita.com/cheese_comer/items/82fbdb3ff66e7bc65fe4

ひとまず、後で試してみます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6543questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Xamarin

    454questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。