月別アーカイブ: 2013年8月

1日目 FX練習用ソフトの開発を始める

スケジュール

2014/8/31    1
2014/9/1    2
2014/9/2    3
2014/9/3    4
2014/9/4    5
2014/9/5    6
2014/9/6    7
2014/9/7    8
2014/9/8    9
2014/9/9    10
2014/9/10    11
2014/9/11    12
2014/9/12    13
2014/9/13    14
2014/9/14    15
2014/9/15    16
2014/9/16    17
2014/9/17    18
2014/9/18    19
2014/9/19    20
2014/9/20    21
2014/9/21    22
2014/9/22    23
2014/9/23 24
2014/9/24 1
2014/9/25 2
2014/9/26 3
2014/9/27 4
2014/9/28 5
2014/9/29 6
2014/9/30 7
2014/10/1 8
2014/10/2 9
2014/10/3 10

1日目 列挙型をもとにした構造体サンプル


type
  TPairEnum = (
    peEURUSD,
    peGBPUSD,
    peUSDCHF,
    peUSDJPY,
    peEURGBP,
    peEURCHF,
    peEURJPY,
    peGBPCHF,
    peGBPJPY,
    peCHFJPY,
    peUSDCAD,
    peEURCAD,
    peAUDUSD,
    peAUDJPY,
    peNZDUSD,
    peNZDJPY);


type
  TPair = record
  private
    FEnum: TPairEnum;

    function getName(): String;

    procedure setEnum(const Value: TPairEnum);
    procedure setName(const Value: String);
    function getCount: Integer;
    function getSerial: Integer;
    procedure setSerial(const Value: Integer);


  public
    property Enum:      TPairEnum read FEnum        write setEnum;
    property Serial:    Integer   read getSerial    write setSerial;
    property Name:      String    read getName      write setName;
    property ShortName: String    read getShortName;

    property Count: Integer read getCount;
  end;

implementation

{ TPair }

function TPair.getCount: Integer;
var
  tmpInfo :PTypeInfo;
  tmpData :PTypeData;
begin
  tmpInfo :=TypeInfo(TPairEnum);
  tmpData :=GetTypeData(tmpInfo);
  Result := tmpData.MaxValue - tmpData.MinValue + 1;
end;

function TPair.getName: String;
begin
  case FEnum of
    peEURUSD: result := 'EURUSD';
    peGBPUSD: result := 'GBPUSD';
    peUSDCHF: result := 'USDCHF';
    peUSDJPY: result := 'USDJPY';
    peEURGBP: result := 'EURGBP';
    peEURCHF: result := 'EURCHF';
    peEURJPY: result := 'EURJPY';
    peGBPCHF: result := 'GBPCHF';
    peGBPJPY: result := 'GBPJPY';
    peCHFJPY: result := 'CHFJPY';
    peUSDCAD: result := 'USDCAD';
    peEURCAD: result := 'EURCAD';
    peAUDUSD: result := 'AUDUSD';
    peAUDJPY: result := 'AUDJPY';
    peNZDUSD: result := 'NZDUSD';
    peNZDJPY: result := 'NZDJPY';
  else
    ShowMessage('TPair.getName');
  end;
end;

function TPair.getSerial: Integer;
begin
  result := Integer(FEnum);
end;

procedure TPair.setEnum(const Value: TPairEnum);
begin
  FEnum := Value;
end;

procedure TPair.setName(const Value: String);
var
  tmpValue: String;
begin
  tmpValue := trim(Value);
       if tmpValue = 'EURUSD' then self.enum := peEURUSD
  else if tmpValue = 'GBPUSD' then self.enum := peGBPUSD
  else if tmpValue = 'USDCHF' then self.enum := peUSDCHF
  else if tmpValue = 'USDJPY' then self.enum := peUSDJPY
  else if tmpValue = 'EURGBP' then self.enum := peEURGBP
  else if tmpValue = 'EURCHF' then self.enum := peEURCHF
  else if tmpValue = 'EURJPY' then self.enum := peEURJPY
  else if tmpValue = 'GBPCHF' then self.enum := peGBPCHF
  else if tmpValue = 'GBPJPY' then self.enum := peGBPJPY
  else if tmpValue = 'CHFJPY' then self.enum := peCHFJPY
  else if tmpValue = 'USDCAD' then self.enum := peUSDCAD
  else if tmpValue = 'EURCAD' then self.enum := peEURCAD
  else if tmpValue = 'AUDUSD' then self.enum := peAUDUSD
  else if tmpValue = 'AUDJPY' then self.enum := peAUDJPY
  else if tmpValue = 'NZDUSD' then self.enum := peNZDUSD
  else if tmpValue = 'NZDJPY' then self.enum := peNZDJPY
  else
    ShowMessage('TPair.setName');
