LoginSignup
1
3

More than 5 years have passed since last update.

MapBox SDK for Xamarinを試してみた (1) とりあえず動かしてみる(iOS実機は動かない)

Posted at

MapBoxのOpenGL版iOS/Android SDKが出揃った昨今ですが、Xamarinが早速コンポーネントストアにポーティングしてきました。
早速、ちょっとサンプルを動かしてみようと思います。

事前準備

MapBox SDKを使うには、MapBoxのAPI Keyが必要です1
MapBoxのAPI Keyを取得するには、MapBoxのページの右上のSignUpより開発者登録します。
MapBox
無料で使うため、会員レベルはStarterにします。月50000ビューまで、無料で地図タイルを利用できます2
SignUp
会員になってダッシュボードを開き、「Apps」と書かれたタブを選びます。そこにある、「sk.」から始まる文字列が、ネイティブアプリ用のAPI Keyとなります。
ダッシュボード
このAPI Keyが動作に必要ですので、書き留めておきます。

サンプルプログラムの取得

サンプルプログラムを動作させるには、Xamarinで何か適当なソリューションを作り、そこからコンポーネントにMapBox SDKを追加します。
SDKのダッシュボードでSamplesタブを選ぶと、Sampleを取得できるボタンがあるので、そこをクリックすると、Android/iOS双方のサンプルプログラムが入手できます。
コンポーネントダッシュボード

Android版サンプルの動作確認

Android版の場合、API KeyはレイアウトXML上で指定しますが、サンプルプログラムのレイアウトXMLは

Resources/layout/Main.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:mapbox="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.mapbox.mapboxsdk.views.MapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        mapbox:accessToken="@string/mapboxAccessToken" />
</LinearLayout>

のようになっているので、Resources/values/String.xmlの中にAPI Keyを記載します。

Resources/values/String.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Mapbox Sample</string>
    <string name="mapboxAccessToken">sk.eyJ1I...</string>   
</resources>

これで実行すれば、実機でも普通に動きます。コンパイルエラーが出る場合は、Target Android VersionやMinimum Android Version等が自分の開発環境と合っているか確認しましょう。
Android動作状況

iOS版サンプルの動作確認

あっさりと動いたAndroid版に比べ、iOS版はデフォルトの環境設定がいろいろ問題がありあっさりとは動きません。
また、結論を言うとシミュレータでは動きますが、実機(iPhone5S+iOS9.1)では動きません。
バグなのか、設定不足なのかわかりませんが、コミュニティに報告などもしつつ、何か分かれば続報を書きます。

API Keyの置き換え

iOS版の場合、API KeyはAppDelegate.FinishedLaunchingの中で指定します3

AppDelegate.cs
        const string MAPBOX_ACCESS_TOKEN = "sk.eyJ1I...";

        public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
        {
            if (MAPBOX_ACCESS_TOKEN == "YOUR-ACCESS-TOKEN") {
                new UIAlertView ("Change Access Token", "You need to change the MAPBOX_ACCESS_TOKEN to your own token from MapBox!", null, "OK")
                    .Show ();
            }

            // Set your own Access Token 
            AccountManager.AccessToken = MAPBOX_ACCESS_TOKEN;

            return true;
        }

上記のMAPBOX_ACCESS_TOKEN定数の値を変更します。

ライセンスがIndieの場合はEnable profilingをオフにする

この設定後、シミュレータで実行しようとすると、Indieライセンスの場合、以下のようなエラーが出ます。
ライセンスプロンプト
これは、サンプルプログラムのデフォルト設定がEnable Profilingになっているのですが、同機能がBusinessライセンス以上でしか有効化されていないためです。
これを解除するには、サンプルプロジェクトのプロジェクトオプションを表示し、iOS BuildタブのEnable profilingをオフにします。この項目は、プラットフォームiPhone/iPhone Simulator双方にありますので、両方でオフにします。
EnableProfilingをオフに

シミュレータではここまでで動作する

シミュレータ環境では、ここまでで動作します。
iOSシミュレータ動作状況

64ビット環境のみでのコンパイルに変更する

実機環境向けでコンパイルしようとすると、まずぶつかるのが、静的ライブラリが見つからないといったエラーです(すみません、なぜか記事書いている最中に再現しようとしてもしなくなってしまったので、エラー詳細を記載できませんが)。
このエラーは、コンポーネントストアの対応プラットフォームを見るとios-64としか書かれていないのに、コンパイルアーキテクチャがARMv7s+ARM64になっていたので、ARM64だけにしてやると回避できました。
ARM64だけにする

-ObjCコンパイルオプションをつける

上記実行後コンパイルを進めようとすると、ビルドは完了しますが、デバグ起動中に以下のようなエラーを吐いて落ちます。

エラー出力
MapboxSampleiOS[3635:1365466] -[NSProcessInfo mgl_isInterfaceBuilderDesignablesAgent]: unrecognized selector sent to instance 0x156609bf0

これはググってみたところ、コンパイルオプションに-ObjCをつければ解決するようです。
-ObjCコンパイルオプション
上記の赤丸のところに、

コンパイルオプション
-gcc_flags "-ObjC"

を記載するとコンパイルが通るようです。

MGLAnnotationクラスがないと言われる(未解決)

さらに実機動作確認すると、以下のエラーが発生します。

エラー出力
Wrapper type 'Mapbox.Annotation' is missing its native ObjectiveC class 'MGLAnnotation'.

エラー画面1
エラー画面2
これをググってみると、こういう感じのエラーが出るときは前節でのコンパイルオプションにさらに追加して

コンパイルオプション
-gcc_flags "-ObjC -lc++ -lstdc++"

にすれば直るという情報もあったりしたのですが、今回の例では直りませんでした。

これについては引き続き調査中ですが、どうにもバグくさいので、コミュニティへの報告等もしつつ解決したいと思います。

以上、とりあえずMapBox SDK for Xamarin、触ってみた結果の報告でした。


  1. 本記事を書き始めてから気付きましたが、もしかしたらAPI Keyは背景地図にMapBoxの地図タイルを使う時のみ必要で、独自地図タイルを使う際等は不要なのかもしれません。が、とりあえずの動作テストでは必要という前提で進めます。 

  2. 地図タイルの利用制限のはずなので、地理院地図のように他に使える地図を背景に使う場合、無料でずっと使える...はずです。なのでもしかすると、その場合はAPI Keyは不要なのかもしれませんが、次回以降の記事で確かめます。 

  3. Info.plistの中のMGLMapboxAccessTokenキーの値として入れる方法もあるようですが、サンプルプログラムがこうなっていたのでそちらで進めます。 

1
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3