オフラインでもアプリが動くようにとSNSシェア機能の追加アプデ

#はじめに

part1:[サーバも含めたiOSアプリ開発を1から10まで説明(1/2)](https://qiita.com/Raiu1210/items/cc323bbbfba45ccfa1b5) 
part2: [サーバも含めたiOSアプリ開発を1から10まで説明(2/2) *コーディングだけでUIもつくるよ](https://qiita.com/Raiu1210/items/ab365bbe86e16349c060)
アプデ1:[swiftで画面の表示が遅い時の対処法(iosのUIを更新する処理はメインスレッドで行う)](https://qiita.com/Raiu1210/items/e92f7bcd0dc0150ca824)
アプデ2:[オフラインでもアプリが動くようにとSNSシェア機能の追加アプデ](https://qiita.com/Raiu1210/items/56465b3320f30bcbe8da) ⬅️イマココ

[７位当て](https://apps.apple.com/jp/app/7%E4%BD%8D%E3%82%92%E5%BD%93%E3%81%A6%E3%82%8D/id1468442673)
![demo](https://media.giphy.com/media/YnTbaCaOAAkQoyHX1f/giphy.gif)

今回もこちらのアプリに関してです。
詳細はこちら
[サーバも含めたiOSアプリ開発を1から10まで説明(1/2)](https://qiita.com/Raiu1210/items/cc323bbbfba45ccfa1b5)

アプデをしたのでそれについて書きます。

アプデした内容としては
・SNSシェア機能の追加
・オフラインでもアプリが動くように

という内容でした。各バージョンでのgitはこちらで
https://github.com/Raiu1210/hit_7th


#SNSシェア機能（twitterシェアがメイン）
[iOS の Twitter シェア簡易実装 2019](https://qiita.com/kumamotone/items/c1fe3dd5718d29cc94d0)
こちらの記事を参考にしながら実装しました。

やりたかったことは
問題画面でNavigationBarの右側にActionボタンを追加してシェア機能の実装です

```swift
    private func set_navigation_bar() {
        let actionButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.action, target: self, action: #selector(clickActionButton(_:)))
        self.navigationItem.setRightBarButtonItems([actionButton], animated: true)
    }
    
    @objc func clickActionButton(_: UIBarButtonItem) {
        var choices = "A:\(countries[0])\nB:\(countries[1])\nC:\(countries[2])\nD:\(countries[3])\n\n"
        
        let text = "問題：" + data["title"]! + "\n第7位は？\n\n" + choices + "iPhone:https://apps.apple.com/jp/app/7%E4%BD%8D%E3%82%92%E5%BD%93%E3%81%A6%E3%82%8D/id1468442673\n\n#7位当て"
        //        let image: UIImage = #imageLiteral(resourceName: "画像リソース名")
        let shareItems = [text] as [Any]
        let controller = UIActivityViewController(activityItems: shareItems, applicationActivities: nil)
        present(controller, animated: true, completion: nil)
    }
```

set_navigation_bar()で
actionボタンの定義をしてあげて、次の行でnavigationbarに追加といった感じです。

その後、clickActionButton()でアクションボタンが押された時の処理を書いていきます。

固定メッセージでは、問題（選択肢,A,B,C,D）とハッシュタグ"#7位当て"とapp storeでのダウンロードリンクを貼ってあります。

これを初期メッセージとしています。
これにユーザがコメントとかをつけてシェアしてくれると嬉しい。

#オフラインでも動くように
基本的な設計思想としては
・オンラインorオフラインの判定
　・オンライン時
　　・問題データをサーバにrequest
　　・jsonデータを保存（最新版に更新）
　　・出題
　・オフライン時
　　・保存してある問題データを取得
　　・出題

という流れです。

podを使ってReachabilityをインストールして
```import Reachability```
してあげます。

詳細はgithubのコードを見て欲しいんですがざっくり概要として

```swift:
if reachability.connection == .wifi || reachability.connection == .cellular {
            self.get_data_from_server(url: self.data_server)
            self.show_banner_ad()
        } else {
            self.offline_procedure()
        }
```

つまりwifi or cellularでオンラインの場合とそれ以外で処理を分けています。
swiftでファイルを保存する場合、ディレクトリ構造を理解しておいたほうがいいと思うのでこちらの記事も紹介しておきます

[iOSアプリのファイル保存について](https://qiita.com/nnsnodnb/items/13642c4a8d55641f893e)

これを踏まえた上で、ファイルパスを指定して保存していきます。
save_jsonString_data()関数で実行してます。

その前に
クラス内変数に```var json_string_file_path:String = ""```
を用意しておき、viewDidLoad()内で

```swift:
let directory_path = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true)[0]
        let file_Name = "jsonString.txt"
        self.json_string_file_path = directory_path + "/" + file_Name
```


ここで、ファイル書き込み、読み込み時に使うためのファイルパスを用意しておきます。
これを利用しつつ


```swift:
try jsonString.write(toFile: self.json_string_file_path, atomically: false, encoding: String.Encoding.utf8)
```
これが書き込みの一文です。

注意する点としてswiftの場合パスを指定する場合のデータとして
・URL
・String
の２種類があって、関数によって使い分ける必要があるので気をつけましょう。