end;


procedure TPair.setSerial(const Value: Integer);
begin
  FEnum := TPairEnum(Value);
end;


24日目+66 Macへの接続がうまくいかないときのチェック

コンピュータの再起動によってipが変わることがあるので以下をチェック

macからpaserverを起動
コマンドプロンプトから ip と入力して 数値を記録

delphi IDE プロジェクトマネージャーのターゲットプラットフォームでiOSシミュレーターを右クリックして、編集の接続をクリックホスト名に先ほど調べた数値を入力

24日目+64 iOS ファイルシステムを調べる

Delphi のサンプルによくあるのだが、プログラムから読み込む画像ファイルや音声ファイルを

StartUp\Documenys\

に配置するとリジェクトされてしまうことがわかる。

では、どこに配置するのか?調査を開始する。

配置マネージャーで wp0.png のリモートパスを
.\image\
に設定して

procedure TForm3.Button1Click(Sender: TObject);
var
tmpFileName: string;
begin
tmpFileName := GetHomePath + PathDelim +
ExtractFileName(ParamStr(0)) + ‘.app’ + PathDelim +
‘image’ + PathDelim +
‘wp0.png’;

Image1.Bitmap.LoadFromFile(tmpFileName);
end;

でOK。

 

 

<Application_Home>/Documents    ユーザーが生成した情報を置く。iTunes によってバックアップされる。

<Application_Home>/Library
ユーザーのデータファイル以外のファイルの最上位ディレクトリ。iTunesによってバックアップされる(ただし、Cachesサブディレクトリは除く)

<Application_Home>/Library/Caches
iTunesによってバックアップされない
<Application_Home>/tmp/
一時ファイルを書き込むために利用、アプリケーションが実行されていないとき、システムが削除する可能性がある。iTunesによってバックアップされない。

ファイルシステムプログラミングガイド

プログラミング雑記

取得した画像をDocumentsディレクトリに適当に格納しといたらappleにrejectされた!

iPhoneアプリ開発、その(230) お前もリジェクトしてやろうか

24日目+56 iTunes Connect に Reject された

Binary Rejected
2.23: Apps must follow the iOS Data Storage Guidelines or they will be rejected

In particular, we found that on launch and/or content download, your app stores 11MB in iCloud. To check how much data your app is storing:

だって。

もう一度、ガイダンスを読んで、規定に合うように書き直すとするか。

24日目+51 iOS シミュレーターの Application not started during startup timeout or has been finished に悩む

iOS シミュレーターの Application not started during startup timeout or has been finished に悩む

iOS シミュレーターのスプラッシュ起動画面が一瞬開いてその後、消えてしまう。

1分後くらいにdelphi のIDE が Application not started during startup timeout or has been finished のメッセージを出して停止する。

検証
・ Delphi でプロジェクト名を変更したために起こったような気がする。
・ 配置マネージャーでの問題のような気がする
・ 新たなダミーのプロジェクトを作って試したところ、iOS シミュレーターは問題なく起動した
・ Debug でも Release でも同様の問題がおこる

24日目+50 App Store にアップロード

Mac の Xcodeのアイコンを右クリックして「パッケージの内容を表示」から Contents/Applications/Application Loader を起動する。

IDとパスワードを入力して、スクラッチディレクトリ
/Users/yourname/RADPAServer/scratch-dir
の下にある .ipa ファイルを選択、アップロード

iOS アプリケーションを App Store への提出用に配置する

24日目+48 AppStoreへの登録

App IDの登録
Apple Developer のページから
Identifiers> Add IDs
で App ID を所得

Provisioning Profileの登録
Provisioning Profiles >Distribution
でプロファイルを generate、次のページで download
ダウンロードファイルをダブルクリックするとXCode Organizer に登録される

アプリ情報の登録
ITunes Connect のページを開き、Manage your app で、Add New App

*iTunes Connection に登録時必要なファイル

A large version of your app icon that will be used on the App Store. It must be at least 72 DPI, in the RGB color space, and 1024 x 1024 pixels (it cannot be scaled up). The file type must be .jpeg, .jpg, .tif, .tiff, or .png. It must be flat artwork without rounded corners.
Screenshots for 3.5-inch iPhone and iPod touch Retina display must be 960×640, 960×600, 640×960 or 640×920 pixels, at least 72 DPI, in the RGB color space, and in the JPG or PNG format.
Screenshots for 4-inch iPhone 5 and iPod touch (5th generation) Retina display must be 1136×640, 1136×600, 640×1136 or 640×1096 pixels, at least 72 DPI, in the RGB color space, and in the JPG or PNG format.
iPad Screenshots must be .jpeg, .jpg, .tif, .tiff, or .png file that is 1024×768, 1024×748, 768×1024, 768×1004, 2048×1536, 2048×1496, 1536×2048 or 1536×2008 pixels, at least 72 DPI, and in the RGB color space

