Module compiled with Swift 3.0.1 cannot be imported in Swift 3.1 とADMOB とFirebase

XCODEのバージョンアップ、8.3でModule compiled with Swift 3.0.1 cannot be imported in Swift 3.1

 XCODE8.3,SWIFT3.1で、

XCODE8.3,SWIFT3.1で、以前のプロジェクトをコンパイルするとエラー

REALMをインポートしたプロジェクトをコンパイルするとエラー

Module compiled with Swift 3.0.1 cannot be imported in Swift 3.1

どうも3.0と3.1で相性が悪いらしい。
調べてもうまくいかないので
REALMの最新バージョン2.8をダウンローしてみる
クリーンしてから再度コンパイルしてもだめ

しかし、エラーはでる。
そこで、一旦プロジェクトのRealmを削除して、再度入れたらエラーが消えた。

けつろん
いろいろと試せ!!
しかし、今度は、実行したらエラーになって起動もしない。
バージョンが上がるといろいろと出てくるね。

オプションキーを押しながらCleanをするとCleanのメニューが Clean Build Folder…に変わるらしいので、試すと、今度は
「clang: error: linker command failed with exit code 1 (use -v to see invocation)

となる。

「command + shift + k」
でクリーンしてビルドで直るかと思ったらだめ。>>一番最初にこれをしておけば治ったはず。

どうやらライブラリが不足かにじゅうにとうろくされているかもしれないらしい。

よくよくエラーメッセージを見たら、Pods_Etangoがないじゃん、じゃあ入れればいいのか? 
違うようだった
Showing Recent Messages

ld: framework not found Pods_Etango
clang: error: linker command failed with exit code 1 (use -v to see invocation)

ということで、入れるのですが、それでもだめ
その後、結局、GeneralのLinkged Frameworks and Librariesには
Pods_Etangoをいれずに、クリーンして再度ビルドしたらエラーが消えました。
以前は入れていても何も問題はなかったのに。

今度は、エミュレータがGoogleMobileAdsに関してファイルがないよのエラーになった
SWIFT3.0のときは動いていたのに、3.1しただけでこんな面倒なことになるなら、バージョンアップはしないほうがマシだな。
実機ならOKだろうと思ったら、INSPECT検査ができないとかで実機にもインストールできない
実機にインストールできん

どうやら、Firebase および Mobile Ads SDK バージョンアップしたほうが良さそうです。グーグルアドモブ

その後
いくら調べても直らない。エミュレータも実機もできない。
エミュレータは存在しないディレクトリが無いと言うし、実機確認では、検証できないとかいうエラーだし。
たいていCleanで直る人が多いみたいだが、私の場合は一向に直らない。
アドモブを削除してみても同じだし、新しいバージョンのアドモブを試してもだめ。
こりは新しいXCODEを待つか。

ある情報でPodsを削除して再度PODインストールしたら治ったというので、
プロジェクトのコピーを取って試してみる。
そうしたら、やっとエミュレータが起動するところまで進んだ。
やっとここ。
なのに、今度はソースのRealmのエラーになった。なんだ

「undefined.
2017-07-08 15:40:41.241010+0900 Etango[6056:165088] [aqme] 254: AQDefaultDevice (1): skipping input stream 0 0 0x0
fatal error: unexpectedly found nil while unwrapping an Optional value」

なんのことはなくて、Realmのファイルを取り込んだはずが、取り込まれてませんでした。
Copy Bundleのところで再度追加。
でも次のエラー

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=1 "The following changes cannot be made in additive-only schema mode:
- Property 'KihonQuestion.sentakushiCount' has been added.
- Property 'KihonQuestion.kaisetsuBunsyo' has been added." UserInfo={Error Code=1, NSLocalizedDescription=The following changes cannot be made in additive-only schema mode:
- Property 'KihonQuestion.sentakushiCount' has been added.
- Property 'KihonQuestion.kaisetsuBunsyo' has been added.}: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-802.0.53/src/swift/stdlib/public/core/ErrorType.swift, line 182


どうやらスキーマを変更したらこうなるような意見がネットにあった。
しかし、不思議なのは、このエラーになっているKihonQuestionオブジェクトは読み込みをしていない。
もう一つのEtangoオブジェクトを読み込んでいるのになぜ、別のオブジェクトのエラーになっているのかが不思議。

ネットで見たら、Realmのバージョンをあげたなら、もう一度Realmファイルを作ったらということだった。
でも、Etangoオブジェクトの方は古いバージョンで作ってOKだったような。
でももう一度KihonQuestionオブジェクトの方を出力してみる

それでもだめでした。
ステップ実行すると
try! Realm()は関係するRealmオブジェクトをすべてチェックするみたいです。
そして今回はなにかスキーマに変更があったのに、何もしていないためにえらーになっていたみたい。


