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をダウンローしてみる
クリーンしてから再度コンパイルしてもだめ

aidayota-no-MacBook-Pro:spaceEtango1223 maseda$ pod update
[in /Users/maseda/Documents/新書類/xcode/2016/spaceEtango1223]
Update all pods
Updating local specs repositories
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 31972 and retry the command.

CocoaPods 1.3.0.beta.2 is available.
To update use: `sudo gem install cocoapods --pre`
[!] This is a test version we'd love you to try.

For more information, see https://blog.cocoapods.org and the CHANGELOG for this version at https://github.com/CocoaPods/CocoaPods/releases/tag/1.3.0.beta.2

Analyzing dependencies
Downloading dependencies
Installing Realm 2.8.3 (was 2.1.1)
Installing RealmSwift 2.8.3 (was 2.1.1)
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 2 total pods installed.

[!] The `Etango [Debug]` target overrides the `FRAMEWORK_SEARCH_PATHS` build setting defined in `Pods/Target Support Files/Pods-Etango/Pods-Etango.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

[!] The `Etango [Debug]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `Pods/Target Support Files/Pods-Etango/Pods-Etango.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

[!] The `Etango [Release]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `Pods/Target Support Files/Pods-Etango/Pods-Etango.release.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.
aidayota-no-MacBook-Pro:spaceEtango1223 maseda$ 

しかし、エラーはでる。
そこで、一旦プロジェクトの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ファイルに同じテーブルを追加していた。だから重複していたとエラーがあってもりかいできなかった。

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

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

結果こんな感じのコード

func readRealm(){
        //realmDBの全件取得
        //EtangoはRealmDBのクラスオブジェクト
        if etango2.count == 0{//初期化されていなければ、RealmDBを取得
            var config = Realm.Configuration()
            let path = Bundle.main.path(forResource: "pokemon2", ofType: "realm")
            config.fileURL = URL(string: (path)!)//
            config.readOnly = true
           /*
            config = Realm.Configuration(
                schemaVersion:0
            )
             */
            
            /*
             //モデルが変わるとスキーマのバージョンが変わる。モデルには、いくつかのテーブルを含む。実は勘違いをしていて、モデル=テーブルだと思っていたら、モデル=複数のテーブルだった。今回、新しくRealmファイルを出力したけど、Realmファイルはモデルであり、モデルに複数のテーブルが追加されるとスキーマのバージョンが変わるらしい。つまり、最初のRealmファイルには2つのテーブルが存在した。
             その後、意識をせずに、別の2つのテーブルを作成するオブジェクトクラスを書いていた。
             当初、1モデル=1テーブルだと思っていたので、そのままRealmファイルを作成した。
             その後、成績用のテーブルを追加して、そのプロジェクトで、Realmファイルを追加すると、そこには4つのテーブルが追加されていた。
             しかし、よくわかっていない自分は、1モデル=1テーブル=1Realmファイルだと思っているし、
             それが当然だと思ってた。
             しかし、えらーになるし、アラートはすでに登録されているカラムがあるよと言っていることが理解できなかった。
             つまり、別のRealmファイルに同じテーブルを追加していた。だから重複していたとエラーがあってもりかいできなかった。
             
             config = Realm.Configuration(
                schemaVersion: 1,
                migrationBlock: { migration, oldSchemaVersion in
                    if (oldSchemaVersion < 1) {}
            })
            // */
            //config = Realm.Configuration(deleteRealmIfMigrationNeeded: false)
            //config = Realm.Configuration(deleteRealmIfMigrationNeeded: false)
            Realm.Configuration.defaultConfiguration = config
            
            //let realm = try! Realm()
            
            //Realm.Configuration.defaultConfiguration = config
            //let realm = try! Realm()
            let getAllDB = try! Realm().objects(Etango.self)
            //let allDBCount = try! Realm().objects(Etango.self).count
            if getAllDB.count > 0{
                for str in getAllDB{
                    if(str.etango != ""){
                        etango2.append([str.etango,str.japanese,str.goro])
                    }
                }
            }
        }
        etango2ALLCount = etango2.count
        print ("etango2ALLCount = \(etango2ALLCount)")
    }

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

ADMOB とFirebase

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

The default Firebase app has not yet been configured. Add `[FIRApp configure];` (`FirebaseApp.configure()` in Swift) to your application initialization. Read more: https://goo.gl/ctyzm8.

と表示された。

そこで、
入れてみた。

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // Use Firebase library to configure APIs
        FirebaseApp.configure()
        return true
    }

今日のアイフォンアプリ開発エラー 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

2017-07-09 15:51:23.446580+0900 Etango[8998:3320081] [DYMTLInitPlatform] platform initialization successful
2017-07-09 15:51:23.763840+0900 Etango[8998:3320069] [Firebase/Core][I-COR000012] Could not locate configuration file: 'GoogleService-Info.plist'.
2017-07-09 15:51:23.764 Etango[8998] <Error> [Firebase/Core][I-COR000012] Could not locate configuration file: 'GoogleService-Info.plist'.
2017-07-09 15:51:23.764472+0900 Etango[8998:3320069] [Firebase/Core][I-COR000005] No app has been configured yet.
2017-07-09 15:51:23.764 Etango[8998] <Error> [Firebase/Core][I-COR000005] No app has been configured yet.
2017-07-09 15:51:23.794968+0900 Etango[8998:3319973] *** Terminating app due to uncaught exception 'com.firebase.core', reason: '`[FIRApp configure];` (`FirebaseApp.configure()` in Swift) could not find a valid GoogleService-Info.plist in your project. Please download one from https://console.firebase.google.com/.'
*** First throw call stack:
(0x1bcd7b3d 0x1af5f067 0x1bcd7a85 0x29d53d 0x1cdfa4 0x1ce14c 0x20f7296d 0x21173deb 0x21178fbd 0x2118bbed 0x211766fb 0x1d5b8c13 0x1d5b8acd 0x1d5b8db7 0x1bc93fdd 0x1bc93b05 0x1bc91f51 0x1bbe51af 0x1bbe4fd1 0x20f6c1e5 0x20f66e13 0x1cf8c4 0x1b3d24eb)
libc++abi.dylib: terminating with uncaught exception of type NSException

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

こちらの記事もどうぞ