2018年09月06日

Xcode9 で OTA 可能な AdHoc デプロイを行う

前回の記事(Xcode8 で OTA インストール可能な AdHoc デプロイを行う)に続いて、Xcode9 で OTA (Over-The-Air) でインストールできる AdHoc デプロイの方法について紹介します。

用語について



AdHoc(アドホック):主に開発中に実機で動作確認を行うときに使用するデプロイ方法で、iOS Developer Center (DevCenter)で Devices に登録されているデバイスでのみ実行できるというものです。USBケーブルで接続してアプリを送り込む方法と、無線LAN(WiFi)を使用してアプリをインストールする方法(OTA)があります。DevCenter で登録できるデバイスはアカウント1つあたり100台までとなっていますが、1年に1回だけ更新のチャンスがあり、廃止等で不要になったデバイスはそのときに削除して100台の枠内で運用するようにします。

AdHocで実行可能な端末情報は、プロビジョニングプロファイルの中に保存されているので、DevCenter で Devices を追加したときはプロビジョニングプロファイルを作り直してダウンロードし、コンパイルしてアプリに取り込む必要があります。

OTA (Over-The-Air):無線LAN(WiFi)を使用してデータを転送することですが、AdHocアプリをOTAでインストールすることができます。動作確認を行う端末の台数が多いとき、遠隔地のスタッフが確認を行うときなどに便利です。

OTAを使用するための条件



・WWWサーバ(SSL証明書がインストールされていてhttpsでアクセスできること)
 →Let'sEncryptでも良いです。
・BASIC認証がかけられること
 →仕組み上必須ではありませんが、他者に読み取られるのは都合が悪いことが多いです。
・plistファイルへリンクするHTMLページを作る
 →plistファイルのURLを直打ちしても良いのですが、開発中はファイルの差し替えも頻繁に発生するのでPHPスクリプト等を作ったほうが効率が良いです。

OTAインストールの利用方法



OTAインストールの利用イメージは下記のとおりです。
1.Safariを起動し、指定されたURLにアクセスする(上記のPHPスクリプト等)
 例:https://www.xxx.xx.xx/app/
2.必要であればBASIC認証のユーザー名とパスワードを入力する
3.plistファイルへのリンクをタップする
 インストール確認メッセージが表示されるのでOKをタップ
4.BASIC認証のダイアログが数回表示されるのでユーザー名とパスワードを入力する
 pngファイル、ipaファイルのそれぞれで要求されるので最低2回は入力が必要です
5.インストールが上手くいけばホーム画面にアイコンができている
 Safari画面から自動的に切り替わらないので、自分でSafariを閉じる必要があります

OTAインストール用AdHocアプリの出力方法



1.Product→Archiveを実行する
 →アーカイブ処理が完了すると Organizer 画面が表示されます
2.Organizer 画面の Export をクリックします
xcode9-adhoc-ota-001.png

3.AdHoc を選択して Next をクリックします。
xcode9-adhoc-ota-002.png

4.この画面ではそのまま Next をクリックします。
※Include manifest for over-the-air installation が選択されている状態にします。
xcode9-adhoc-ota-003.png

5.Automatically manage signing を選択して Next をクリックします
(Xcode9 になって追加された機能のようです)
xcode9-adhoc-ota-004.png

6.確認画面が表示されるので Export をクリックします
xcode9-adhoc-ota-005.png

7.パス名を入力します。
Name: ファイル名を入力します。この名前に .ipa を付加したファイル名で出力されます。出力先のパス名は次の画面で選択します。
App URL: 上記 .ipa ファイルへのURLを入力します。パス名は次の画面で決定されますが、同じものをこの画面で入力します。
Display Image URL: 72x72ピクセルのPNGファイルのURLを入力します。
Full Size Image URL: 512x512ピクセルのPNGファイルのURLを入力します。
xcode9-adhoc-ota-006.png

8.ファイル保存画面
Export As: ここで入力した名前でフォルダが作られ、その中に ipa と plist ファイルが保存されます。
※上記7.で TestApp-1.0.0 とした部分と同じものを入力します。
xcode9-adhoc-ota-007.png

9.plistファイルのパス
上記の設定で出力したplistファイルにアクセスするには下記のURLを指定します。
itms-services://?action=download-manifest&url=https://www.xxx.xx.xx/app/TestApp-1.0.0/manifest.plist

これを直打ちするのは大変なので、index.phpを作成してダウンロードできるようにしています。


