カテゴリー
SugiBlog ホームページ制作・システム開発|大阪

iOS13で発生するクラッシュ NSInternalInconsistencyException

GoogleMapを使用したiOSアプリを使っていて、地図を表示しているときに急にクラッシュするようになったので原因を調べました。
発生するエラーの内容は以下の通り

Fatal Exception: NSInternalInconsistencyException
Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread.

iOS13で内部仕様が変わったことによるもののようです。

どうもバックグラウンドスレッドからUIを触るなということらしいですが、
そんなことはしていないつもりでした。
おそらくこれまでよりも厳密になったのでしょうか…。
とにかく対応するしかありません。

元のソースコード

let session = URLSession(configuration: URLSessionConfiguration.default)

let task = session.dataTask(with: URLRequest(url: Foundation.URL(string: url)!), completionHandler: { (data, response, error) in
    if let urlContent = data {
        print(urlContent)
    }
})
task.resume()

修正したコード

let session = URLSession(configuration: URLSessionConfiguration.default)

let task = session.dataTask(with: URLRequest(url: Foundation.URL(string: url)!), completionHandler: { (data, response, error) in
    if let urlContent = data {
        DispatchQueue.main.sync {
            print(urlContent)
        }
    }
})
task.resume()
1,016 views

Realm.addでコンパイルエラー

Realm.addメソッドで以下のようなコンパイルエラーが出ました。

'add(_:update:)' is unavailable: Pass .error, .modified or .all rather than a boolean. .error is equivalent to false and .all is equivalent to true.

どうやら第2引数にbool値を与える仕様が変わった模様。
第2引数に与える値はRealm.UpdatePolicyだそうで、
これまでfalseにしていた場合は.error、trueにしていた場合は.allを指定すればいいようです。

Xcode 11.2.1
Swift 5

344 views

iOS12.3.1でイベントdeviceorientationが動作しない

iOS 12.3.1のSafariでは、デフォルトでセンサーの値が取得できなくなったようです。

window.addEventListener("deviceorientation", function(event){}, true);

上記イベントがキャッチできません。

iOS 12.1では動作することを実機で確認しました。

対応策としては[設定]-[Safari]-[モーションと画面の向きのアクセス]をONにすると
キャッチできるようになりますが、一般ユーザーにこの設定を変えてもらうわけにはいきませんよね;
他に何か有用な情報を発見したら追記したいと思います。

804 views

iOS メールを一括で削除する

こちらの方法はiOS7の頃からあった方法のようですが、
現在のiOS11でも出来ます。
少しやり方が特殊で私自身も忘れるのでメモしておきます。

  1. 事前に[編集]-[すべてマーク]-[開封済みにする]で全てのメールを開封済みにします。
  2. 再度[編集]をタップします。
  3. 一番上のメールにチェックを入れます。
  4. 下の[移動]を押しながら、先ほどチェックしたメールのチェックを外します。
  5. [移動]から指を離します。
  6. 全てのメールが選択されたことになり、移動先を聞いてくるのでゴミ箱を選択します。

すると全てのメールを一括でゴミ箱に移すことができました。

605 views

JSONデータをCodableを使って構造化する

JSONデータを解析するためにJSONSerializerを使っていましたが、Swift4からもっと簡単にできるようになったのでやってみました。

CodableというプロトコルがSwift4から新たに追加されました。
これを利用すれば簡単に構造体に落とし込むことができます。

まずはデータを扱う構造体を宣言します。
Codableと付け加えましょう。

struct myData: Codable {
    
    let ID_C: Int
    let NAME_C: String
    let COMMENT_C: String? //nullを許容
    let DATE_C: String

}

次にWEB上からデータを取得するため、URLSessionを使用します。

let session = URLSession(configuration: URLSessionConfiguration.default)
let url = "http://www.example.jp/json.php" //JSONデータを取得するURL

単純に文字列で出力してみましょう。 続きを読む…»

1,635 views