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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

Xamarin

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

Q&A

解決済

2回答

1283閲覧

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

IosifHuideyeren

総合スコア12

C#

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

Xamarin

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

0グッド

1クリップ

投稿2018/08/05 23:41

編集2018/08/05 23:48

前提・実現したいこと

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

CSharp

1using Prism; 2using Prism.Ioc; 3using Gribouillage.ViewModels; 4using Gribouillage.Views; 5using Gribouillage.Models; 6using Xamarin.Forms; 7using Xamarin.Forms.Xaml; 8using Prism.Unity; 9using Microsoft.AppCenter; 10using Microsoft.AppCenter.Analytics; 11using Microsoft.AppCenter.Crashes; 12using dotenv.net; 13using System; 14 15[assembly: XamlCompilation(XamlCompilationOptions.Compile)] 16namespace Gribouillage 17{ 18 public partial class App : PrismApplication 19 { 20 public App() : this(null) { } 21 22 public App(IPlatformInitializer initializer) : base(initializer) { } 23 24 protected override async void OnInitialized() 25 { 26 InitializeComponent(); 27 28 await NavigationService.NavigateAsync("NavigationPage/LoginPage"); 29 } 30 31 protected override void OnStart() 32 { 33 base.OnStart(); 34 35 DotEnv.Config(); // ここでエラーが発生します 36 37 AppCenter.Start("ios=" + VisualStudioAppCenterToken.IOsKey + 38 "android="+ VisualStudioAppCenterToken.AndroidKey, 39 typeof(Analytics), typeof(Crashes)); 40 } 41 42 protected override void OnSleep() 43 { 44 base.OnSleep(); 45 } 46 47 protected override void OnResume() 48 { 49 base.OnResume(); 50 } 51 52 protected override void RegisterTypes(IContainerRegistry containerRegistry) 53 { 54 containerRegistry.RegisterForNavigation<NavigationPage>(); 55 containerRegistry.RegisterForNavigation<MainPage>(); 56 containerRegistry.RegisterForNavigation<LoginPage>(); 57 } 58 } 59}

Gribouillage.Mobile/Gribouillage/Models/VisualStudioAppCenterToken.cs

CSharp

1using System; 2using dotenv.net; 3namespace Gribouillage.Models 4{ 5 public static class VisualStudioAppCenterToken 6 { 7 public static string AndroidKey => Environment.GetEnvironmentVariable("VsacAndroidKey"); 8 9 public static string IOsKey => Environment.GetEnvironmentVariable("VsacIosKey"); 10 } 11}

試したこと

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

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

C#

1public static class VisualStudioAppCenterToken 2{ 3 public static string AndroidKey => "VSAC_ANDROID_KEY"; 4 5 public static string IOsKey => "VSAC_IOS_KEY"; 6}

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

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

bash

1#!/usr/bin/env bash 2 3sed -i '' "s/VSAC_ANDROID_KEY/$VSAC_ANDROID_KEY/g" $APPCENTER_SOURCE_DIRECTORY/Gribouillage.Mobile/Gribouillage/Models/VisualStudioAppCenterToken.cs 4sed -i '' "s/VSAC_IOS_KEY/$VSAC_IOS_KEY/g" $APPCENTER_SOURCE_DIRECTORY/Gribouillage.Mobile/Gribouillage/Models/VisualStudioAppCenterToken.cs

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

投稿2018/08/06 05:14

編集2018/08/06 06:48
f-miyu

総合スコア1625

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IosifHuideyeren

2018/08/06 07:56

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

0

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

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

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

投稿2018/08/06 07:55

IosifHuideyeren

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問