面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

Library not loadedでCrashした時に行なった対処

Library not loadedでクラッシュとの遭遇

アプリを作っている時は、問題なく実機で実行できていたが、 iTunes ConnectにバイナリのUploadが終わって、メタデータ用のスクリーンショットを撮ろうとシミュレータで実行した際に下記内容のクラッシュに初遭遇した。

dyld: Library not loaded: @rpath/Realm.framework/Realm
Referenced from: /var/containers/Bundle/Application/...
Reason: image not found

1. Embedded Binariesに追加とその結果

stackoverflow.com

  • Embedded BinariesにDynamic Libraryを入れる

→ 確かにクラッシュはしなくなる。動作も問題ない。 しかし、ArchiveしてiTunes ConnectにUploadする時、ValidateでErrorが発生する 内容は、Realm.frameworkにx86_64, i386のarchitectureは含まれていない。と。 ただ実行したいだけであればいいが、今回はStore申請も絡んでいるので却下。

2. 重複しているFrameworkの削除とその結果

uchinoinu.hatenablog.jp

  • 1.の対処を行なった結果、"Linked Frameworks and Libraries" に同名のframeworkが存在していたの削除

→ 結果変わらずクラッシュするまま。

3. Carthageの再updateと"Run script…“のチェックボックスを外す

  • 直前問題を起こしていそうな操作を思い出した結果、Carthage自体を0.22へversion upさせていた

    • ひとまずCarthageフォルダ直下にあるBuildフォルダを削除。 その後、carthage updateで再度Build以下を作り、"Linked Frameworks and Libraries"へ入れ直してあげた。
  • Firebase Crashを使うことで、何故かArchive時に200個以上んwarningが発生。 これの解消方法を探っている時、"Build Phases">“Run Script”>“Run script only when installing"にチェックを入れると解消されるとあり、試したままにしていた。(大量のwarning自体は解消できていない)

→ 実機実行してもクラッシュせず、Archive後のValidateでもSuccess!! 結局2つのうちどっちが効果あったかは不明だが、"Run script only when installing"が濃厚。 時間がないとはいえ、よくわからないオプションを見よう見まねでつけるのは危険

FirebaseをPodsを使わず直に取り込む際、DLするVersionに注意

前提

  • CocoaPodsを使わない
  • Firebaseを直にプロジェクトに取り込む

リンクが古い

前提に該当する人は、下記のリンクからzipファイルをDLする人が大半だと思う。 しかし、リンクを見るとFirebaseのバージョンが3.11となっている f:id:aryzae:20170506204238p:plain

ここで今最新のFirebaseがいくつかRelease Noteを確認すると・・・ f:id:aryzae:20170506204536p:plain

このように、細かくサイトはメンテナンスされているわけではないようである。

最新版のURL

最新版を取得するには、ひとまず下記のようにしたらDL可能だった。

https://dl.google.com/firebase/sdk/ios/3_11_0/Firebase-3.11.0.zip?hl=ja

https://dl.google.com/firebase/sdk/ios/3_17_0/Firebase-3.17.0.zip?hl=ja

Swiftの文字列にて、Implicitly Unwrapped Optional型の文字列を扱う際に失敗した話

Implicitly Unwrapped Optional型と呼ばれる下記のような記述を行うことで、 この変数を使う時にUnwrapしてくれるというのは大体の人は知っていると思う。

let hoge: String!

しかし、Unwrapしない時もあり、そのパターンに嵌ったので今後同じことがないように記録

パターン1:文字列に組み込んだ時 “hoge\(fuga)moga”

下記の場合、Unwrapされず、文字列にOptionalとまで入ってしまう。 hogeに対して!をつけてやればUnwrapされ、欲しい文字列になるだろうが、 Implicitly Unwrapped Optional型なのに、わざわざ!をつけてやる意味がわからない。 f:id:aryzae:20170502214215p:plain

結果、良いか悪いわからないが、下記記述方法に落ち着いた。 また、let hoge: Stringと、String型で定義してやっても、前者の方法でもなんら問題ない f:id:aryzae:20170502214219p:plain

