このブログでは、C++BuilderのコードからiOSAPIを使用してOSのバージョン、OS名、iOSデバイスの種類といったAppleのiOSデバイス情報を取得する方法について紹介いたします。
C++Builderでは、以下の3つのレベルでの開発が可能です。
- コンポーネント(VCL および FMX)
- 共通ライブラリ(RTL)
- プラットフォームAPI (iOS, Android, macOS)
ここでは、上記のうちプラットフォームAPI(iOS、Android、macOS)の使用方法について説明いたします。
C++Builderのランタイムライブラリ(RTL)には、Objective-Cで記述されたiOSフレームワークへのC++インターフェイスを提供するヘッダーファイルが多数含まれています。さらにRTLには、Android Java ライブラリ用のインターフェイスもヘッダーファイルとして多数用意されており、ネイティブのC++コードからAndroid JavaライブラリのAPIにアクセスできます。これは、C++Builderからも、デバイスの低レベルAPIにアクセスできることを意味しています。
Apple iOSの場合、C++BuilderのRTLのインクルードファイルは、$(BDS)¥include¥iosフォルダに配置されています。$(BDS)のデフォルトパスは10.4の場合、C:Program Files (x86)EmbarcaderoStudio21.0です。
iOS用ユニットの完全なリストは、docwikiページのiOS Objective-C フレームワーク(iOSapi)に記載されています。
C++BuilderのFireMonkeyフレームワークでは、iOS上で実行する場合、上記のユニットの一部に依存しています。
iOS API に関するヘルプは、iOS Developer Libraryの Apple ドキュメントを参照してください。
必要なiOSデバイスの情報を得るためには、iOSObjective-CフレームワークのiOSapi.UIKit.hppを使用する必要があります。
注意:iOSapi.UIKit.hppには、iOSapi.Foundation.hppとMacapi.Helpers(Macapi.ObjectiveC.hpp)も含まれています。
1 2 3 |
#define Iosapi_UikitHPP #include <iOSapi.Foundation.hpp> #include <Macapi.ObjectiveC.hpp> |
それでは、オペレーティングシステム(OS)のバージョン、OS名、iOSデバイスの種類などのApple iOSデバイス情報を表示するためのC++Builderのマルチデバイスアプリケーションを作成してみましょう。否の手順でアプリケーションを作成してください。
1. C++Builderマルチデバイスアプリケーション(空白のアプリケーション)を新規作成し、プロジェクトマネージャでターゲットプラットフォームを[iOS デバイス 64ビット]に変更します。
2. プロジェクトに名前をつけて保存してください。(例えば、CppiOSDeviceInfo)
3. IDEメニューの[プロジェクト|オプション|配置|プロビジョニング]を選択し、[プロビジョン プロファイル]と[デベロッパ証明書]を設定します。
4. IDEメニューの[プロジェクト|オプション|アプリケーション|バージョン情報]を選択し、CFBundleIdentifierに固有のアプリケーション識別子を入力します。例えば、Q4X27M46Z4.$(ModuleName)
5. C++BuilderマルチデバイスiOSアプリケーションでは、以下のように#include <iOSapi.UIKit.hpp>のヘッダファイルを1つインクルードします。
1 2 3 4 |
#include <fmx.h> #include // iOS Device information #pragma hdrstop #include "uMain.h" |
6. 続いて必要なFireMonkeyコントロールをフォーム上に配置し、以下のようなユーザーインターフェイス(UI) を作成していきます。
上記のUI画面を作成するには、以下の手順に従います。
(1) 空のフォーム上にTToolBarを配置し、オブジェクトインスペクタでToolBar1のAlignプロパティをTopに変更します。
(2) ToolBar1上にTButtonを1つ配置し、オブジェクトインスペクタでButton1の各プロパティを以下のように変更します。
- AlignプロパティをRightに変更
- NameプロパティをbtnGetDeviceInfoに変更
- StyleLookupプロパティをrefreshtoolbuttonborderedに変更
(3) ToolBar1上にTLabelを1つ配置し、オブジェクトインスペクタでLabel1の各プロパティを以下のように変更します。
- AlignプロパティをContentsに変更
- TextプロパティをDevice Informationに変更
(4) iOSデバイスの情報を表示するためにTListBoxを使用します。フォーム上にTListBoxを1つ配置し、オブジェクトインスペクタでListBox1のAlignプロパティをTopに変更します。
(5) ListBox1にOS のバージョン、OS 名、iOS デバイスの種類を表示する TListBoxItemを 3 つ追加します。TListBoxItemを追加するには、構造ペインでListBox1を選択、あるいはフォームデザイナでListBox1を選択し、マウスを右クリックして[TListBoxItemの追加]を3回選択します。そしてオブジェクトインスペクタで各TListBoxItemのプロバティを以下のように変更します。
ListBoxItem1のプロパティ
- TextプロパティをOS Name:に変更
- NameプロパティをlbOSNameに変更
ListBoxItem2のプロパティ
- TextプロパティをDevice Type:に変更
- NameプロパティをlbDeviceTypeに変更
ListBoxItem3のプロパティ
- TextプロパティをOS Version:に変更
- NameプロパティをlbOSVersionに変更
以上で、FireMonkeyコントロールのフォーム上への配置は完了です。
7. UI画面の完成したので、構造ペインでToolBar1上に配置されているbtnGetDeviceInfoをダブルクリックすると、OnClickイベントハンドラが作成されます。
続いて、OnClickイベントで実行するコードを記述するために、iOSapiUIKitヘッダーファイルの関数とメソッドを調べてみましょう。
8. iOSapi.UIKit.hppヘッダファイルを見るためには、C++BuilderのIDEエディタ内に記述されている#include <iOSapi.UIKit.hpp>の上にマウスを移動し、マウスを右クリックし、ポップアップのメニューから[カーソル位置のファイルを開く]を選択します。 これでiOSapi.UIKit.hppヘッダーファイルがエディタで開きます。
9. IDEエディタで iOSapi.UIKit.hppヘッダファイルを開き、エディタ上部にあるMethod Insightのドロップダウンリストに表示される一覧を見ると、使用可能なすべてのiOS.UIKit APIを確認できます。例えば、 このアプリケーションでは、iOSデバイス情報の取得が必要なので、Method Insightの検索ボックスに”Device”と入力すると、使用できるメソッドが表示されます。 たとえば、下図で表示される一覧にはUIDeviceClass.currentDeviceに加えて、使用する他のUIDeviceメソッドが表示されていることがわかります。
それでは、iOSapiUIKitヘッダーファイルの関数とメソッドが確認できたので、iOSデバイス情報の取得するためのコードを記述していきましょう。
10. btnGetDeviceInfoをダブルクリックし、OnClickのイベントハンドラ内に以下のコードを記述します。
1 2 3 |
void __fastcall TForm2::btnGetDeviceInfoClick(TObject *Sender) { _di_UIDevice device |
11. interface_di_UIDeviceが、iOSapiヘッダーファイルのどこを参照しているかを確認するには、コード内の_di_UIDevice上にマウスを移動し、Ctrlキーを押すと、_di_UIDeviceの表示がハイパーリンクに変わるので、それをクリックしてください。 (310 行目の iOSApi.UIKit.hpp ヘッダーファイルからのインターフェイスであることがわかります)
1 2 |
typedef System::DelphiInterface _di_UIDevice; class DELPHICLASS TUIDevice; |
12. iOS独自のUIDeviceクラス(TUIDevice)を使用できるようになり、TUIDeviceへのWrapを実行することでcurrentDeviceを取得できます。
1 2 3 |
void __fastcall TForm2::btnGetDeviceInfoClick(TObject *Sender) { _di_UIDevice device = TUIDevice::Wrap(TUIDevice::OCClass->currentDevice()); |
13. OS名を取得するためには、device->systemName()を実行します。
1 |
lbOSName->Text = lbOSName->Text.sprintf(L"OS Name: %s", device->systemName()->UTF8String()); |
14. OSバージョンを取得するには、device->systemVersion() を実行します。
1 |
lbOSVersion->Text = lbOSVersion->Text.sprintf(L"OS Version: %s", device->systemVersion()->UTF8String()); |
15. デバイスのタイプを取得するには、device-> model()を実行します。
1 |
lbDeviceType->Text = lbDeviceType->Text.sprintf(L"Device Type: %s", device->model()->UTF8String()); |
16. プロジェクトをビルドし、iOSデバイスへアプリをデプロイして実行すると、下図のようにiOSデバイス情報が表示されます。(今回テストで使用したiOS環境は、 iPad Air2+ iOS 14)
このブログで作成したサンプルプログラムは、こちらからダウンロードできます。
iPhone OS 14.0(Xcode 12)の利用時の注意:
SDKマネージャにiPhone OS 14.0(Xcode 12)を登録し、FireMonkeyのC++プロジェクトをビルドすると、以下のエラーが発生します。
1 2 3 |
bcciosarm64 の "CppiOSDeviceInfoPCH1.h" コマンド ライン [bcciosarm64 エラー] ptrauth.h(101): '__UINTPTR_TYPE__' は不明な型名です [bcciosarm64 エラー] ptrauth.h(104): '__UINTPTR_TYPE__' は不明な型名です |
2020年9月の時点での最新版であるRAD Studio10.4.1を使用しても、Xcode 12には対応しておらず、プロジェクトをビルドすることができません。
DelphiでもXcode12でビルドした場合は同様にエラーが発生します。詳しくは、こちらの情報をご覧ください。
このエラーは、RAD Studio 10.4.2で修正を予定しています。
10.4.2がリリースされるまでの間、SDKマネージャにiPhone OS 14.0(Xcode 12)ではなく、iPhone OS 13.x(Xcode 11.x)を登録し、ビルドしてください。
iPhone OSを変更する方法は、こちらを参照ください。
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition