Xcodeでファイル配置を変更した際に出るWarningの対処方法
Missing file (〜 is missing from working copy)
- gitで該当ファイルをコミットする
Dependency Analysis Warning
- XcodeのUtilities(右カラム)>File inspectorのTarget Membershipからチェックを外す
or
- ProjectのTargets>Build Phases>Copy Bundle Resourcesから該当ファイルを消す
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に追加とその結果
- Embedded BinariesにDynamic Libraryを入れる
→ 確かにクラッシュはしなくなる。動作も問題ない。 しかし、ArchiveしてiTunes ConnectにUploadする時、ValidateでErrorが発生する 内容は、Realm.frameworkにx86_64, i386のarchitectureは含まれていない。と。 ただ実行したいだけであればいいが、今回はStore申請も絡んでいるので却下。
2. 重複しているFrameworkの削除とその結果
- 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"へ入れ直してあげた。
- ひとまずCarthageフォルダ直下にあるBuildフォルダを削除。
その後、
Firebase Crashを使うことで、何故かArchive時に200個以上んwarningが発生。 これの解消方法を探っている時、"Build Phases">“Run Script”>“Run script only when installing"にチェックを入れると解消されるとあり、試したままにしていた。(大量のwarning自体は解消できていない)
- “Build Phases”>“Run Script”>“Run script only when installing"のチェックボックスを外した。
→ 実機実行してもクラッシュせず、Archive後のValidateでもSuccess!! 結局2つのうちどっちが効果あったかは不明だが、"Run script only when installing"が濃厚。 時間がないとはいえ、よくわからないオプションを見よう見まねでつけるのは危険
FirebaseをPodsを使わず直に取り込む際、DLするVersionに注意
前提
- CocoaPodsを使わない
- Firebaseを直にプロジェクトに取り込む
リンクが古い
前提に該当する人は、下記のリンクからzipファイルをDLする人が大半だと思う。 しかし、リンクを見るとFirebaseのバージョンが3.11となっている
ここで今最新のFirebaseがいくつかRelease Noteを確認すると・・・
このように、細かくサイトはメンテナンスされているわけではないようである。
最新版の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型なのに、わざわざ!
をつけてやる意味がわからない。
結果、良いか悪いわからないが、下記記述方法に落ち着いた。
また、let hoge: String
と、String
型で定義してやっても、前者の方法でもなんら問題ない
パターン2:ローカル変数に入れた後、メソッドへ渡した時
先にやりたいことを提示しておく。
下記みたく引数にString
型を取るメソッドにString!
型を渡し、Unwrapして使うようにしたい
しかし、一度別の変数に入れた後、その変数をメソッドに渡すとForceUnwrapしなさいと怒られエラーになる
なぜなのか、型を確認したのが、下記となる。
最初String!
型だったのに、変数に入れた際、
String
型でもString!
型でもなく、String?
型になっている
理由
- 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
これを忘れてはいけない。
追加したら再度実行してみよう。