パターン2:ローカル変数に入れた後、メソッドへ渡した時

先にやりたいことを提示しておく。 下記みたく引数にString型を取るメソッドにString!型を渡し、Unwrapして使うようにしたい f:id:aryzae:20170502215911p:plain

しかし、一度別の変数に入れた後、その変数をメソッドに渡すとForceUnwrapしなさいと怒られエラーになる f:id:aryzae:20170502215906p:plain

なぜなのか、型を確認したのが、下記となる。 最初String!型だったのに、変数に入れた際、 String型でもString!型でもなく、String?型になっている f:id:aryzae:20170502220105p:plain

理由

  • Swift3からImplicitly Unwrapped Optionalは、Optional型に付属するようになった
  • 型評価が必要な時だけUnwrapされる
  • それ以外はOptionalとして保持されている www.natashatherobot.com

Frameworkに含まれるXIBやNIBファイルを使用しているのに表示されず"Unknown class HogeClass in Interface Builder file."と出る時の対処方法

3rd Party提供Frameworkに含まれるXIB、NIB

3rd Partyが提供しているFrameworkには、稀にXIBやNIBが含まれており、それを画面上に配置して使うことがある。 この時、Xcodeプロジェクトに取り込み、StoryboardでCustomClassとして適用して使うこともあるだろう。

動作確認すると・・・

配置もバッチリ!動作確認で動かしてみる・・・。 するとどうだろう画面には取り込んだはずのXIBやNIBの面影すらない。

ログを確認すると

Unknown class HogeClass in Interface Builder file.

と出ている。 取り込んだはずなのに、Unknownとかどういうこと?ってなること必死である。

解決方法

Build Setting>Linking>Other Linker Flags-ObjC を追加する

Frameworkで忘れがちな-ObjCこれを忘れてはいけない。 追加したら再度実行してみよう。

フリーのApple IDアカウントを使ってXcodeからアプリを実機転送できることで、App ID登録時にエラーを出してしまう可能性の問題

要約

  • Xcode7からApple IDアカウントがあれば、有料の開発者登録を行わずとも実機にアプリを転送できるようになった
  • その結果App IDを無作為に作成することができ、アカウントが違っても同じApp IDを作成することはできないので、何故かApp IDの登録でエラーになり、ナンデー?!となることも
  • フリーアカウントではApp IDの管理が一切できず、有料登録をするのも実際の開発をする人ぐらいなので、App ID取得するだけして放置される問題がある
  • 個人的には有料の開発者登録している人のみが実機にアプリを転送できる以前に戻って欲しい

問題の発生内容

1.→ フリーのApple IDアカウントでXcodeにサインイン後、適当なプロジェクトを作成

2.→ Bundle Identifierを任意のものに設定する

3.→ 実機を繋いでビルドする

4.→ 下記スクリーンショットのようにプロビジョニングが自動生成され、App IDも一意のものとして作成される

f:id:aryzae:20170422022542p:plain

5.→ 有料登録している開発者アカウントでApple Developerにサインインし、「2.」のBundle Identifierと同じ文字列をApp IDに登録を試みる

f:id:aryzae:20170422022540p:plain

6.→ 「There were errors in the data supplied. Please correct and re-submit.」「An App ID with Identifier ‘~’ is not available. Please enter a different string.」

とエラーが出て使えないから別のApp IDにしてねと言われる。

過去に自分が別アカウントとかで作って、忘れてる場合等にはこのエラー内容じゃ何がダメなのかわからないのも問題。

「既に使われています。」くらいのエラーは出して欲しいところ。

f:id:aryzae:20170422022541p:plain

対策

  • 安直な逆ドメインのApp IDとかは被りやすいため、なるべく複雑なものにする必要がある。
  • 個人のフリーアカウントで開発し、リリースは会社等の別アカウントで行う場合、誤ってフリーアカウントでApp IDを取ることもあるため、開発中は仮のBundle Identifierを設定したり、証明書とプロビジョニングをリリース予定アカウントから引っ張ってくる
  • ベストなのは、有料登録済みのリリース予定アカウントで、App IDを先に作成しておく

参考URL

dev.classmethod.jp