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

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

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

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Xamarin

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

Q&A

解決済

2回答

3215閲覧

Xamarin.forms iOS C# 端末情報取得

mahoken

総合スコア85

C#

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

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Xamarin

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

0グッド

0クリップ

投稿2018/07/03 04:52

編集2018/07/03 09:08

前提・実現したいこと

Xamarinを用いてiOSアプリ/Androidアプリの開発を行なっています。
MobileTraderディレクトリにある共通ファイルで、iPhoneの端末情報(iPhone6なのかiPhone7なのか)を取得したいです。

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

MobileTrader.iOSディレクトリにあるファイルでは、下記コードで端末情報の取得に成功していますが、
MobileTraderディレクトリにある共通ファイルで、同じコードを記載したところ、Xamarin.iOS~~の下に赤線でエラー表示がされてしまいます。
(Mobile.iOSが読み込まれない?)

// 端末情報取得 ( 例: iPhone X Emulator ) DeviceData = Xamarin.iOS.DeviceHardware.Model

試したこと

using でXamarin.iOSも読み込むこともできませんMobileTrader.iOSも読み込むことができませんでした。

DependencyService 検証コード

MobileTrader / IPlatformInfo.cs

namespace MobileTrader { public interface IPlatformInfo { string GetDeviceModel(); } }

MobileTrader.iOS / PlatformInfo.cs

[assembly: Xamarin.Forms.Dependency(typeof(MobileTrader.iOS.PlatformInfo))] namespace MobileTrader.iOS { public class PlatformInfo : IPlatformInfo { public string GetDeviceModel() { return Xamarin.iOS.DeviceHardware.Model; } } }

**呼び出し側 : MobileTrader **

IPlatformInfo info = DependencyService.Get<IPlatformInfo>();

実行時エラー : 呼び出し側のコードで発生

System.MissingException : <Timeout exceeded setting exception details>

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

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

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

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

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

guest

回答2

0

助言をいただき、問題が解消できましたので、今後のメモとして、残しておきます。

  1. DependencyServiceを使って、プラットフォーム依存の処理を共有プロジェクトで実行できる仕組みを実装。
  2. AppDelegate.cs#FinishedLaunching(iOSの場合) で DependencyService を指定したクラス ( PlatFormInfo.cs ) のインスタンスを生成

投稿2018/07/04 06:15

編集2018/07/04 06:19
mahoken

総合スコア85

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

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

0

ベストアンサー

Xamarin.iOS.DeviceHardware.Modelは、iOS用のライブラリでの呼び出しではないでしょうか?
iOS専用機能なので、そのままでは、共通コードから呼び出すことはできません。
こういったプラットフォーム毎の機能を共通コードから呼び出す仕組みとして、DependencyServiceというのが用意されています。
ここを参考に、試してみてはいかがでしょうか?

投稿2018/07/03 05:47

f-miyu

総合スコア1625

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

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

mahoken

2018/07/03 07:24 編集

回答ありがとうございます。 共有ディレクトリに、interface作成、 iOSディレクトリに、interfaceを継承したクラスを作成し、試しています。 `DependencyService.Get<testClass>();` を実行した際に、下記エラーが発生してしまいました。 `System.MissingException : <Timeout exceeded setting exception details>` うまくうごきません。。
f-miyu

2018/07/03 07:53

もしかして、実機で動かしていますか? もしそうなら、シミュレータでも試してみてください。
mahoken

2018/07/03 08:14

実機が手元にないので、シミュレーターで動かしています。
f-miyu

2018/07/03 08:26

試したコードを上げてもらってもいいでしょうか?
mahoken

2018/07/03 08:26

ビルド : 成功 実行時エラー : `System.MissingException : <Timeout exceeded setting exception details>` 画面状態 : スプラッシュ画面で停止中(デバッグ)
mahoken

2018/07/03 08:47 編集

質問の方に試したコードを記載いたしました。 大変お手数おかけしております。
f-miyu

2018/07/03 08:55

ありがとうございます。 見た限りコードには問題ない気がします。 うまくビルドできていない可能性もあるので、全プロジェクトをクリーンして、再度ビルドしてもらってもいいですか?
mahoken

2018/07/03 09:20

全プロジェクトに対して、クリーン -> リビルドを行いましたが、 エラーは発生してしまいました。。。
f-miyu

2018/07/03 09:26

確認ですが、DependencyService.Getを呼び出さなければエラーは出ないということでいいですよね。
mahoken

2018/07/03 09:54

その通りでございます。。
f-miyu

2018/07/03 10:10

AppDelegateのFinishedLaunchingに new PlatformInfo(); を付け加えてみたらどうでしょうか? これでもダメなら、一旦別の新しいXamarin.Formsのプロジェクトを作って、上記のコードを試してみてください。それで動いたなら、とりあえず作り方自体は間違っていないということは確認できますので
amay077

2018/07/04 04:07

MobileTrader.iOS / PlatformInfo.cs に引数なしコンストラクタを作ってそこにブレークポイントを仕掛ける、同ファイルの GetDeviceModel() にブレークポイントを仕掛けてデバッグ実行し、どこまで到達しているのかを調べるとよいと思います。コンストラクタでも止まらないなら DependencyService が正しく機能していないことになります。また 呼び出し側 : MobileTrader での呼び出しも起動直後( MainPage.OnAppearing など)に行ってみるなど、なるべく単純化してみると良いと思います。
mahoken

2018/07/04 06:11

f-miyuさん AppDelegateのFinishedLaunchingに new PlatformInfo(); を付け加えたところ、エラーが出なくなりました。 また、端末情報の取得に成功していることが確認できました。 いろいろとご教授いただきありがとうございます!
mahoken

2018/07/04 06:12

amay077 ブレークポイント使ってデバッグ処理試してみます! ありがとうございます。
f-miyu

2018/07/04 08:28

インスタンス作成でできたとなると、やっぱり原因はリンクですね。 MobileTrader.iOSのプロパティ(macならオプション)のiOSビルドのリンカーの動作の設定が「すべてをリンクする」になっていないでしょうか? もしそうなら、使っていないクラスはリンク時に消されちゃうので、DependencyServiceみたいなリフレクションを使っているような処理ではエラーが出ちゃいます。 解決方法としては、以下の3つがあります。 1 リンカーの動作の設定を「SDK アセンブリのみをリンクする」もしくは、「リンクしない」にする 2 インスタンスを作るなどして明示的に使っているのを示す 3 対象のクラスに[Preserve (AllMembers = true)]属性を付与する デフォルトだと、デバックビルドでは、「リンクにしない」、リリースビルドでは、「SDK アセンブリのみをリンクする」になっているはずなので、この設定のままにしておくのが一番楽かと思います。
mahoken

2018/07/04 08:50

リンカーの動作設定は、「SDK アセンブリのみをリンクする」になっていました。。 2. 3. 案を試して見たいと思います! さらなる助言をありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問