posted by はるこち at 19:00| Comment(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2018年09月04日

Xcode8 で OTA インストール可能な AdHoc デプロイを行う

Xcode8 で OTA (Over-The-Air) でインストールが可能な AdHoc デプロイを行うには下記のようにします。
※今日時点では Xcode8 から AppStore に提出できないので Xcode8 を使っている人はほとんどいないと思われますが…。

1.Product→Archiveを行う

2.Organizer 画面に表示されるので、選択して Export をクリックする。
xcode8-adhoc-ota-001.png

3.Save for AdHoc Deployment を選択し、Nextをクリックする
xcode8-adhoc-ota-002.png

4.複数の Team に所属している場合は選択肢が表示されるので正しいものを選択。
xcode8-adhoc-ota-003.png

5.Export one app for all compatible devices を選択して Next をクリック
xcode8-adhoc-ota-004.png

6.表示されている内容を確認して Next をクリック
※画面下部の Include manifest for over-the-air installation. がキモかも。
xcode8-adhoc-ota-005.png

7.Webブラウザに表示するための情報を入力します。
※URLは https で始まる必要があります。
Name: アプリのファイル名(例では TestApp.ipa というファイルが作られます)
App URL: 上記の ipa ファイルへのパス(上位フォルダにアプリ名のフォルダ TestApp-1.0.0 を入れるようにします)
Display Image URL: 72x72ピクセルPNGファイルのURLを入力します。
Full Size Image URL: 512x512ピクセルPNGファイルのURLを入力します。
xcode8-adhoc-ota-006 [2].png

8.ファイルに保存します。
Export As: 上記の ipa ファイルの上位ディレクトリ名 TestApp-1.0.0 を入れます。ディレクトリがなければ自動的に作られます。
※保存されるフォルダ名をよく見て覚えておかないと行方不明になることもあります。
xcode8-adhoc-ota-007.png

ここまでの操作で、TestApp.ipa と manifest.plist という2個のファイルが作成され、下記のようなフォルダ構成になります。
Test
 +-- TestApp
    +-- TestApp-1.0.0
       +-- TestApp.ipa
       +-- manifest.plist

TestApp-1.0.0 以下をサーバにアップロードします。
iPhone/iPad の Safari からダウンロードするためのHTMLは下記のようになります。

<a href="itms-services://?action=download-manifest&url=https://www.xxx.xx.xx/app/TestApp-1.0.0/manifest.plist">ここをクリック</a>


Safari が manifest.plist ファイルを読み込むと、ipaファイルのURLが書き込まれているので、そのアドレスにアクセスして ipa ファイルや png ファイルをダウンロードします。

また、通常は他人にダウンロードされないようにするために BASIC 認証をかけたりしますが、BASIC 認証をかけた場合、ipa ファイルと png ファイルをダウンロードするときにユーザー名とパスワードを毎回聞いてきますので、アプリがインストールされるまでに2〜3回パスワードを入力する必要があり、ちょっと不便です。

posted by はるこち at 18:00| Comment(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2018年03月13日

Xcode9 で 'CFBundleIconName' is missing のエラー

これまでメンテナンスしてきた iOS アプリですが、今回から Xcode9 でコンパイルすることと、TestFlight を使用することになりました。そのため、テスト用のバイナリをアップロードしたのですが、管理画面になかなか現れてこないという状況になりました。
ウェブで検索してみると、表示されるまで30分ほどかかることもあるということだったのですが、1時間経過してもぜんぜん出てきません。そのうちに、別の部署から「変なメールが来てるんだけど・・・」という問い合わせがありました。

メールのタイトルは下記のようなものです。
iTunes Connect: Your app "アプリ名" (Apple ID: xxxxxxxxx) has one or more issues


本文は下記の通り。
Dear developer,

We have discovered one or more issues with your recent delivery for "アプリ名". To process your delivery, the following issues must be corrected:

Missing Info.plist value - A value for the Info.plist key 'CFBundleIconName' is missing in the bundle 'com.nttdocomo.infobox'. Apps built with iOS 11 or later SDK must supply app icons in an asset catalog and must also provide a value for this Info.plist key. For more information see http://help.apple.com/xcode/mac/current/#/dev10510b1f7.

Once these issues have been corrected, you can then redeliver the corrected binary.

Regards,

The App Store team


このメールの内容を読むと、Info.plist に CFBundleIconName が無いということですが、これを修正するためにはアイコンを Asset Catalog で指定する必要があります。修正内容は下記のサイトを参考にさせていただきましたので、詳しいことはこちらへどうぞ。
iPhoneアプリ開発:'CFBundleIconName' is missing (Xcode 9) - Mocoゲームブログ

ところで、今回の件で「これはどうなの?」と思ったことがあります。それは、エラーの出力先なのですが、アプリの管理者アカウントに「メールで」送信されたことです。Xcode9 からバイナリをアップロードしたときは Successful と表示されていましたし、iTunes Connect の管理画面にもエラーメッセージ表示されなかったので、アップロード情報に不備はないと判断していました。
今回、TestFlightを使用するということで、管理者とは別に開発者権限を持ったアカウントも作成したのですが、そちらのメールにも送られてきませんでした。
なんだか、ちょっと悪いことをしただけなのに(ファイルの不備なので全然悪いことではないと思いますが)、いきなり先生に報告されたような、そんな気持ちになりました。
今回は管理者(Admin)のメールの内容を知ることが出来ましたが、管理者と開発者が別組織になっている場合などでは、永遠に気が付かないのではないか?という気もします。
以上、ちょっと気になりましたので書かせていただきました。
これから、Asset Catalog に足りないアイコンをちまちまと登録する作業を行いたいと思います。
posted by はるこち at 18:40| Comment(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2017年10月05日

開発用証明書を更新しようとしたらエラー

20171005114853.png
開発用証明書の期限切れのメールが届いていたので、そろそろやるかと始めてみました。証明書の更新は、免許の更新と違って更新した日が新しい期間の開始日になってしまい、期限日がどんどん早くなってしまうので、あまり早めにやらないようにしています。

とはいっても、1年に1回しかやらないでいると、いつのまにかAppleのウェブサイトが変わっていたり、なんかやり方が変わっていてハマってしまうこともあるので、期限日の1週間前くらいにやるのが良いのではないかと思います。

証明書更新の大まかな手順は下記のようになります。

1.準備作業
1-1.キーチェーンアクセスでCSRを作る
キーチェーンアクセスを起動→メニュー左側のキーチェーンアクセス→証明書アシスタント→認証局に証明書を要求
入力内容は下記のとおりです。認証に使われたりするわけではないので、気軽に入力しても大丈夫です。
ユーザのメールアドレス:自分のメールアドレス
通称:自分の名前のローマ字表記など
CAのメールアドレス:空欄
要求の処理:ディスクの保存を選択

1-2.Developer Program にログイン
ここが、毎回画面が変わっていて前回の手順が役に立たなかったりするのですが、今回は、ログインした画面上部の「Account」をクリックして管理画面に入れました。

2.開発用証明書の作成
2-1.開発用証明書(Development Certificate)を新規作成
新しい証明書を作るために、Cetrificate の Development を選択し、「+」をクリックします。今回は、ここでエラーが表示されました。
Maximum number of certificates generated.
20171005101636.png

証明書の最大数に達しています? 以前はこんなメッセージが表示されたことはなかったんですが。。。

とりあえず不要な証明書を消す必要があるようです。今回新しい証明書を作るので、現在登録されている証明書はぜんぶ不要になるはずなんですが、まずは、心当たりのない日付になっている証明書を一つ破棄(Revoke)します。
ちょっと怖い確認画面が表示されますが、古い証明書は使わないので、Revoke をクリックします。
20171005103905.png

これで、改めて「+」ボタンをクリックしたら次の画面に進みました。

2-2.CSRをアップロード
上記 1-1 で作成したCSRをアップロードする画面が表示される前に、CSRの作り方の説明ページが表示されます。すべて英語で書かれているので読みにくいのですが、内容は上記 1-1 と同じです。

次の画面に進むと [Choose File...] というボタンがありますのでクリックし、1-1 で作成したCSR(ファイル名は「CertificateSigningRequest.certSigningRequest」)を選択し、アップロードします。

2-3.証明書をダウンロード
新しい証明書を作ることができました。新しい証明書は一応ダウンロードしてダブルクリックして読み込ませておきます。

3.配布用証明書(Distribution Certificate)の作成
次に、配布用証明書も同じ作業を行って新しい証明書を作ります。

3-1.証明書管理画面で「+」ボタンをクリックして新しい証明書を作ります。
今回は、ここでも Maximum number of certificates generated. のエラーメッセージが表示されたので、開発用証明書の古い方を削除して、再度「+」ボタンをクリックしました。

3-2.CSRのアップロード
CSRのアップロードは開発用と同じです。CSRファイル(CertificateSigningRequest.certSigningRequest)も同じものをそのままアップロードしても大丈夫でした。

3-3.配布用証明書をダウンロード
新しい配布用証明書ができたので、ダウンロードしてダブルクリックして読み込ませておきます。

4.プロビジョニングプロファイルの更新

4-1.開発用プロビジョニングプロファイル
以前は、開発用プロビジョニングプロファイルを作成してダウンロードしたことがあったような気がするのですが、最近は Xcode で管理されているようなので、ウェブの管理画面では特に行うことはありません。

4-2.配布用プロビジョニングプロファイル
配布用プロビジョニングプロファイルがいくつか登録されていると思われますので、とりあえずそれらの証明書を変更します。プロビジョニングプロファイルに紐付けられている証明書を新しいものに切り替えるイメージです。

配布用プロビジョニングプロファイルを一覧で選択すると [Edit] というボタンが表示されますのでクリックします。

新しい画面の中ほどに証明書を選択するオプションボタンが表示されます。日付の新しい方が今回作成したものなので、そちらに切り替えて [Generate] ボタンをクリックします。

プロファイルが作成されたらダウンロードしてダブルクリックして読み込ませておきます。

以上で証明書の更新作業は完了です。Xcode 上で管理されるようになった部分があるとはいえ、それなりの手順になりますし、日数がたつと画面ややり方が変わってしまったりするので、毎回気が抜けない作業です。
posted by はるこち at 19:00| Comment(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2017年01月27日

古いiOSアプリを移行したらスプラッシュスクリーンが表示されなくなったけど解決

iOS4の時代からメンテナンスしているiPadアプリで、いつの頃からかスプラッシュスクリーンが表示されなくなってしまいました。アプリを起動しても、真っ暗な状態で立ち上がり、その後、最初の画面が表示されます。

いろいろ調べましたがどうにも原因がわからないでいたのですが、試しに同じサイズの全く違う画像をダウンロードして設定してみたところ、何事もなかったかのように表示されました。

実は、まったく同じと思っていたのは思い込みで、表示されない画像は 1024x748 で、表示された画像は 1024x768 でした。以前はステータスバーの部分を除いたサイズで作成していたようです。これまで使っていた画像を 1024x768 に修正したところ、普通に表示されました。

古いアプリを新しい環境で動くようにメンテナンスしていくのも、なかなか面倒で骨の折れる作業です。
posted by はるこち at 16:39| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2016年09月16日

iTunes Store operation failed. Missing 64-bit support. Missing recommended icon file.

証明書関係の問題をクリアしましたので、AppStoreに申請するために動作確認をしたあとArchiveして、Validate してみます。予想していたことではありますが、Validate でも多くのエラーが表示されました。

20160916-validate-error.png

1行目は具体的な内容が書かれていないようなので飛ばします。

2行目。Missing 64-bit support. とあります。生成したバイナリが64ビット対応していないようです。対応するには、プロジェクトの Build Settings のページを開いて、Architectures の値を "Standard Architectures" に変更します。

この部分は、以前、 iOS5.1.1に対応する作業を行ったときに $(ARCHS_STANDARD_32_BIT) という値にしてありました。今回はこの値を変更するのですが、変更すると下記のような確認メッセージが表示されます。
20160916-arm64-5_1_1.png
Applications including an arm64 slice are not compatible with versions of iOS prior to 5.1.1
You can set your deployment target to iOS5.1.1 or later.

デプロイメントターゲットとして選択できるのが 5.1.1 以降になるよと書かれています。修正前の設定を確認してみたら 4.2 と書かれていました。かなり古い設定が残っていたようです。(今ネット上では iOS10 が話題になっていますから、なんという古い話をしているのかという感じですが)

3行目。CFBundleShortVersionStringに指定されているバージョン番号が現在のバージョンから上がっていないという指摘です。おっしゃる通りです。書き換えるのを忘れていましたので、書き換えます。

4行目と5行目。iPadに必要なアイコンファイルとして 76x76 と 152x152 が足りないという指摘です。アイコンのサイズバリエーションを作成するには、以前このブログで紹介した「iOSアプリのアイコンの一括リサイズをやってます」というサイトが便利です。

iOSアプリのアイコンの一括リサイズをやってます

今回もこのサイトを使って作ってみます。元になるファイルをアップロードするだけなので簡単です。

上記の修正を行ってから再度 Validate を行ったところ、問題なく通過しました。
20160916-validation-successful.png
posted by はるこち at 14:49| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

Xcode6, iOS App, The identity used to sign the executable is no longer valid.

さて、Appleから届いた「2016/09/30までに古いアプリを再申請しないと消しちゃうからね」という警告メールに対応するために、久しぶりにソースコードを引っ張り出してコンパイルなどしてみているわけですが、案の定、エラーメッセージが表示されたりしています。

ちなみに環境は(あまり新しくないけど)Xcode 6.2です。OSX 10.9.5 では 6.4 は動かないみたいです。

さて表示されたメッセージはこちら。
the-identity-used-to-sign-the-executable-is-no-longer-valid.png
The identity used to sign the executable is no longer valid.
Please verify that your device's clock is properly set, and that your signing certificate is not expired.
(0xE8008018).

とりあえずシステムクロックは間違っていないようなので、やはりCertificate関連に問題があるようです。新しいXcodeではかなり簡略化されるという噂もありますが、今日時点ではまだ新しいXcodeを入手できていないので(OSXのバージョンアップも必要になりそうなので)、どうにか対応しなければなりません。

とりあえず下記のようなことをやってみました。
・iOS Dev Center から Certificate をダウンロードし、ダブルクリックしてインストールする
・開発用プロビジョニングが Expired になっていたので Generate してダウンロードする
・別途作成してあったp12ファイルをキーチェーンアクセスで読み込む

しかし、なかなか状況が改善しません。ググってみたところ、Preferences の Accounts の中のチーム名のところを更新すれば良いという情報を見つけましたのでやってみました。
xcode-preferences-account.png

上のキャプチャ画像の左下にあるリフレッシュアイコンのボタンをクリックしてみます。何やら更新された感じがしましたので、元の画面に戻って実行してみたところ、無事に実機で実行することができました。Xcode6 を使っていて証明書関係のエラーがなかなか消えないという時には、このボタンを押してみてはどうでしょうか。
posted by はるこち at 14:24| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2015年11月19日

iOS8以降でAdHocインストールするにはストア版を削除してから

いつものようにAdHoc用のipaファイルを作成してサーバにアップロードし、先日 iOS9 にバージョンアップした iPadAir にインストールしてテストしようとしましたが、インストールができませんでした。

AdHocインストールのための仕組みのほうは変えていないのですが、エラーメッセージも表示されず、なぜインストールできないのかわかりません。

Xcode の Devices の画面でコンソールログを表示したところ、下記のメッセージが表示されていることがわかりました。
Nov 19 16:23:41 iPadAir itunesstored[2534] : ExternalDownloadManifest: Skipping download and install of: xx.xxx.xxxxx


なぜかインストール処理がスキップされているらしい。。。

このメッセージでぐぐってみたら Stack Overflow のページがヒットしました。

xcode - Enterprise App Update Distribution on iOS 8 - Stack Overflow

これによると、iOS8以降では、ストア版のアプリがインストールされていると AdHoc 版のアプリがインストールできないとということのようです。

対応策は:
・ストア版のアプリを消す
・バンドルIDを別のものにする
・TestFlightを使う
だそうです。

ちょっと不便になったような気がしますが、仕方ないですね。
posted by はるこち at 16:41| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2015年03月24日

The IPA is invalid. It does not include a Payload directory.

ようやく Xcode5 から Xcode6 に乗り換えたのですが、これまでのように実機でテストを行うためにipaを作成し、サーバにアップロードしてOTAインストールをしようとすると、エラーメッセージが表示されました。

Appをダウンロードできません
"AppTest" は現在インストールできません。


ipaを作りなおしてもplistファイルの内容を確認してもエラーが出てしまうので、iPhone構成ユーティリティーでipaを転送してみようとアプリケーションリストにドラッグ&ドロップしてみると。。。

ファイルタイプ "" はサポートされていません。
このアプリケーションは、"Payload" のファイルタイプを
サポートしていません。ファイル拡張子が正しいか確認し
てください。

20150324171740.png
何かファイルの中身が壊れているのかもしれません。
さらに試しに、オーガナイザの Validate を実行してみると、

Archive validation failed with errors:
iTunes Store operation failed.
Unable to process applicaton at this time due to the following error: The IPA is invalid.
It does not include a Payload directory.

20150324172106-2.png
やはり Payload directory が含まれていないというエラーメッセージが表示されました。

このあたりの情報をもとにググってみたところ、下記のページが見つかりました。

xcode - How to solve the ipa is invalid issue ? ios - Stack Overflow

これによると、Info.plist ファイルに下記のキーが必要なようです。

Application requires iPhone environment : YES


追加するには、Xcode6 で AppTest-Info.plist を開いて、一番下の行の[+]マークをクリックします。
そうすると新しい行が追加されるので、左側の欄で「Application requires iPhone environment」を選択し、右側の欄では「YES」を選択します。

そうするとこんな感じになります。
20150324172300.png
これで Archive し、サーバにアップしたところ、無事にインストールすることができました。

Xcode6 に移行する前からこのキーがなかったのか、Xcode6 に移行してからこのキーが何らかの理由で欠落してしまったのかは不明です。

また、Xcode6ではOTAインストール用のplistファイルについては面倒を見てくれなくなったので、自分でplistファイルを編集して作成する必要があるようです。
まあ、これまでも面倒を見てくれていたとは言っても、パス名等を覚えておかなければならず使い勝手はあまり良くありませんでしたが。。。
posted by はるこち at 18:19| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2014年11月20日

iOS6/iOS7 での UISwitch の挙動の違い

今更の話題でたいへん恐縮です。
iOS7になってUIの雰囲気がだいぶ変わり、UISwitchもかなり変わりました。
青い部分が緑色になり、「オン」「オフ」という表記がなくなってスイッチの移動距離が短くなりました。アニメーション的にもちょっとリッチな感じになりました。
これだけで済めば良かったのですが、プログラムコードから見た時の挙動も変わっており、最近になってようやく気がついたので調べてみました。
今回のプログラムでは、何故か TouchUpInside でイベントを拾っていたために差異が大きく出てしまいました。最初から ValueChanged を使っていれば良かったのですが。。。

iOS6のUISwitchは以下のような感じです。
uiswitch_ios6.png
中央の丸い部品(ノブ?)をオフからオンへ移動させ、端にくっついた状態で指を離すと TouchUpInside と ValueChanged の両方が走ります。UISwitch から離れた場所でも TouchUpInside が呼ばれるのですが、厳密にいうと正しくない動作のような気もします。

iOS7のUISwitchは以下のような感じです。
uiswitch_ios7.png
中央の丸い部品を指で押して動かし始めると、円の幅が広くなります。そのまま端まで動かすと幅広の円が真円に変わり、このときにValueChangedのイベントが走ります。指を離さなくてもValueChangedが走るという点でiOS6とはかなり変わっています。
ちなみに指をもっと動かしてUISwitchから離れた場所で指を離すと、TouchUpInsideは呼び出されませんでした。(名前の通りの動作)

今回のプログラムでは TouchUpInside を使っていたため、iOS7以降の端末でUISwitchを指でスライドさせて動かすと反応しないという状況になっていることが分かりましたので、ValueChangedに変更し、とりあえず動作するようになりました。

iOS6とiOS7ではUISwitchでValueChangedイベントが発生するタイミングが以下のように異なることが分かりました。
iOS6:ノブを反対側の端につけた状態で指を離す
  (指を離さないとイベントが起きない)
iOS7:ノブが反対側に到達し、さらに押し込む(幅広の円が真円に変わる)
  (指を離さなくてもイベントが起きる)
UISwitchを使っているアプリの挙動の再確認が必要かもしれません。

2015.03.04追記

iOS7以降では、iOS6以前と比べてUISwitch自体をタップしたときの動作も若干変わっているようです。
iOS6ではタップするとそのまま内部の部品がスライドしていましたが、iOS7以降ではタッチしたとき丸い部品の幅が広がり、タッチに対する反応が見えるようになっています。その状態で指を離すと切り替え動作が実行されるようです。

また、UISwitchが緑色になりオンの表示なのにイベントが走っていないという報告があり、検証してみたところごくまれに発生しうることがわかりました。
UISwitchをタッチしたまま(内部の丸い部品の幅が広くなっている状態のまま)タスク切り替えの挙動に入るとイベントが発生しないことがわかりました。UISwitchを押した状態のまま追加で指3本で画面をタッチして4本指の状態にし、横方向にスライドするとタスク切り替えの状態に入ってしまい、表示は変わっているのにイベントが発生しませんでした。
なおiOS6ではタスク切り替えの動作に入った瞬間にUISwitchの表示状態が元に戻るので、イベントが発生しなくても問題はないようです。
これは超レアケースなので無視してもほとんど問題無いとは思いますが。。。
posted by はるこち at 13:39| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2014年09月09日

iOS5でWebViewのあるダイアログを閉じると落ちる問題

いまさら iOS5 の話題で恐縮ですが、現時点では AppStore で iOS5 用のアプリがダウンロードできることもあり、現在保守しているアプリが iOS5 対応となっている以上、いちおう動作確認をしておかないといけないと思うわけです。それで、iOS5 のときだけアプリが落ちるという現象が見つかりました。

現象としては、ダイアログに乗っている WebView をスクロールさせてダイアログを閉じると、再度ダイアログを開こうとしたときに EXC_BAD_ACCESS が発生して落ちてしまうというものです。

ゾンビオブジェクトを追跡できるようにして実行したところ、下記のようなログが残っていました。
-[UILayoutContainerView setUseFastMode:]: message sent to deallocated instance 0x10075920


ゾンビオブジェクトを追跡するための設定は、下記のサイトを参考にしました。
深淵へ - ゾンビオブジェクトを検出する (Xcode編) - Kazzzの日記
http://d.hatena.ne.jp/Kazzz/20120109/p1

得られた情報をもとにググってみると、下記のページが見つかりました。スクロールが動作しているときに閉じると落ちるようです。TableView でも似たような現象があるらしいので、ScrollView に関係するオブジェクトだと問題があるようです。

objective c - App crashes when Back button tapped while scrolling table view - Stack Overflow
http://stackoverflow.com/questions/10146660/app-crashes-when-back-button-tapped-while-scrolling-table-view

ダイアログが閉じる瞬間にスクロールが止まっていれば良いようなので、viewWillDisappear に下記のように記述したら落ちる問題は解消しました。
- (void)viewWillDisappear:(BOOL)animated
{
[self.webView.scrollView setContentOffset:self.webView.scrollView.contentOffset animated:NO];
}


posted by はるこち at 13:15| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2014年05月12日

No provisioning profiles with a valid signing identity (i.e. certificate and private key pair) were found.

半年くらい前にAppStoreにリリースしたアプリをバージョンアップする必要があり、OTA配信用のReleaseビルドを行なったのですが、アーカイブ処理がエラーになってしまい、なかなか解決しなくて困っていました。

エラーメッセージは
No provisioning profiles with a valid sigining identity (i.e. certificate and private key pair) were found.
provision_01.png

下半分には下記のように書かれています。
No codesigning identities (i.e. certificate and private key pairs) that match the provisioning profile specified in your build settings (“iOS Team Provisioning Profile: [バンドルID]”) were found. Xcode can resolve this issue by downloading a new provisioning profile from the Member Center.

本当はここに解決へのヒントが書かれているので分かる人が見れば分かるのかもしれませんが、私にはわからず2日ほど浪費してしまいました。

シミュレータや実機をUSB接続していれば普通に動くのですが、アーカイブしようとするとエラーになってしまいます。これは、デバッグ実行とArchiveでは使われるプロビジョニングが別のものなので、実機で何度も確認して、いざアーカイブしようとすると、急にエラーに見舞われてしまうことになります。

まずはダイアログにある「Fix Issue」ボタンをクリックしてみたところ、数秒感の処理が行なわれてプロビジョニングプロファイルの選択が「None」に変わったのですが、エラーは解消しませんでした。プロビジョニング関係についてはあまり理解できていないので、エラーメッセージを元にとりあえず「iOS Team Provisioning Profile: 〜〜」というのを選択してみたりしていたのですが、あてずっぽうではなかなか解決しませんでした。

いろいろ試してみた結果「AppStoreリリース用のプロビジョニングプロファイルを新たに作成し、それを使ってアーカイブする」ことで解決しました。

まず最初に、前回AppStoreに申請した時のアーカイブのバックアップを探して、中身を見てみました。オーガナイザの該当行を右クリックすると「Show in Finder」というメニューが表示されますのでクリックします。拡張子が xcarchive となっているファイルがアーカイブのバックアップになっています。

xcarchive の中身を表示させるために xcarchive ファイルを右クリックして「パッケージの内容を表示」を選択します。plist ファイルが見つかったので開いてみたところ、前回の申請時はプロビジョニングプロファイルとして「iPhone Distribution: [組織名] (AppleID)」が指定されているようでした。

ですが、XcodeのBuild Settingsのページでは、プロビジョニングプロファイルを選択しようにも、「iPhone Distribution: [組織名]」という項目が表示されず、選択することができませんでした。前回の申請時は「iPhone Distribution: [組織名]」で良かったものが、最近のXcodeのバージョンアップでこの辺が変わり、指定する形式が新しくなってしまったのではないかと思います。

というわけで、リリース用のプロビジョニングプロファイルを新しく作成することにしました。iOS Dev Centerにログインして「Certificates, Identifiers & profiles」のページに入り、「Provisioning Profies」の「Distribution」を開きます。
provision_03.png

あとは画面の指示通りに必要事項を入力してプロビジョニングプロファイルを作成し、Macにダウンロードしてダブルクリックして取り込み、Xcodeからアーカイブを行なったら無事に完了しました。
provision_04.png

provision_05.png

provision_06.png

provision_07.png

posted by はるこち at 14:05| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2014年02月20日

UILabel に NSAttributedString が表示されないことがある

UITableViewCell に載せた UILabel に NSAttributedString が表示されないことがあるという現象に遭遇しました。
attrstring_01.png
まったく表示されない訳ではなく、上記の例では1行におさまる文字数のときに表示されないようです。

下記の記事を参考に修正しました。

fontSizeによってはUILabelでNSAttributedStringが表示できない!? - きみが思い出になる前に
http://yoshiminu.tumblr.com/post/72195028140/fontsize-uilabel-nsattributedstring

この記事によると、NSAttributeString に指定されているフォントサイズが、表示しようとしている UILabel の高さの30%以上でないと表示されないとのことでした。

attrstring_02.png

当初は下記のようになっていました。
UILabel の高さ:42
フォントサイズ:12
※42×0.3=12.6 → 13以上でないと表示されないことになります。

そこで、UILabel の高さを小さくしました。
UILabel の高さ:32
フォントサイズ:12
※32×0.3=9.6 → 10以上なら表示されることになります。

この修正を行ない、表示されるようになりました。
attrstring_03.png
posted by はるこち at 11:46| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2013年12月27日

iOSアプリ用のアイコンを作ってくれる「iOSアプリのアイコンの一括リサイズをやってます」

先日ブログの記事に書いた makeappicon のサイトが応答無しになってしまうので、他のアイコンリサイズサービスを漁っていたら、「iOSアプリのアイコンの一括リサイズをやってます」というサイトを見つけました。

iOSアプリのアイコンの一括リサイズをやってます
http://araishi.com/icon-resize/

使い方は、まず1024x1024ピクセルのPNG画像を用意し、それをブラウザ画面にドロップするだけです。
icon-resize-site.png

ドロップした瞬間にZIPファイルのダウンロードが始まるのでちょっとびっくりしました。(makeappiconは数分後にメールで送られてきたので)

現時点で、下記のような種類のアイコンを作ってくれます。(リストの中ではiPhone用とiPad用でダブっているものもあります)

iPhoneアプリ用アイコンの種類
appicon.png(iOS6 ホーム用) 57×57
appicon@2x.png(iOS6 retina ホーム用) 114×114
appicon-60@2x.png(iOS7 retina ホーム用) 120×120
appicon-Smalll.png(iOS6 Spotlight検索用) 29×29
appicon-Smalll@2x.png(iOS6 RetinaのSpotlight検索用およびiOS7用) 58×58
appicon-Small-40@2x.png(iOS7 設定用) 80×80
iTunesArtwork(iOS6 app store用/拡張子なしでOK) 512×512
iTunesArtwork@2x(iOS6 retinaおよびiOS7 app store用/拡張子なしでOK) 1024×1024
iPadアプリ用アイコンの種類
appicon-72.png(iOS6 ホーム用) 72×72
appicon-72@2x.png(iOS6 Retinaホーム用) 144×144
appicon-76.png(iOS7 ホーム用) 76×76
appicon-76@2x.png(iOS7 Retinaホーム用) 152×152
appicon-Small-40.png(iOS7 Spotlight検索用) 40×40
appicon-Small-40@2x.png(iOS7 Retina Spotlight検索用) 80×80
appicon-Small-50.png(iOS6 Spotlight検索用) 50×50
appicon-Small-50@2x.png(iOS6 RetinaのSpotlight検索用) 100×100
iTunesArtwork(iOS6およびiOS7 app store用/拡張子なしでOK) 512×512
iTunesArtwork@2x(iOS6およびiOS7 Retina app store用/拡張子なしでOK) 1024×1024

これでiOSアプリの開発がはかどりそうです。
posted by はるこち at 09:14| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2013年12月03日

MacPorts1.9.2 をアンインストールして 2.2.1 をインストールした話

$ sudo port -d selfupdate

を実行してもエラーになってしまうので、ググってみたら、同じようにエラーになっている人が大勢いました。
解決策としては、下記のような感じでした。

  • Xcode から Command Line Tools をインストールする

  • xcodebuild -license でライセンスを agree する

  • xcode-select で使用する環境を選択する



ところが、実際に試してみましたが、いっこうにエラーが解決しません。最後の望みとして、MacPortsをアンインストールして再インストールしてみることにしました。
アンインストールの方法は下記のページを参考にしました。

古くなったMacPortsを再インストール - Shin x blog
http://www.1x1.jp/blog/2011/06/macports_reinstall.html

ところが aalib というパッケージが inifinitie loop? と言われてしまいアンインストールできません。
そこで、下記のページを参考にして強制的にアンインストールしました。

Mac OS X 10.7.2(Lion)に、macports で gcc を入れる(だけの)物語 | JAM☆ぱん
http://playet.jugem.jp/?eid=150

下記のようにするとエラーなどを無視して強制的にアンインストールが実行されるようです。
$ sudo port -f uninstall installed


色々なパッケージがアンインストールされるのでだいぶ時間がかかり、バックアップを取っていなかったので不安になりましたが、問題はありませんでした。

新しい MacPorts は下記のサイトからダウンロードしました。

The MacPorts Project -- Download & Installation
http://www.macports.org/install.php

使用中の MacOS に合うものをダウンロードして、pkgファイルをダブルクリックするとインストーラが表示されます。難しいことは何もなく次へ次へでインストールは完了しました。
posted by はるこち at 15:52| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

thinstuff iRdesktop

iOS用のリモートデスクトップソフト。
開発は2011年頃までで止まっていて、それ以降は iFreeRDP に移行したのではないかと思われる。

iRdesktop: Remote Desktop for the Apple iPhone and iPod Touch
http://www.irdesktop.com/gpl/

thinstuff_irdesktop.jpg
posted by はるこち at 15:43| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

homebrew をインストールしようとしてハマった話

brew が必要になったので homebrew をインストールしようとしたんですが、ネットで調べて homebrew をインストールすれば良いことが分かったので、早速実行してみました。

$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
-e:4: syntax error, unexpected '<'
<!DOCTYPE html>
^
-e:5: syntax error, unexpected '<'
<html>
^
-e:7: syntax error, unexpected '<'
<meta charset='utf-8'>
^
-e:8: syntax error, unexpected '<'
<meta http-equiv="X-UA-Compatible" content="IE=edge">
^
-e:8: syntax error, unexpected tIDENTIFIER, expecting $end
<meta http-equiv="X-UA-Compatible" content="IE=edge">
^


エラーが山ほど表示されて停止します。これはいったいどうしたことか。

1ヶ月ほど前に調べたときは解決策がわからなかったんですが、今日改めて調べてみたら同じエラーに遭遇した人がたくさん見つかりました。

原因は、配布元サイトでパス名が変更になったようです。正しくは下記の通りです。
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
posted by はるこち at 15:33| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2013年11月29日

iOSアプリ用アイコンの各種サイズを作ってくれるサイト

iOS7になってアプリに必要なアイコンサイズの種類が増えました。
まとめると下記のようになります。

Icon-Small.png(29x29)
Icon-Small@2x.png(58x58)
Icon-Small-50.png(50x50)
Icon-Small-50@2x.png(100x100)
Icon-40.png(40x40)
Icon-40@2x.png(80x80)
Icon.png(57x57)
Icon@2x.png(114x114)
Icon-60.png(60x60)
Icon-60@2x.png(120x120)
Icon-72.png(72x72)
Icon-72@2x.png(144x144)
Icon-76.png(76x76)
Icon-76@2x.png(152x152)
iTunesArtwork.png(512x512)
iTunesArtwork@2x.png(1024x1024)

iTunesArtworkを除いても14種類あります。ファイル名からはピクセル数がわからないものもあって面倒な感じですが、とりあえずアイコンを揃えないといけません。

下記のサイトを使うと、1024x1024のアイコン画像から各種サイズのアイコンを自動的に作ってくれます。出来上がった各種アイコンは圧縮ファイルにまとめてメールで送ってもらえるようになっています。
Makeappicon - Generate app icons of all sizes in a click!

使い方は簡単です。まず、下記の画像の場所で元になる画像をしています。ボタンを押してファイルの場所をしていしても良いですし、ドラッグ&ドロップで送信することもできるようです。
makeappicon01.png

しばらくすると処理結果を受け取るメールアドレスを入力する画面になりますので、自分のメールアドレスを入力します。私が試したときはメールが届くまで数分かかりました。
makeappicon02.png

上の画面で「iOS7」「iOS」「Android」と選択することができ、アイコンが実際の端末の画面上でどのように見えるかのサンプル表示があります。この画面構成だと、選択されている端末用のアイコンしか作られないように見えますが、実際にはぜんぶ作られて圧縮ファイルに含まれてきます。
makeappicon03.png

圧縮ファイルのツリー構成はこんな感じになります。これだけの種類のアイコンを自動的に作ってくれるので、便利ですね。
makeappicon04.png
posted by はるこち at 17:19| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

'The NIB data is invalid.' のエラー

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'The NIB data is invalid.'


普段は iOS6 の端末で動作確認していたのですが、ふと iOS5 の端末で実行しようとしたらエラーになりました。

エラーメッセージでググってみると、NIB で Autolayout を使っているためではないかということが分かりました。iOS5 では Autolayout に対応していないためエラーになるようです。

早速確認してみましたが、Autolayout にチェックは入っていませんでした。
autolayout-screen.png

発生する場所は、UITableView にセルを表示するための
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath

の中です。

もう少し調べてみると、カスタムセルに貼付けてある UITextField で、Attribited が指定してあると
えらーになることがわかりました。Attributedが指定されていると、↓こんな感じになります。
attributed_text-screen.png

AttributedをやめてPlainに変更しました。Attributedを使っていた理由はテキストにアンダーラインを引くためのものだったのですが、iOS5のときはアンダーラインはあきらめるようにしようと思います。
posted by はるこち at 16:49| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

2013年08月27日

Xcode でワーニング Obstructing

Xcodeで開いているプロジェクトのファイルを追加したり削除したりしていると、Obstructing というワーニングが表示されることがあります。

Obstructing
/Users/~~~/Release-iphonesimulator is blocking item under version control


このワーニングが表示されたら、コンソールから該当フォルダに移動して svn update を実行すれば良いです。

【参考資料】コンソールで該当フォルダまで簡単に移動する方法
1.コンソールを開きます
2.cd ''([c][d][space][']['])と入力し、シングルクォートの間にカーソルを戻します
xcode-warning-01.png
3.Xcode で目的のファイルまたはフォルダを右クリックして「Show in Finder」を選択します
4.Finderウィンドウで移動したい先のフォルダをドラッグし、先ほどのコンソール画面にドロップします
xcode-warning-02.png
5.ディレクトリ名の最後に余計な空白が入っているので削除します
6.エンターキーを押すと、目的のフォルダへ移動できます

posted by はるこち at 15:19| Comment(0) | TrackBack(0) | iOSアプリ開発 | このブログの読者になる | 更新情報をチェックする

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。