LINEトーク履歴の移行方法：LINE iOS版 v5.9.5 (2016/03/27現在)

本記事では，LINEのトーク履歴の移行方法について説明します．iTunesの暗号化バックアップ法とは異なる方法で，履歴ファイルを直接コピーすることになります．iPhoneを初期化したり復元したりすることなく，LINEだけを移行したい場合に特に有効です．

* 動作試験環境
  * LINE iOS版
  * バージョン 5.9.5〜6.0.0 (2016/03/27現在)
  * iPhone 5/5s (おそらくiPhone 6/6Sでも可)
  * iOS 8.4 (おそらく9.x系でも可)
  * 脱獄済み
     - OpenSSH等がインストール済みであること．
     - iFunBoxを使用する場合は，Apple File Conduit2がインストール済みであること．

この方法の実施するには，sshやscpのコマンドが使えるPCがあると簡単です．iFunBoxだけでもなんとか実施できますが，検索機能がないようなので，ちまちまフォルダを開いて中身を確認するという面倒くさい作業が必要です．
なお，この記事では，トーク履歴の移行元となるiPhoneを「旧端末」，移行先となる端末を「新端末」と呼びます．

# 全体の流れと引き継ぐファイル
最初に全体の流れを説明します．順番を誤ると旧端末のLINEのデータが初期化されてしまって，データを移行できなくなります．

1. 旧端末のデータをPCにコピー
2. 新端末のLINEでアカウントにログインし，アカウントを引き継ぐ
   (この際旧端末のLINEの初期化が行われないように注意)
3. コピーしておいたファイルを新端末に上書き

引き継ぐファイルは，下記の2つです．

* `Line.sqlite`, `Line.sqlite-shm`, `Line.sqlite-wal`:
  トーク履歴本体です．`Line.sqlite-shm`, `Line.sqlite-wal`は存在しない場合もあります．
* `Message Attachments`:
  こちらはトーク履歴の画像・音声・動画等です．不要な場合は引き継ぐ必要はありません．

# 旧端末のデータをPCにコピー
## トーク履歴のコピー
`Line.sqlite`および付随ファイル(`Line.sqlite-shm`と`Line.sqlite-wal`)をPCにコピーします．

### `Line.sqlite`の保存先の特定
`Line.sqlite`のパスは下記となりますが，パスの一部は環境依存なのでパスの特定作業が必要です．iFunBoxでもおそらく特定可能ですが，検索機能がないようなので，ちまちまフォルダを開いて中身を確認するという面倒くさい作業が必要です．

```bash:Line.sqliteのパス
/var/mobile/Containers/Shared/AppGroup/<AppDomainGroup-group.com.linecorp.line>/Library/Application\ Support/PrivateStore/<P_u●●●●●●●●>/Messages/Line.sqlite
```

上記パスの以下2つの部分は，環境依存で変化する部分です．

* `<AppDomainGroup-group.com.linecorp.line>`: LINEアプリのインストール毎に変化します．
* `<P_u●●●●●●●●>`: LINEアカウントにより異なります．

iPhone上のTerminalを使用するか，sshでログインして下記コマンドを実行します．もしそのようなコマンドを使えない場合は，iFunBoxやiFileで頑張って探します．上述のファイルパスを参考に頑張って探してください．

```bash:Line.sqliteのパス特定
ssh mobile@<旧端末のIP>
find /var/mobile/Containers/Shared/AppGroup/ -name Line.sqlite

# 結果は下記のような形
/var/mobile/Containers/Shared/AppGroup/01234567-89AB-ACEF-0123-456789ABCDEF/Library/Application Support/PrivateStore/P_u0123456789abcdef0123456789abcdef/Messages/Line.sqlite
```

### `Line.sqlite`をPCにコピー
`Line.sqlite`，`Line.sqlite-shm`，`Line.sqlite-wal`をPCにコピーします．下記コマンドは一時的データを保存するPCで実施します．Mac，Linux，CygwinかMSYSが入ったWindowsなどで実施可能です．

