操作する処理はここでは行わないでください。プロパティを使って、同じAPIでレスポンスの種類を分けることができたりします。本体は完成したので、早速実行してみましょう。同じですので割愛します。仕組みを使って実行完了通知を受け取ることが可能になります。こんな感じになります。操作することが可能です。使った通知の便利な点は以下の通り。使った場合にはその必要がない。リクエストを比較的投げっぱなしにできる。違い、複数のオブジェクトで同時に通知を受け取ることができる。実行した画面とは全然違う別の画面二つで同時に通知を受け取ったりすることが可能になる。本当にすばらしいです。最初にこの通信ライブラリを知ったときは、また良くあるただのちょっと便利なだけな通信ライブラリなんだろうと思い気にもとめなかったのですが、実際にコードを見てびっくりしました。私がほしかった通信ライブラリそのものだったからです。継承して作るべきだと考えており、実際以前に試してみたことがありました。恩恵を自動的に受けられるかもしれないという考えがあったからです。回すというすばらしい実装をしているじゃないですか!こりゃもうかないません。自分でやる必要が丸でなくなってしまいました。操作をしても安全という、まさにかゆいところに手が届く良さがすべてあります。間はこれ以上の通信ライブラリが現れることはないんじゃないかと言い切って良いぐらいすてきです。IPアドレスやMACアドレスを取得するクラスを書いてみたたまには技術ネタを書きます。MACアドレスを取得するためのObjective-Cクラスを書いてみました。https://gist.github.com/662203ライセンスは記載のとおりMITライセンスです。参考にしたサイトはこちら。http://stackoverflow.com/questions/677530/how-can-i-programmatically-get-the-mac-address-of-an-iphonehttp://iphonesdksnippets.com/post/2009/09/07/Get-IP-address-of-iPhone.aspx■ほんのちょっとだけ説明BSDのioctl()関数を使いますと、デバイスのIO周りのありとあらゆる情報を取ってくる事ができます。それを使ってIPアドレスやMACアドレスを取ってみました。あたりにあったのですが、もろにC言語ベタベタだったので使いやすくするためObjective-Cのクラスにしています。いってもまだまだ改善点が山ほどありますので好き勝手に触りまくってください。別にいまさら作らなくても良かったですね。result;}こちらも判別に成功。result;}日本語コメントのテストなど。配色が気に入りませんが、svnのtrunkに直リンクしていてこちらでは修正できないのでまぁ仕方ないかなと思います。それからActionScript3に未対応なのがかなり不満です。外部CSSとJavaScriptが増えて重くなるしonloadのタイミングで実行しなくちゃいけないし・・・Googleらしからぬイマイチさ。使ってみた最近IDEA*IDEAさんで取り上げられていたHighcharts.jsを試してみましたので、躓いた点などをメモしておきます。■公式サイトhttp://www.highcharts.com/ダウンロード、更新履歴はこちらから見られます。利用、および非営利組織での利用については無料ですが、商用利用の際にはライセンスの購入(1サイト$80、複数サイト$360)が必要になるので注意です。■実際に導入してみて躓いたポイント以下、すべてバージョン1.0.2(2009/12/09)での気づきです。></div>のようにしても描画時に無視され、高さが0になります。height:400px;"></div>のように書く必要があります。10.6上のFirefox3.5.6とSafari4.0.4にて再現。他のブラウザは未チェックです。論より証拠、こちらのページを開いて、少し画面全体を下にスクロールしてから、チャートを縦にドラッグしてY軸ズームしようとしてみてください。ひどいバグなのですぐに直るとは思いますが。seriesに与えるデータは、必ずX軸方向の昇順にソートされている必要がある特にxAxisにdatetimeを指定しているときが危険です。このようなデータはNGです。59.1]]}]かならずこのようにソートしなければなりません。57.4]]}]ソートされていないと、チャートにマウスカーソルを合わせてもラベルが表示されなくなります。気づきにくいバグでした。seriesに与えるデータにnullがあると、0として扱われるそのため、たとえば12月1日は100、12月2日は110、12月3日はデータが分からないのでnull・・・とすると、12月3日のところだけいきなり0になってグラフが滅茶苦茶になります。回避方法としてはxAxisのtypeをdatetimeにするか、yAxisのminを自分で計算して指定してください。xAxisのtypeがdatetimeのとき、連続していないデータがあるとsplineは使用できない(lineは使用できる)原因は不明です。バグじゃないだろうかと思ってますが、公式のxAxisのtypeがdatetimeなサンプルを見てもsplineではなくてlineを使っているのでひょっとしたら仕様かもしれません。■まとめ公開されたのがつい先月の末ということで、まだちょっとBuggyな感じです。エラーメッセージがまともに表示されないため、JSファイルのどこでエラーになっているかはわかっても原因が何か分からないなど、デバッグが結構大変です。デザイン美麗で機能豊富、カスタマイズも容易と、一通り優れた点は持ち合わせていると思います。PrototypeやjQueryなど他の外部ライブラリに依存しないのも良い点です。APIと比べてどちらが使えるかでしょう。APIについては実際に試したことがないのであくまで公式ページのドキュメントを見て気づいた点のみです。間違っていたらごめんなさい。ライブラリ2009年11月1日日曜日PDFをiPhoneから生成するサンプルプロジェクトを公開いたしました本編はこちらエラーハンドリング編はこちらここまでの成果をgithubにアップいたしました。ダウンロードしてXcodeを開き、ターゲットのビルド設定から開発用コードサインをご自身のものと入れ替えてビルドすれば、すぐにPDF作成がお試しいただけます。Licenseにしてみました。当方でも動作確認は行っておりますが、何か不具合ございましたらご一報いただけると幸いです。Objective-Cでエラーハンドリング前回記載できなかったエラーハンドリングについて軽くさわってみました。■libHaruのエラーハンドリングhttp://libharu.org/wiki/Documentation/Error_handlingに詳しく書いてあります。要するに、一番最初のPDFドキュメントを生成するところでエラーハンドラ関数を渡したらあとはエラーが発生するたびにその関数が呼び出されるみたいです。このHPDF_ResetError関数を呼び出す必要がある。これを呼び出さないと後続の処理がうまくいかない。HPDF_Free関数を使ってpdfオブジェクトを解放するとよい。HPDF関連の関数はすべて何もしないで終了してくれる。Touchフレームワーク的にはこういうエラー処理はdelegateにしてしまったほうが便利です。PDFファイルを生成するためのObjective-CクラスPDFServiceに、PDFServiceDelegateを持たせて運用してみましょう。libHaruのエラーハンドラ関数を以下のように作ってみます。show];}とすると、冒頭のイメージのようになります。ライブラリ2009年10月24日土曜日libHaruを使ってiPhoneアプリからPDFを作成するある日突然、iPhoneからPDFファイルを作ったら面白そうだと思ったので、早速試してみることにしました。先駆者の方がいらっしゃるかと思ったのですが、調べてもそれらしい資料が無いので自力でなんとかしてみることにしました。需要はあまり無いかと思いますが、何かのお役に立てば幸いです。■PDFファイルを生成する方法まずはPDFファイルを生成する方法を知らなければ話になりません。いうことで、調査しました。500ページ以上あります。http://www.est.co.jp/pdfl/index.html)本家のライブラリです。日本ではイースト社がライセンスしてるみたいですが、どう見ても有償です。チェンジお願いします。libHaru(http://libharu.org/wiki/Main_Page)こうして散々探した挙句ついに見つけた至高のPDFライブラリがこちら。C言語で書かれており、iPhoneでもバッチリ動きそうです!もちろんオープンソース!素晴らしい!ということで、今回はlibHaruを使ってみようと思います。最新のソースコードをhttp://libharu.org/wiki/Downloadsからダウンロードしてきて解凍します。installすれば一発なのですが、あいにくそれではiPhoneで動かすことが出来ません。includeディレクトリにヘッダファイルが、srcディレクトリにCソースコードが入ってますので、これら全部を自分のXcodeプロジェクトにコピーして取りこみます。2.libpngのソースコードをダウンロードしてXcodeプロジェクトに追加libHaruを用いてPDFに画像を出力したいときには、別途libpngが必要になります。そこで、libpngも一緒にビルドすることにします。libpngのソースコードはhttp://www.libpng.org/pub/png/libpng.htmlから入手できますので、これをダウンロードしてきてXcodeに追加してビルドすればよいのですが、ここではもっと簡単で確実に動く方法をご紹介します。iPhoneの0.8.1以降(http://code.google.com/p/cocos2d-iphone/source/browse/#svn/trunk)では内部的にlibpngを使用しています。これを真似しない手はありません。iPhoneの最新ソースを取得し、Xcodeでプロジェクトを開いて、Support/external/libpng以下のソースをコピーして自分のプロジェクトに追加しましょう。configureしても今の自分のMacの環境に合わせてConfigureされてしまい、iPhoneでは動かないだろうと思ったので、自分の手でconfigureすることにしました。いっても、直すのは一箇所だけです。includeディレクトリに入っていたhpdf_config.h.inファイルを以下のように修正します。*/書き換えたら、ファイル名をhpdf_config.hに変更します。4.Xcodeから新規ビルドターゲットを作成するソースコードの準備が出来たら、次はソースコードをビルドしてlibharu.aとlibpng.aを生成するためのビルドターゲットを新規に作成します。ビルドターゲットは使い方を覚えると非常に便利です。最初にlibpngのビルドターゲットを作ります。iPhoneの最新ソースのXcodeプロジェクト内に既に用意されていますので、これを真似して作るとよいです。libpngをビルドする際にzlib.dylibが必要になりますので、自分のプロジェクトにzlib.dylibを追加するようにしておいてください。SDKの一部として用意されています。続いてlibHaruのビルドターゲットを作成します。最後に、libharu.aを自分のiPhoneプロジェクトの依存ライブラリに追加します。5.レッツコンバイン!これでビルドする準備が整いましたので、いよいよビルドします。libHaru!無事にビルドが完了いたしましたので、次はいよいよPDFを生成してファイルに出力してみます。END");これを実行すると、アプリのDocumentディレクトリにtest.pdfが生成されるはずです。■実機で試してみるシミュレータでは動くようになりましたが、実機で動かなければ何の意味もありません。いうことで、いよいよ実機でテストしてみます!生成したPDFファイルを表示するためのUIWebViewを作成し、実機で表示してみた結果がこちら。ライブラリ2009年10月23日金曜日iPhone向けに最適化されたPNGをlibpngで扱う方法メモ。iPhoneアプリのバンドルに同梱したPNGファイルは、ビルド時に最適化処理が行われてしまうため、そのままではlibpngで読み込むことが出来ません。iPhone向けに最適化されたPNGをlibpngで扱う方法は、いまのところ二つ。1:最初から最適化をしないようにする参考にしたページはこちら。http://d.hatena.ne.jp/wasabi-arts/20090301/1235856525このように、IPHONE_OPTIMIZE_OPTIONS=-skip-PNGsを追加するか、またはこのように、最初っから圧縮をしないように設定する。2:最適化したファイルをいったんUIImageで読み出して、再度PNGでファイル書きだしするいったんUIImageを使って当該ファイルをロードして、ファイルにpng形式で書き出せばよいらしいです。22:20追記]@nakamura001さんがご自身のブログで検証結果をアップされてます。http://d.hatena.ne.jp/nakamura001/20091024/1256371800UIButtonからPNG画像を抜く方法ですが、これを応用すればUIButtonに最適化されたPNGを使用していても普通のPNG画像を取得することが出来ます。ライブラリ2009年1月24日土曜日route-meでタッチイベントを扱いたいタッチイベントを扱うときはRMMapViewDelegateプロトコルを採用するシングルタッチ、ダブルタッチを感知したり、マーカー上のタッチやドラッグを感知したり、地図の移動およびズームを感知したりできる現状、マップのドラッグやズームを使用不可能にするための手段は用意されていない。Delegateの返り値による操作もできない。UIMapViewにenableDraggingおよびenableZoomというインスタンス変数が用意されているが、mapView->enableDraggingのようにしてアクセスしようとするとコンパイルエラーになってしまう。route-me上でタッチイベントを取得してみました。こんな感じで、画面上のタップした点を取得することができます。*/適合させたクラスのオブジェクトをRMMapViewのdelegateプロパティにセットします。self;普通のUIViewとほとんど同じですね。この方法では画面上の座標がとれるだけで、緯度経度を取ることができませんので、RMMapViewのメソッドを用いて、緯度経度に変換します。*/これで緯度経度になりました。ところで、地図のスクロールやズームを制限して利用したいというときがあると思います。日本向けのアプリなのにアルゼンチンの地図をスクロールして表示されたら困るという場合です。地図のスクロールを制限する方法を調べてみたところ、RMMapViewにいかにもそれらしいメンバー変数を発見。decelerationFactor;}しかしながらこのメンバー変数、プロパティも操作するためのメソッドもなく、外部から操作することができません。ためしに無理矢理以下のようなコードを書いてアクセスしてみたところ、コンパイルではねられました。autorelease];//以下の行でエラー。NO;残念ながらまだこの機能は現在のバージョンのroute-meでは利用できないみたいです。その他、delegateメソッドの返り値をNOにしたらスクロールしなくなるとかそういう機能がないか調べてみましたがやはりなさそうで、今のところ地図のスクロールおよびズームを制限するのは難しそうです。今後のバージョンアップに期待ですね。http://code.google.com/p/route-me/wiki/CacheConfigurationキャッシュにはメモリに対するキャッシュ、ファイルを利用したキャッシュ、sqliteを利用したキャッシュの3通りがある。デフォルトではメモリに32枚、sqliteに無制限に地図画像をキャッシュするようになっている。参考はhttp://ameblo.jp/xcc/entry-10171488747.htmlroute-meを使っているうちに、困った事態に遭遇しました。最初の頃に使っていたOpenStreetMapの地図画像が、いつまでたってもVirtualEarthの地図画像に入れ替わらないんです。ごらんの通りOpenStreetMapの地図が出ます。tileSourceはVirtualEarthになっているのに!iPhoneシミュレータをリセットしたりアプリケーションを削除したりしましたが効果なしです。そこで原因を調査したところ、route-meは内部的にsqliteを用いた画像データのキャッシュを持っており、このキャッシュが自動的に最新のデータと入れ替わらないのが原因であることがわかりました。(通常キャッシュはある程度保持期間が決まっていて、保持期間を過ぎたデータは破棄するようになっていると思うのですが、route-meについては少なくとも1日2日程度の期間ではキャッシュを破棄してくれないようです)(というかsqliteのデータベースってアプリケーションごとに/var/root/Library/アプリケーション名/以下に配置されているからアプリケーションを削除したら消えるんじゃないんですか・・・?それとも全部ゴミになって残るの?単にiPhoneシミュレータが悪い?)そこでキャッシュを破棄する方法を調べるがてら、route-meの地図画像キャッシュを設定する方法について調べてみました。http://code.google.com/p/route-me/wiki/CacheConfiguration公式のドキュメントをみると、"routeme.plist"というplistファイルを作成してビルドターゲットに加えることで、地図画像キャッシュの動作を変更することができるらしいです。することで、sqliteを用いたキャッシュの中に保存されるデータ量を制限することができます。データベースの構造をみても、キャッシュ古くなったデータを自動的に削除するような機能はないようです。そのため、毎日決まった箇所の地図データを見るようなアプリの場合は、何年たっても地図の画像データが更新されません。このように地図の画像データが更新されない恐れがある場合には、sqliteを用いたキャッシュを利用しないように設定するのがよいと思います。これで今後のキャッシュの利用方法は設定することができましたので、いますでにキャッシュされてしまっているデータを削除しましょう。route-meではZCACHEというテーブルの中に地図画像キャッシュデータを保存していますので、このテーブルのデータを削除すればよいです。sqliteにはTRUNCATEが無いので、DELETE文を使ってすべてのデータを削除します。ZCACHE参考:http://www.mail-archive.com/sqlite-users@sqlite.org/msg09144.htmlまた、iPhoneシミュレータ上でキャッシュを消したい場合には、以下のパスにsqliteのデータベースファイルが存在しますので、そちらを丸ごと削除すればより簡単です。Simulator/User/Applications/英字の長ったらしい識別子/Documents/*.sqlite)さぁ削除していざチャレンジ!・・・あの、変わってないんですけど。何で?どうして?ログをコンソールから調べてみましたが、routeme.plistが正しく読み込まれていて、間違いなくDBへのアクセスは発生していません。なると怪しいのは地図提供元URLへのアクセスです。ここで何らかの仕組みが働いてキャッシュされているのではないかと思って調査してみました。すると、RMWebTileImageクラスの中にこんなソースを発見。cachedResponseForRequest:request];怪しいです。次回はちょっと脇道にそれて、このNSURLCacheについて調査してみようと思います。markerWithNamedStyle:]を使うと便利。setTextLabel:]でよい。setTextLabelは正直いまいち地図のズーム設定に初期位置設定もできるようになり、さらには地図の提供元の設定もできるようになりました。これだけではただの地図が存在するだけです。実用的なアプリケーションにするためには、地図上に情報を配置して、アプリケーションからユーザーに何かを提示してあげなければなりません。いうことでお次は地図上にマーカーを配置してみようと思います。route-meには標準でマーカーを管理するための機能があります。マーカーそのものを表すRMMarkerクラスと、マーカーを管理するRMMarkerManagerクラスです。RMMarkerManagerクラスからみていきましょう。RMMarkerManager.hから、重要そうなプロパティおよびメソッドだけを切り出してみました。AtXY:(CGPoint)point;一通り必要そうなメソッドはそろっており、「使い方等はもう宣言をみればわかるだろ!」といわんばかりの丁寧な作りになっています。(RMMarker*)markerあたりを呼び出せばよさそうですね。次にRMMarker.hをみてみます。重要な物だけ抜粋してみました。styleNameを使えばよさそうです。image;などを用いればうまくいきそうです。実際に地図上にマーカーを配置してみます。例によってRMMapViewの初期表示時に、以下のようなソースを追加します。AtLatLong:markerLocation.coordinate];ソースの先頭で"RMMarker.h"と"RMMarkerManager.h"を#importするのをお忘れなく!では実行してみましょう。!マーカーが表示されました。今度はマーカーにラベルをつけてみます。ラベルとはマーカーの上に表示される説明書き領域です。RMMarkerには標準でラベルを扱う機能があります。ラベルとしてシンプルに文字列を指定する方法と、凝ったUIViewを指定する方法が用意されていますが、まずはシンプルに文字列を出してみようと思います。言ってこれではわかりづらすぎです。ラベルを使いたい場合には、setTextLabel:を用いず、きちんとしたUIViewを設計してから、setLabel:を利用して指定する方がよいと思います。利用する地図の提供元を変更したい場合には、tileSourceプロパティを変更する。前回の記事ではroute-meライブラリのRMMapViewクラスを調査して、地図の初期表示座標やズーム倍率を設定する方法を調べてみました。今回はroute-meライブラリのうち、地図の実体そのものを表現するRMMapContentsクラスを調査してみようと思います。RMMapContents.hを読んでみます。利用できるプロパティとメソッドの一覧はこんな感じです。tilesUpdatedRegion:(CGRect)region;長い!長いです!RMMapContentsクラス独自のメソッドだけではなくて、RMMapViewクラスが持っている機能と同じ、地図の表示位置を動かしたり、拡大倍率を操作するメソッドも持っています。self];}どうやらRMMapViewクラスのメソッドの実装は、デリゲートのメソッドの呼び出しに加えて、RMMapContentsクラスのメソッドを呼び出しているだけみたいですね。利用できるプロパティとメソッドがありますが、今回はその中でも「利用する地図の提供元を制御する」方法を調べてみようと思います。RMMapViewの標準の地図提供元はOpenStreetViewです。http://www.openstreetmap.org/OpenStreetViewとは一般のユーザーがGPSを利用して測定した道などの地理情報を自由にアップロードして作るオープンソースな地図プロジェクトです。日本ではまだそれほど定着していないようで、ちょっと田舎に入ると地図の精度が絶望的なことになってきます。いうことで、地図の提供元をOpenStreetViewから別の提供元に変更する必要があります。http://maps.cloudmade.com/)の地図を利用することができます。Sourceグループ内のクラスを指定してやるだけです。VirtualEarthを利用するときは、以下のようにします。autorelease];これを実行すると以下のようになります。見事VirtualEarthになりました。これで日本地図を拡大しても安心です。既存のロード済みのタイルに関しては変更前のtileSourceからロードされてキャッシュされている画像がそのまま表示されてしまいます。従って、以下のような実装ができません。最初からOpenStreetMap以外の地図提供元を利用した実装ができない。RMMapViewのinitと同時に最初の地図情報がOpenStreetMapからロードされてしまうため。あとからユーザーの操作に応じて地図の提供元を変更するような実装ができない。この問題はroute-meプロジェクトのバグトラッカーにも掲載されています。http://code.google.com/p/route-me/issues/detail?id=12#c5現在のところは残念ながら改善されていないようです。今のところは、以下のような対応を心がけましょう。途中で地図の提供元を変更する場合には、動的に画像キャッシュをクリアする。簡単にキャッシュをクリアできるような構造になってはいない。最初からOpenStreetMap以外の地図提供元を利用するときには、ダウンロードしてきたMapViewプロジェクトのソース自体を直接修正する。具体的にはRMMapContents.mの56行目の、以下の箇所を書き換えることで実現できます。RMMapView詳細編RMMapViewには主に「現在の表示位置」「現在のズーム」を操作するためのメソッドが用意されているRMMapViewのプロパティとして、マップ自身を表すRMMapContents、マップ上のマーカーを操作するRMMarkerManager、そしてマップからの操作を受け取るRMMapViewDelegateが用意されている前回の記事では実際にroute-meの地図を自分のアプリに組み込んでiPhoneシミュレーター上で動作させるところまでをやってみました。今回はさらに一歩進んで、route-meの実体であるRMMapViewの使い方について調べてみようと思います。○ソースを読んでみる公式ページを見ても一切ドキュメントが用意されていない・・・ので、ココはソースを読んで解析するしかありません。前回、実際にViewとして自分のアプリに読み込ませた、RMMapView.hを調査してみます。getScreenCoordinateBounds;うーん読みやすい。ヘッダのソースコードを読めば、リファレンスがなくても普通に使えそうな感じですね。手始めに、前回までは初期表示としてオーストラリアの片田舎が表示されるようになっていたのですが、これを日本全体が見えるような初期位置とズーム倍率に設定してみようと思います。MapViewを初期生成するところで、以下のように初期位置を設定します。WithLocation:(CLLocationCoordinate2D)latlongの第2引数の値を生成するために、CLLocationを利用します。Locationライブラリに含まれるクラスです。GPSを使ったアプリを作られたことのある方でしたら馴染み深いクラスだと思います。GPSを使う場合には、上記の例のように直接initすることはなく、CLLocationManagerからCLLocationの値を生成します。CoreLocationを利用するためだと思いますが、ビルド時にCLLocationの実体がないのでリンクができないと怒られてしまいます。以下の図のようにCoreLocation.Frameworkをプロジェクトに追加してください。追加したらチェックボックスを入れてターゲットに追加するのも忘れずに。これでビルドが通るはずです。初期位置が日本になりました!でもズームがちょっと近すぎる感じがします。日本全体が入るようにしてみましょう。setZoom:5];これでも何となくうまくいきましたが、ズーム率をint型で指定するのはいまいちわかりづらいです。表示したい地理的位置がわかっている場合には、緯度経度の値を用いてズームを設定するための便利なメソッドが用意されています。SouthWest:southWest.coordinate];いい感じですね。日本全体が見えるようになりました。3タイプあります)や、Mapアプリ上で特定地点をダブルタップしたときのように、地図上の特定の位置に向かってズームするためのメソッドが用意されています。Viewを表示してみたいと思います。参考にしたのは以下のページ。EmbeddingGuidev2http://code.google.com/p/route-me/wiki/EmbeddingGuidev2○まずは何はなくともプロジェクトをダウンロードする一週間に何度も更新が入るようなプロジェクトですので、常に最新のソースを利用したい方は、パッケージを落としてくるよりSubversionを利用してチェックアウトするのがおすすめです。いうことでコマンドプロンプトから以下のコマンドを実行。http://route-me.googlecode.com/svn/trunk/MapViewパッケージからダウンロードする場合でも、Subversionからチェックアウトする場合でも重要なことは、このProj4というプロジェクトディレクトリと、MapViewというプロジェクトディレクトリを同じディレクトリに配置する必要があるということです。ThisisMyProject/これはMapViewがProj4プロジェクトを参照しているからのようです。自分のプロジェクトについては何処に置いても大丈夫ですが、同じ場所においておいた方が後からプロジェクトの参照がしやすくていいかもしれません。ちなみに、私たちユーザーが使うのはMapViewプロジェクトだけです。Proj4は内部的に利用されるだけですので、私たちが直接呼び出すことはありません。○プロジェクトの参照を自分のプロジェクトに追加する次は配置したMapViewプロジェクトへの参照を自分のプロジェクトに追加します。プロジェクトに追加を選択して、先ほど配置したMapViewプロジェクトの中の、MapView.xcodeprojを選択します。このとき、プロジェクトのコピーは作成してはいけません。「ディスティネーショングループのフォルダに項目をコピーする」というチェックボックスを選択しないようにしてください。追加が成功するとこんな感じになります。Projects)というところに書いてある方法なんだそうです。・ビルドターゲットにファイルを追加libMapView.aというファイルの横にある小さなチェックボックスをチェックします。MapView.appはチェックしなくてよいです。これでlibMapView.aがビルドターゲットに追加されます。・ビルドターゲットの設定ビルドターゲットの設定を開きます。プロジェクトメニューから選択するか、ターゲットを直接ダブルクリックします。依存関係というところに、先ほどのMapViewを追加します。+ボタンを押して追加してください。このMapViewというのを追加します。それから、リンク済みライブラリというやつをいくつか追加する必要があります。QuartzCore.frameworkと、libsqlite3.dylibというライブラリを追加してください。原文では4つ追加するように指示されていますが、この2つだけで問題ないようです。「ヘッダ検索パス」という項目を探します。このように、MapViewプロジェクトへのパスを設定します。ここでは早退パスで指定していますが絶対パスでも問題ないと思います。再起的チェックボックスを忘れずに。・プロパティタブの識別子を設定プロパティタブの中の、識別子という項目を設定します。これはMapViewに限らずiPhoneアプリを実機にインストールする際に必ず必要になる設定なのですが、一応忘れずにということで。Bを押下して一度ビルドしてみます。ここまでの設定が間違いなければビルドに成功します。「警告がいくつか出るかもしれないが無視してくれ」と原文には書いてましたけど、私の場合には警告は一つも出ませんでした。ビルドにどうしても成功しない場合には、こちらの画像を参考にしてみてください。自分のプロジェクトにコピーしてきます。しないとマーカーの画像がでないんだとか。こんな風に加えてみました。別に自分のプロジェクトの中なら何処に加えておいても問題ないとは思います。小さなチェックボックスをチェックして、ビルドターゲットに追加するのも忘れずに。○いよいよマップを自分のプロジェクトに配置マップを自分のプロジェクトに配置する方法には、1:2:この二つがあります。Builder上で追加しただけでは動かない(gccがコンパイル時にリファレンスを削除してしまうらしいです)のでちょっとしたハックをコード上で行う必要があります。ViewControllerに以下のようなコードを追加してください。Builderから追加したRMMapViewが動作します。2の場合は、以下のようなコードを書きます。次回は初期表示位置の設定、初期倍率の設定、スクロール範囲の制御(日本の外は見れなくする)、マーカーの配置、クリックイベントの取得のやり方などを調べてみようと思います。Touchに組み込んでくれるのを期待しつつ待つしかないiPhoneで開発をしている人なら、誰しも一度はこう思うでしょう。Mapアプリみたいに、地図を使ったアプリが作りたい」と!GPS・加速度センサー・タッチ操作に強力な通信機能、おまけに3D描画もできると、こんなにすてきな機能と地図がくみ合わさったら、その可能性は無限大に違いありません。なんということでしょう。Viewが使いたいんだけどどうすりゃいいの」ということです。調べてみたところ、以下の3つのオープンソースライブラリが見つかりました。Viewライブラリです。描画を行っているようです。画面上に描画点(プロットとか画像とか)を自由に配置することができます。Viewライブラリです。ネイティブ実装であるため、きわめて軽快で高速な動作が特徴です。Earthに限られてしまいます。○TouchMaphttp://toxicsoftware.com/touchmap/全く未知数です。Earthであるということ以外何もわかりません。StreetViewには対応していません。Componentは真っ先に除外されます。JavaScriptで実装されているため実機では重すぎて使い物になりません。Mapsを用いた実装だけに非常に残念です。現在最も勢いのありそうなroute-meを今回採用することにしました。実際に自分のアプリの中で地図を動かしてみようと思います。Androidアプリエンジニアやってます。今年は2019年となりました。12月7日担当のakisuteです。Headerを利用することで、Swiftは既存のいかなるC/Objective-Cコードのシンボルでも呼び出すことが可能になっています。場合によってはSwift単体では素直に書きづらいハマりどころがあります。されることがあります。送りたいことがあります。仕事用に作ったまとめをそのまま転載。以下のリンクを見ておけば一通り大丈夫です。7.2でSwiftを使ったiOSアプリのデバッグをするときのコツみたいなものをまとめました。将来的にはより良くなる可能性はあります。