Xcode6でiOS8の実機でアーカイブすると、「Process launch failed: Security」

iOS8が載っているiPhone6PlusにてXcode6でアーカイブを試みると、「Process launch failed: Security」と表示され失敗した。
原因は、iPhone6Plusに古いプロビジョニングファイルが入っていたため。
以前使用していたiPhoneからデータを移行したため、プロビジョニングファイルも一緒に移行されたよう。

以下の手順で必要ないプロビジョニングファイルを削除して解決。

  1. iPhone6PlusをUSBでMacに接続
  2. Xcode6のWindow -> Devicesを選択
  3. iPhone6Plusを右クリック -> 「Show Provisioning Profiles」を選択
  4. 削除するプロビジョニングファイルを選択して「-」ボタンをクリック

この手順で必要ないプロビジョニングファイルをすべて削除したら、再アーカイブ。
見事に正常終了。done!

Pocket

XcodeのプロジェクトをコピーしてiOSアプリを複製する

1. Finderで

oldディレクトリをコピーして、newにリネーム。
newディレクトリ内のold.xcodeprojを開く

2. Xcodeで

左ペインでPROJECTを選択。
右ペインのIdentity and Type > Nameをnewに変更。
01.jpg

変更の影響範囲を確認するダイアログが表示されるので、「Rename」を選択。
02.jpg

スナップショットを作成するか聞かれるが、「Disable」を選択。
03.jpg

3. Finderで

new配下のディレクトリやファイルの「old」を「new」に変更する。
04.jpg

new.xcodeprojを開く。

4. Xcodeで

右ペインのIdentity and Type > Locationにあるフォルダアイコンをクリック。
選択画面が出てくるので、newディレクトリのnewを選択。
Identity and Type > Nameを「new」に変更。
07.jpg
08.jpg

左ペインでプロジェクトを選択。
TARGETS > new
General > Identity > Choose Info.plist File…
newディレクトリの中の「new-Info.plist」というファイルを選択。
06.jpg

TARGETS > new
Build Settingsタブで検索窓にpchと入力する。
Prefix Headerという項目があり、そこのパスに含まれるディレクトリ名がoldなのでnewに変更する。
09.jpg

Build Settingsで検索窓にsearchと入力
Library Search Pathsの項目にも、oldが 含まれている場合はnewに変更する。

以上でアプリの複製完了。

Pocket

Storyboradが見つからない時の対処法

Xcode上でiPhoneシミュレータを起動すると、一瞬でアプリが落ちた。
エラーは以下のような内容。

Main.storyboardが見つからないとのこと。

解決方法はstack overflowを参照。

  1. projectName-info.plistのMain story board file based nameを確認。
  2. 1が問題なければ、ツリーからMain.storyboardを右クリックして削除。参照のみ削除する。
  3. プロジェクトを右クリックして、Add Files to [Your Project]を選択。
  4. Main.storyboardを追加する。
  5. プロジェクトをクリーンしてコンパイル。

自分の場合、この方法のみでは解決せず焦る。。。
その原因はMain.storyboardがja.lprojディレクトリ配下にしか存在していなかったから。

そこで、en.lprojにもMain.storyboardをコピー。
ja.lprojのMain.storyboardを先ほどの手順3同様の操作でプロジェクトに追加。

以上の対応で、無事にiPhoneシミュレータ上でアプリが起動するようになりました。

Pocket

Mac の Git で日本語ファイル名を扱う

今まで何年もSVNで管理されてきたプロジェクトをGitに以降しようとすると、MacのGit上で日本語のファイル名のものが差分として表示され困った。
ググったら解決。以下の設定が必要みたい。

一度クローンしたものは削除して、再度リモートからクローンすることで日本語ファイル名のものが差分として表示されないことを確認しました。

Pocket

NSNotificationCenterの使い方

iOSアプリのさまざま状態を監視して、マッチしたときに通知できる「NSNotificationCenter」。
わざわざdelegateメソッドを使わなくてもいいから便利です。

よく使うのは以下の監視状態。

  • UIApplicationDidFinishLaunchingNotification : アプリケーションが起動した直後
  • UIApplicationWillEnterForegroundNotification : アプリケーションがアクティブになる直前
  • UIApplicationDidBecomeActiveNotification : アプリケーションがアクティブになった時
  • UIApplicationDidEnterBackgroundNotification : アプリケーションがバックグラウンドに入る時
  • UIApplicationWillResignActiveNotification : アプリケーションがアクティブじゃなくなる直前
  • UIApplicationWillChangeStatusBarFrameNotification : ステータスバーのサイズ変更される直前
  • UIApplicationDidChangeStatusBarFrameNotification : ステータスバーのサイズ変更が発生した時
  • UIApplicationWillChangeStatusBarOrientationNotification : デバイスの向きが変わる直前
  • UIApplicationDidChangeStatusBarOrientationNotification : デバイスの向きが変わった時
  • UIApplicationDidReceiveMemoryWarningNotification : メモリ不足の警告発生時
  • UIApplicationWillTerminateNotification : アプリケーションが終了される直前

こんな感じでviewDidLoadあたりに書きましょう。

NSNotificationCenterに登録したら、監視を外す処理も忘れずに。
忘れちゃうと、selectorに設定したメソッドが複数回呼ばれたりします。

Pocket

addSubViewしたviewを最前面・最背面に移動する

最前面に移動する

再背面に移動する

Pocket

あるUIViewがすでにaddSubViewされているか判定したい

あるUIViewがすでにsuperViewにaddSubViewされていた場合に、これ以上addSubViewしたくない時は以下の判定文を書けばおk.

Pocket

NSDictionaryの中身をループで取得したい

使うときにはいつも忘れているのでメモ。

keyとvalueが欲しいとき

valueが欲しいとき

Pocket

Objective-Cでfor文中に要素を変更しようとしたらエラー「Collection was mutated while being enumerated.」

列挙子を使ってアクセスしてる時に要素変更しないでねということ。
順番に処理してるのに、要素を削除したりしたら順番狂っちゃうから発生。

調べてみると、reverseObjectEnumeratorを使って逆順に列挙すればokみたい。

Pocket

MacにRMagickをインストールしようとしたらCan’t find MagickWand.h

MacにRMagickをインストールしようとしたら詰まったのでメモ。
ほぼ同じ環境だと思っていた会社のMacにはすんなり入ったのに、自宅のMacでハマってしまった・・・

こんな感じでImageMagickとRMagicのインストールを実行

出たエラーはこちら

調べてみるとPKG_CONFIG_PATHが間違っているとの情報を見つけたので正しくパスを指定する。

それでもエラーがでる!
どこもかしこもこの対応方法しか書いていなくて、だいぶまいっていたところで新しい情報を発見。
Configuring ImageMagick, Rmagick, and Homebrew to play nicely together on OS X Mavericks

この記事の通りに以下を実行して無事インストールが完了しました。。。

Pocket