```bash:Line.sqliteをPCにコピー
mkdir ~/line_tmp
scp mobile@<旧端末のIP>:<Line.sqliteのパス> ~/line_tmp/
scp mobile@<旧端末のIP>:<Line.sqlite-shmのパス> ~/line_tmp/
scp mobile@<旧端末のIP>:<Line.sqlite-walのパス> ~/line_tmp/

# なお，`Line.sqlite`のパスは2回エスケープします．例えばこんな感じ
scp mobile@192.168.0.101:"'/var/mobile/Containers/Shared/AppGroup/■■■■■■■■/Library/Application Support/PrivateStore/P_u●●●●●●●●/Messages/Line.sqlite'" ~/line_tmp/
# `Line.sqlite-shm`と`Line.sqlite-wal`もコピーしておきます．
scp mobile@192.168.0.101:"'/var/mobile/Containers/Shared/AppGroup/■■■■■■■■/Library/Application Support/PrivateStore/P_u●●●●●●●●/Messages/Line.sqlite-shm'" ~/line_tmp/
scp mobile@192.168.0.101:"'/var/mobile/Containers/Shared/AppGroup/■■■■■■■■/Library/Application Support/PrivateStore/P_u●●●●●●●●/Messages/Line.sqlite-wal'" ~/line_tmp/

# もしLine.sqlite-shmとLine.sqlite-walがなければ，同名の空ファイルで問題ありません．
touch ~/line_tmp/Line.sqlite-shm
touch ~/line_tmp/Line.sqlite-wal
```

ここではscpコマンドを使った方法を提示しましたが，iFunBoxでもかまいません．`Line.sqlite-shm`，`Line.sqlite-wal`はメモ帳などを使って空ファイルを作成してください．

## トーク履歴の画像・音声・動画のコピー
トーク履歴の画像・音声・動画等も移行したい場合は，`Message Attachments`も移行します．不要であれば`Message Attachments`に関わる手順は省略できます．

### `Message Attachments`の保存先の特定
パスは下記となりますが，`Line.sqlite`と同様にパスの一部は環境依存なので，特定作業が必要です．`Line.sqlite`とよく似たパスですが，異なるフォルダです．混同しないように気をつけてください．

```bash:MessageAttachmentsのパス
/var/mobile/Containers/Data/Application/<AppDomain-jp.naver.line>/Library/Application Support/PrivateStore/<P_u●●●●●●●●>/Message Attachments
```

上記パスの以下2つの部分は，環境依存で変化する部分です．

* `<AppDomain-jp.naver.line>`: LINEアプリのインストール毎に変化します．
* `<P_u●●●●●●●●>`: LINEアカウントにより異なります．

特定作業を行います．iPhoneのTerminalを使用するか，sshでログインして下記コマンドを実行します．

```bash:MessageAttachmentsのパス特定
ssh mobile@<旧端末のIP>
find /var/mobile/Containers/Data/Application/ -name "Message Attachments"

# 結果は下記のような形
/var/mobile/Containers/Data/Application/01234567-89AB-ACEF-0123-456789ABCDEF/Library/Application Support/PrivateStore/P_u0123456789abcdef0123456789abcdef/Message Attachments
```
### `Message Attachments`をPCにコピー
`Message Attachments`をPCにコピーします．下記コマンドは一時的データを保存するPCで実施します．Mac，Linux，CygwinかMSYSが入ったWindowsなどで実施可能です．

```bash:MessageAttachmentsをPCにコピー
scp -r mobile@<新端末のIP>:<Message Attachmentsのパス> "~/line_tmp"

# なお，Message Attachmentsのパスは2回エスケープします．例えばこんな感じ
scp -r mobile@192.168.0.101:"'/var/mobile/Containers/Data/Application/■■■■■■■■/Library/Application Support/PrivateStore/P_u●●●●●●●●/Message Attachments'" "~/line_tmp"
```

# 新端末のLINEでアカウントにログイン
新端末でLINEログインを実施します．

1. 何かあった時のために，iTunesやiCloudで旧端末をバックアップしておいてください．
1. 旧端末のLINEの設定から「アカウント引き継ぎ設定」>「アカウントを引き継ぐ」をONにします．
1. 新端末のLINEでログインを実施します．
1. 旧端末のLINEに「利用することができません」という画面が表示される．この状態で止める．
  ここで旧端末のLINEでは「確認」は押さない限り，旧端末のデータは削除されないので，前述の手順で失敗していても立ち戻れます．

# コピーしておいたファイルを新端末に上書き
## `Line.sqlite`の上書きコピー
最初に新端末上の`Line.sqlite`のパスを特定し，特定したパスに対して事前にコピーしておいた旧端末のファイルを上書きします．