ここを参考にして
config = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < 1) {//ここに変更内容を書くけど、私のはなにもなし} }) Realm.Configuration.defaultConfiguration = config


を入れたらエラーがなくなりました。
ここまでが長かった。

しかし、その後、データが0件になってしまって、本来384件あるはずなのに、0になっていた。
どうやらモデルが変わっているのに、変わっていないと勘違いをしていました。
いわゆる変更のあったモデルなのに、変更のないモデルと思い込んでました。

間違っているかもしれないですけど、

モデルが変わるとスキーマのバージョンが変わる。

モデルには、いくつかのテーブルを含む。実は勘違いをしていて、モデル=テーブルだと思っていたら、モデル=複数のテーブルだった。今回、新しくRealmファイルを出力したけど、Realmファイルはモデルであり、モデルに複数のテーブルが追加されるとスキーマのバージョンが変わるらしい。つまり、最初のRealmファイルには2つのテーブルが存在した。
その後、意識をせずに、別の2つのテーブルを作成するオブジェクトクラスを書いていた。
当初、1モデル=1テーブルだと思っていたので、そのままRealmファイルを作成した。
その後、成績用のテーブルを追加して、そのプロジェクトで、Realmファイルを追加すると、そこには4つのテーブルが追加されていた。
しかし、よくわかっていない自分は、1モデル=1テーブル=1Realmファイルだと思っているし、
それが当然だと思ってた。
しかし、えらーになるし、アラートはすでに登録されているカラムがあるよと言っていることが理解できなかった。
つまり、別のRealmファイルに同じテーブルを追加していた。だから重複していたとエラーがあってもりかいできなかった。

間違ったというか新しいモデル(でもこれは間違っていた)
間違った

本来のモデル(以前からのモデル)
本来のモデル

結果こんな感じのコード

まとめ
似たようなエラーが出たときは、まず、クリーンします。オプションキーを押して全部クリアが無難。
2.それでもだめならPodフォルダをファインダーから削除して、AAAA.xcworkspaceプロジェクトファイルもけして、
シェルからpod updateを実行します。
するとPodファイルがアップデートされてまたプロジェクトファイルが作成されます。

ADMOB とFirebase

ADMOBは新しいフレームワークのライブラリを入れても動作した。動作してなかったのは、一旦GADBannerViewDelegateを外していたから。
もとの旧バージョンの時と同様にしたらそのままでもちゃんと広告が表示された。
でもFirebaseについてのコードを書いてなかったので、XCODEのアウトプットWindowに

と表示された。

そこで、
入れてみた。

AppDelegate.swift

今日のアイフォンアプリ開発エラー if(backGroundMusicAudio.isPlaying){ 音が再生されない。

if(backGroundMusicAudio.isPlaying){
サウンドを再生するかどうかの判定処理でEXC_BAD_INSTRUCTIONエラー

[
(lldb) print backGroundMusicAudio.isPlaying
fatal error: unexpectedly found nil while unwrapping an Optional value
error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
The process has been returned to the state before expression evaluation.
(lldb)
]

if(globalSound == 1){グローバル変数で判定にした
どうもSwift3.1で仕様が変わったか?
try backGroundMusicAudio = AVAudioPlayer(contentsOf:url)
とした部分で正常に処理されていない。
Error Domain=NSOSStatusErrorDomain Code=2003334207 "(null)"

AVAudioPlayerの仕様が変わったのか?
backGroundMusicAudio.play()

backGroundMusicAudio.delegate = self as? AVAudioPlayerDelegate
backGroundMusicAudio.prepareToPlay()
backGroundMusicAudio.play()
にしてみた。
でもTRYですでにエラーになってる
var backGroundMusicAudio:AVAudioPlayer! = nil

var backGroundMusicAudio:AVAudioPlayer?
にネットを参考に変更した
だめ。
とりあえず、SKAUDIOか?
それでもだめ。
またネットで検索する。

結論
サウンドファイルがCopy Bundle Resourcesになかっただけでした。
何回かRealmファイルをけしたり入れたりしたときにうっかり連続で消しちゃったのかも

ADMOB,Firebaseの設定

ADMOB FIREBASEで広告を設定するぞ

新しいADMOBの機能として? Firebaseを入れたらアウトプットに以下のエラーが表示された。
アプリもここらへんでストップ。
GoogleService-Info.plistがないからか?
または、またグーグルで何かの登録が必要か?
ダウンロード
https://support.google.com/firebase/answer/7015592?hl=ja

結論
FIrebaseのサイトに移動して、プロジェクトを作成するとGoogleService-Info.plistをダウンロードできました。
あとはプロジェクトにドラッグアンドドロップして、再度実行したらOKでした。

こちらの記事もどうぞ