這篇算是拖了大半年的教學吧XD
由於很多人會問說,該如何從舊的手機匯入簡訊到iPhone,
或者iPhone簡訊消失了該怎麼手動增加…之類的,
所以皮樂就來教大家如何來修改你的iPhone SMS吧。
在開始之前皮樂必須先嚴正聲明:
所有關於SMS的修改教學僅供個人備份、匯入、回復簡訊使用,
請勿利用任何的方式,去修改、創建未經真正傳輸所得到的簡訊,
或者在未經他人同意下修改、備份他人簡訊,
否則要是出事情的話,有可能將會以偽造文書罪處理。
在修改之前,請準備以下的知識以及工具:
1. 一台JB過的iPhone
2. iPhone 簡訊資料庫 sms.db (在 /User/Library/SMS 底下)
3. 一台可以安裝Firefox 4.x以上版本的電腦(不限作業系統)
4. 基本的iPhone檔案權限管理知識
5. 基本的英文能力
首先,請對你的SMS資料庫作備份,以防萬一,
另外,建議仔細檢查一下是否有未傳成功的簡訊,
有的話請傳出去或者刪除,否則可能會造成修改後的檔案出錯
之後開啟Firefox,到這裡安裝外掛,以修改sms.db。
安裝之後在工具裡面開啟SQLiteManager,
接著在SQLiteManager裡面開啟你的sms.db,
在左邊欄位找到Triggers這項,把它展開,
每個人的Triggers數量可能不同,有人有8項,有人只有7項,
不過沒有關係,操作方式都是一樣的。
現在對著 insert_unread_message 、mark_message_read、mark_message_unread、delete_message
這四個Trigger按右鍵,選擇Drop Trigger,使得簡訊的保護機制被刪除。
接著按照下圖指示,去瀏覽簡訊。
點簡訊內容兩下,就可以修改了,按右上角的Add則可以新增簡訊。
接著介紹各項欄位的用處:
(有些人可能沒有最後一項smsc_ref,不過同樣不影響修改)
ROWID:
簡訊在資料庫序列號,為獨一無二,不可重複,
只要不重複的話可以隨意填寫,但是要注意以後收到的簡訊的ROWID都會是以最大值+1開始起跳,
所以一般來說,如果新增簡訊的話,就是填目前的ROWID最大值+1就好了,修改簡訊內容的話則不需要理ROWID。
address:
電話號碼,格式以你資料庫顯示的為準,有些有+886,有些則沒有,
無論是你傳出去,或者對方傳給你的簡訊,這欄一律都是填對方號碼。
date:
簡訊的時間,是UNIX格式,可以在這裡轉換成一般人看得懂的時間。
要注意的是,時間是以GMT標準時間顯示,所以在台灣的話,就請自行加8小時,換算回去的時候也是一樣。
據網友測試,時間一定要照舊到新排列,也就是說ROWID比較大的項目,其date一定也必須比較大,
這一點我還沒有試過,所以無法確認是否一定得這樣作才行。
text:
簡訊內容,可以使用換行符號。
flags:
2是對方傳來,3是你傳出去的。
replace:
不用管,填0就是了。
svc_center:
不用管,留者空白就是了。
group_id:
同一個電話號碼的group_id是一樣的,請按照對方的group_id來填寫。
association_id:
只會出現在flags = 3的情況出現,一般來說會跟date的值一樣,
不過填0似乎也不會怎樣。
height:
填0。
UIflags:
大部分是4跟0、少數會是5或者其他數字,填4或0應該就可以了。
version:
總是0。
subject:
MMS的主旨,如果是一般簡訊的話請留空。
country:
依照你其他的簡訊的值來填,
我的情況是無論我在國外還是對方在國外,都是顯示為tw。
(此項目可能跟電話號碼格式顯示方式有關,不確定)
接下來兩項保持為空,
最後的read:
1為已讀該簡訊,正常來說就填1吧。
修改完畢之後,也不用存檔,因為在修改的時候就會自動儲存了…
接著我們要作的是把刪除的Trigger還原。
接著請一項一項複製貼上到Enter SQL底下的欄位中,之後按下RunSQL。
(請一項一項複製、執行,勿一次執行全部)
1.
CREATE TRIGGER insert_unread_message AFTER INSERT ON message WHEN NOT read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) + 1 WHERE ROWID = new.group_id; END
2.
CREATE TRIGGER mark_message_read AFTER UPDATE ON message WHEN NOT read(old.flags) AND read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) – 1 WHERE ROWID = new.group_id; END
3.
CREATE TRIGGER mark_message_unread AFTER UPDATE ON message WHEN read(old.flags) AND NOT read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) + 1 WHERE ROWID = new.group_id; END
4.
CREATE TRIGGER delete_message AFTER DELETE ON message WHEN NOT read(old.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = old.group_id) – 1 WHERE ROWID = old.group_id; END
之後看到Trigger數量會回到原本修改前的數量就是成功了,
接下來,把sms.db丟回去iPhone中,修改權限(可以使用iFile) 為 755(或777),Owner跟Group為mobile,
最後一定要Respring或重開機,簡訊資料庫才會真正載入進去,
接著請隨便發一封簡訊,發送成功之後刪除該簡訊,
再關閉簡訊程式,重新開啟簡訊程式,進去看看刪除的簡訊是否真正刪除,
如果以上兩個測試OK的話,代表修改完畢的簡訊資料庫是正確,沒有問題的。
本次教學就到這邊,
下次會教大家如何大量匯入簡訊。
強!我要好好的研究這篇
755 是執行檔,sms.db 是資料檔,用 644 應該是可以的。
感謝更正~
我自己是避免權限設不夠,所以都設777…
不知道設太高會有缺點嗎?
2.
SQLiteManager: Likely SQL syntax error: CREATE TRIGGER mark_message_read AFTER UPDATE ON message WHEN NOT read(old.flags) AND read(new.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = new.group_id) – 1 WHERE ROWID = new.group_id; END
[ near “–”: syntax error ]
Exception Name: NS_ERROR_FAILURE
Exception Message: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageConnection.createStatement]
4.
SQLiteManager: Likely SQL syntax error: CREATE TRIGGER delete_message AFTER DELETE ON message WHEN NOT read(old.flags) BEGIN UPDATE msg_group SET unread_count = (SELECT unread_count FROM msg_group WHERE ROWID = old.group_id) – 1 WHERE ROWID = old.group_id; END [ near “–”: syntax error ]
Exception Name: NS_ERROR_FAILURE
Exception Message: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageConnection.createStatement]
怎麼辦?好像那兩個添加不上!
現在才有人看到這個問題,我真不知道該哭還是該笑XDDDD
解決方式:你看到指令當中有個 -1吧?
把那個負號刪除,之後重新打個負號進去,就可以了,
簡單來說,我的網站上面的 “-” 在複製過去的時候字會跑掉,所以你必須重新手動打個 “-” 進去
請問一下我要如何得知哪個號碼是屬於哪個gruop_id?
我這隻iphone是新的,所以沒法查group_id
還是可以從哪個檔案得到?
就算我新增了group_id..原本只有到2(因為拿到iphone後我有收到兩封簡訊)
後來依據我簡訊內的寄信人來增加group_id,從3開始往上加
傳回手機後再傳簡訊給自己測試發現..iphone自己會把我的電話的group_id一樣由3開始加
就是iphone不管我自己設的group_id了,他還是會從他原本自己家的group_id往上加
這樣簡訊就跟以前的混在一起了
而且iphone不能完全顯示我自己增加的簡訊
有些會顯示有些則無…
group_id被我設為1與2的簡訊會顯示出來
但是被我設成3以後的簡訊必須在手機收到被認定group_id=3的寄件人(即是我自己寄給自己簡訊,然後手機認定我這個號碼才是group_id=3)簡訊後才會顯示出來
不知道這樣表達是否清楚(我表達能力有點爛…)
還是我可以寄我的sms.db給您幫我看看呢?
嗯…看來你必須先搜集到新的group id才行,不過請原本傳你簡訊的對方隨便傳一封訊息不就可以了嗎?XD
另外一種方法是,準備兩個手機+門號,從另一只傳簡訊給iPhone,這樣iPhone會得到新的group id,接著改掉對應的號碼,這樣再傳一次,就可以獲得新的group id了
這麼簡單的方法我沒想到
太感謝了!
用自己一支手機自己傳就改好了
不過這樣僅能先把舊簡訊分類好
等那個聯絡人在傳簡訊過來時會建立一個新群組
所以要再去把舊的group_id全部改成新的
不過能看見舊簡訊能在iphone上顯示已經很感動了
感謝您啦
請問一下part2有沒有?
還沒寫,不過好像也忘記本來要寫什麼了(被打
我想問一下,是否一定要使用OS X,才能把sms.db拿出來啊?
或者有其他方法可以拿,煩請解惑了
不是啊,Windows也可以用的,你先去找一下Windows底下管理iPhone檔案的教學吧
了解,謝謝您,我會努力的:)
想請問一下皮勒姐,我的愛瘋今天忽然在我打簡訊時當機斷電,結果重新開機後發現簡訊全部不見,照這邊的教學打開sms.db檔後也沒有發現過往的資料,請問這樣是代表舊有的資料全沒了,沒挽救的餘地了嗎?
上面忘記說明我的手機的系統資料,3GS、iOS 4.3.3、JB過、使用biteSMS。
如果你的SMS.db大小太小的話,表示真的已經遺失資料了,請使用iTunes恢復檔案吧
您好,我近期在嘗試著將同一個人的兩隻不同手機號碼的簡訊合併,我將address和group_id改成相同的,但是重新開機後,兩者的簡訊並沒有合併在一起。(權限有改成755或777了)
是不是我有哪一個部份沒有做到呢?或者其實這件事是不可行的啊…@@
補一個,address似乎沒有辦法打”+886″的”+”吔…有辦法以其他的方式輸入嗎??
iOS5可能不一樣了,我沒在iOS5用過
您好請問一下,我手邊是iphone 6,請問回復Trigger程式碼跟您上面所敘述的還是一樣嗎?因為我看目前IOS 8.1.2 的Trigger 名稱有些不一樣,煩請您解答一下感謝^^
此為我IOS 8.1.2 DB上面的Trigger照片
http://imgur.com/uvIXdpT
現在 trigger 名稱都改了,但是重點是只要可以編輯就好,記得現在 trigger 不會鎖編輯,所以不必刪除…
ok , 謝謝您解答^^
請問要如何看出簡訊有被修改過
完美被修改過的話是看不出來的,但是如果讀取資料庫的話,可以從時間戳記去推算是否合理(例如有三四封簡訊進去看時間點發現是同一秒發出來的話,那就不合理了)