先ほどと同様に，新端末上の`Line.sqlite`のパスを特定します．

```bash:MessageAttachmentsのパス特定
ssh mobile@<新端末のIP>
find /var/mobile/Containers/Data/Application/ -name "Message Attachments"
```

コピーしておいた`Line.sqlite`を新端末の`Line.sqlite`に上書きします．上書きはiFunBoxを使用するとうまくいきます．scpで上書きする場合は，パスに含まれるスペースを二重にエスケープする必要があります．

```bash:Line.sqliteのパス上書きコピー
scp ~/line_tmp/Line.sqlite mobile@<新端末のIP>:<Line.sqliteのパス>

# なお，`Line.sqlite`のパスは2回エスケープします．例えばこんな感じ
scp ~/line_tmp/Line.sqlite mobile@192.168.0.102:"'/var/mobile/Containers/Shared/AppGroup/■■■■■■■■/Library/Application Support/PrivateStore/P_u●●●●●●●●/Messages/'"
# `Line.sqlite-shm`と`Line.sqlite-wal`もコピーしておきます．
scp ~/line_tmp/Line.sqlite-shm ~/line_tmp/Line.sqlite-wal mobile@192.168.0.102:"'/var/mobile/Containers/Shared/AppGroup/■■■■■■■■/Library/Application Support/PrivateStore/P_u●●●●●●●●/Messages/'"

# もしファイルがあれば，Line.sqlite-shmとLine.sqlite-walもコピーしておきます．
# うまくいかないときは，同名の空ファイルを作成しておくとうまくいくことがあります．
```

以上でトーク履歴の移行が完了します．

## `Message Attachments`の上書きコピー
最初に，新端末上の`Message Attachments`のパスを特定し，特定したパスに対して事前にコピーしておいた旧端末のファイルを上書きします．

新端末上の`Message Attachments`のパスを特定します．iPhoneのTerminalを使用するか，sshでログインして下記コマンドを実行します．

```bash:MessageAttachmentsのパス特定
ssh mobile@<新端末のIP>
find /var/mobile/Containers/Data/Application/ -name "Message Attachments"
```

コピーした`Message Attachments`フォルダをまるまる新端末の`Message Attachments`に上書きします．上書きはiFunBoxを使用するとうまくいきます．scpで上書きする場合は，パスに含まれるスペースを二重にエスケープする必要があります．

```bash:MessageAttachmentsの上書きコピー
scp -r "~/line_tmp/Message Attachments/" mobile@<新端末のIP>:<Message Attachmentsのパス>

# なお，Line.sqliteのパスは2回エスケープします．例えばこんな感じ
scp -r "~/line_tmp/Message Attachments/" mobile@192.168.0.102:"'/var/mobile/Containers/Data/Application/■■■■■■■■/Library/Application Support/PrivateStore/P_u●●●●●●●●/Message Attachments/'"
```

以上でトーク履歴の画像・音声・動画等の移行が完了します．

## 注意点
動作が変なときは下記を確認し，修正する．

* 上書きしたファイルが読み書き可能になっているか確認
* 上書きしたファイルの所有者が`mobile:mobile`になっているか確認
* ファイルが正しくコピーできているかmd5sum等で確認

# バージョン更新で保存先が変わった時は？
同様の方法でファイルパスを特定してそれっぽいファイルを上書きコピーすればいけるはずです．ただし，Line.sqliteは以前はtalk.sqlite
だったりしてファイル名も変更されているので，トーク履歴のファイルを特定するのはちょっと面倒です．

手順としては，line関連の適当なフォルダを漁ってみて，適当なsqliteファイルを見つけたら下記コマンドを実行してみて，トーク履歴っぽい結果が表示されれば当たりです．sqlite3コマンドはMacなら多分標準で入っています．Windowsでやるならsqlite3のツールを拾ってくるかCygwinでも使ってください．

```bash:sqlite3コマンド
sqlite3 <sqliteファイルのパス> "SELECT * from ZMESSAGE;"
```

LINEトーク履歴のsqlite構造については，下記サイトが参考になりました．
* [【要脱獄】LINEで削除した友達データを復元する方法 - 本日も皐月晴れ](http://megasatsuki.blog.fc2.com/blog-entry-99.html)