Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
C++ニュース

C++Builder 10.4.xによるプラットフォームAPIの使用

このブログでは、C++BuilderのコードからiOSAPIを使用してOSのバージョン、OS名、iOSデバイスの種類といったAppleのiOSデバイス情報を取得する方法について紹介いたします。  

C++Builderでは、以下の3つのレベルでの開発が可能です。

  1. コンポーネント(VCL および FMX)
  2. 共通ライブラリ(RTL)
  3. プラットフォーム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)も含まれています。

#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つインクルードします。

#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のイベントハンドラ内に以下のコードを記述します。

void __fastcall TForm2::btnGetDeviceInfoClick(TObject *Sender)
{
	_di_UIDevice device

11. interface_di_UIDeviceが、iOSapiヘッダーファイルのどこを参照しているかを確認するには、コード内の_di_UIDevice上にマウスを移動し、Ctrlキーを押すと、_di_UIDeviceの表示がハイパーリンクに変わるので、それをクリックしてください。 (310 行目の iOSApi.UIKit.hpp ヘッダーファイルからのインターフェイスであることがわかります)

typedef System::DelphiInterface _di_UIDevice;
class DELPHICLASS TUIDevice;

12. iOS独自のUIDeviceクラス(TUIDevice)を使用できるようになり、TUIDeviceへのWrapを実行することでcurrentDeviceを取得できます。

void __fastcall TForm2::btnGetDeviceInfoClick(TObject *Sender)
{
	_di_UIDevice device = TUIDevice::Wrap(TUIDevice::OCClass->currentDevice());

13. OS名を取得するためには、device->systemName()を実行します。

lbOSName->Text = lbOSName->Text.sprintf(L"OS Name: %s", device->systemName()->UTF8String());

14. OSバージョンを取得するには、device->systemVersion() を実行します。

lbOSVersion->Text = lbOSVersion->Text.sprintf(L"OS Version: %s", device->systemVersion()->UTF8String());

15. デバイスのタイプを取得するには、device-> model()を実行します。

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++プロジェクトをビルドすると、以下のエラーが発生します。

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を変更する方法は、こちらを参照ください。

Kai 1.1 Now Available! Kai 1.1 Now Available! What's Coming in RAD Studio 13.2 Florence

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.

Start Free Trial   Upgrade Today

   Free Delphi Community Edition   Free C++Builder Community Edition

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

IN THE ARTICLES