Routing app coverage files (optional) are .geojson files which specify the geographic regions supported by your app. The file can have only one MultiPolygon element. MultiPolygon elements consist of at least one Polygon. Polygons contain at least four coordinate points. Polygon start and end coordinate points must be the same.

すべてのデータを記入、必要ファイルをアップロード save

Choose Another Language で Japanese を Add する

View Dtails をクリックしてアプリの詳細画面へ、ここで右上のボタンをクリックして Export Compliance を入力、暗号技術を使っていないときは、NO

アプリケーションを Mac App Store に提出する場合には、CFBundleIdentifier フィールドに Mac アプリケーションの BundleID を指定する必要があります。 指定しなければ、.pkg ファイルと使用中の Store BundleId が一致しないというメッセージが Mac AppLoader から出力される可能性があります。
http://docwiki.embarcadero.com/RADStudio/XE4/ja/%EF%BC%BB%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E6%83%85%E5%A0%B1%EF%BC%BD

BundleID とは、はApp IDの登録時に入力したものと同じもの、Prefixは必要ないの?

App Storeへのアプリの登録手順

AppStoreへの登録に関するチュートリアル

iTunes Connectでアプリを登録する際に気をつけたいこと

24日目+45 iTune Connect 用 スクリーンショットの撮り方

Delphi から IOSシミュレータで実行。サイズはiOSシミュレーターのメニュのハードウェア>デバイスで設定

MACのiOSシミュレーターをフォーカスして、上部メニューから[ファイル]>[スクリーンショットを保存]をクリック

ホームボタンを押しながら素早くスリープボタン(電源ボタン)を押すという方法もあるが、すべての実機を用意する必要があるので非現実的である。

iMac上でスクリーンショットを撮るには
CommandキーとShiftキーを押したままで4キーを押すと、Mac OS Xのカーソルが十字カーソルに変わり、範囲を自由に決めてスクリーンショットを撮ることができます。

24日目+43 Ad-hoc での配布に成功

*マックでの操作

mac から iOS Provisioning Profits(ditribution) ページから Provisioning Profits > Distributuon から新たな配布をAd-Hocで設定する

できたファイルをダウンロードしてダブルクリック

XCode のOrganaizer のDEVICE から LIBRARY を開いて 新たにできた Profile を 目的機種 の Provisioning Profiles にドラッグアンドドロップ

*ウィンドウズでの操作

プロジェクト>オプションからプロビジョニング
ビルドの種類
> Ad-hoc

配布用証明書
> マックのキーチェーンアクセスを開いて、 iPhone Distribution から始まる証明書をダブルクリックして、サブジェクト名の通称部分をそのまま入力
例: iPhone Distribution: RIGAXXXXXXXXXXX (XXXXXXXXXXXX)

モバイルプロビジョニングプロファイル
> XCode Organaizer のDEVICE から LIBRARY を開いて今回作成したad-hoc用の新たなプロファイルを選択、右クリックしてReveal Profile in Finder をクリックする。パスとファイル名を確認して、これを入力する。
例: /Users/XXXXXXXXXXXXX/Library/MobileDevice/Provisioning Profiles/XXXXX-XXXXX-XXXXX-XXXXX-XXXXX.mobileprovision

プロビジョンニングの設定はは、debug , release の2通りあるので注意が必要

配置は[プロジェクト]>[配置] から 配置ボタンをクリック

インストールはMACからスクラッチディレクトリ
/Users/yourname/RADPAServer/scratch-dir
を開いて。そこにある、ipa ファイルを XCODE organizer の目的機種のApplication にドラッグアンドドロップする。

24日目+43 iPad の実機テストができない

iPhone5 での実機テストは問題なくできたのに、iPad では

unable to install packagee (e800007e)

のメッセージダイアログが現れ、テストができない。

何が問題なのかを一つずつチェックしていく。

・ iPhone5 での実機テストは可能 (接続の問題ではないだろう)

・ iPad の シミュレーターでは問題なし

・ debug なら 配布関係のプロビジョニングは必要ないはず。(iPhone5 ではプロビジョニングしないで動作した)

・ iPad を開発用に登録したがここの部分に何か間違いがあるのか?

・ Mac のキーチェーン関係に何か問題があるのか?

XCode の Organizer – Devices の iPad の Provisoning Profiles にあったAd Hoc用の profile 削除するとエラーが

Unable to locate DeviceSupport directory matched with connected device info ・・

に変わった。しかし、いつの間にか

unable to install packagee (e800007e)

に戻っていた。

解決

iPad のOSバーションが4.32だったので、最新バージョンの6.13にすれば何も問題なく動作するようになった。

落とし穴はどこにだってある。