iOS7ã®ã¦ã¼ã¶è¾æ¸ããªã»ããããã¹ã¯ãªãã
前回ã¾ã§ã«èªåã®iPhoneã¨MacBookã®ã¦ã¼ã¶è¾æ¸ã¯åæããããã«ãªã£ãã®ã ãã©ããã®æé ã¯ã¡ãã£ã¨è¤éã ã£ããåã³åæã§ããªããªã£ãæã®ãã¨ãèãã¦ãç´ æ©ããå®å ¨ã«ãiPhoneã®ã¦ã¼ã¶è¾æ¸ããªã»ããããã¹ã¯ãªããã«ãã¦ãããã¨ãæãç«ã£ãã
mbdbãç·¨éããRubyã³ã¼ãï¼reset_keyboard.rbï¼
- ãã¡ãã¡ããã¹ãã«æ¸ãåºããã¨ããmbdbã®å 容ã忍鏿ã§ããããã«æ¹è¯ããã
- ãmbdb.reject!(/HomeDomain::Library\/Keyboard/)ãã«ãã£ã¦ããã¼ãã¼ãã«é¢é£ããè¨å®ãã¡ã¤ã«ã䏿¬åé¤ãã¦ããã
# encoding: ASCII-8BIT class Mbdb def initialize(mbdb_filename, verbose = false) @verbose = verbose process_mbdb_file(mbdb_filename) end def to_text_file(filename) File.open(filename, 'w') do |f| @mbdb.each do |r| f.puts r.values.inspect end end end def to_mbdb_file(filename) File.open(filename, 'wb') do |f| f.write(binary_data) end end def reject!(regexp) @mbdb.reject! {|r| "#{r[:domain]}::#{r[:filename]}" =~ regexp} end def fill!(regexp) @mbdb.reject! {|r| !("#{r[:domain]}::#{r[:filename]}" =~ regexp)} end private # Return an integer (big-endian) and new offset from the current offset def get_int(data, offset, intsize) value = 0 while intsize > 0 value = (value<<8) + data[offset].ord offset += 1 intsize -= 1 end return value, offset end # Return a string and new offset from the current offset into the data def get_string(data, offset) return 'ffff', offset + 2 if data[offset] == 0xFF.chr and data[offset + 1] == 0xFF.chr # Blank string length, offset = get_int(data, offset, 2) # 2-byte length value = data[offset...(offset + length)] value = '0000' if value == "" return value, (offset + length) end def put_int(data_10, intsize) data_16 = "%0#{intsize*2}x" % data_10 [data_16].pack('H*') end def put_string(str) return "\xff\xff" if str == 'ffff' return "\x00\x00" if str == '0000' return [str.length].pack('n') + str end def process_mbdb_file(filename) @mbdb = Array.new data = File.open(filename, 'rb') { |f| f.read } puts "MBDB file read. Size: #{data.size}" raise 'This does not look like an MBDB file' if data[0...4] != 'mbdb' offset = 4 offset += 2 # value x05 x00, not sure what this is while offset < data.size fileinfo = {} fileinfo[:domain], offset = get_string(data, offset) fileinfo[:filename], offset = get_string(data, offset) fileinfo[:linktarget], offset = get_string(data, offset) fileinfo[:datahash], offset = get_string(data, offset) fileinfo[:unknown1], offset = get_string(data, offset) fileinfo[:mode], offset = get_int(data, offset, 2) fileinfo[:unknown2], offset = get_int(data, offset, 4) fileinfo[:unknown3], offset = get_int(data, offset, 4) fileinfo[:userid], offset = get_int(data, offset, 4) fileinfo[:groupid], offset = get_int(data, offset, 4) fileinfo[:mtime], offset = get_int(data, offset, 4) fileinfo[:atime], offset = get_int(data, offset, 4) fileinfo[:ctime], offset = get_int(data, offset, 4) fileinfo[:filelen], offset = get_int(data, offset, 8) fileinfo[:flag], offset = get_int(data, offset, 1) fileinfo[:propertynum], offset = get_int(data, offset, 1) fileinfo[:properties] = {} (0...(fileinfo[:propertynum])).each do |i| propname, offset = get_string(data, offset) propval, offset = get_string(data, offset) fileinfo[:properties][propname] = propval end @mbdb << fileinfo end @mbdb end def binary_data bin = "mbdb\x05\x00" @mbdb.each do |h| bin << put_string(h[:domain]) bin << put_string(h[:filename]) bin << put_string(h[:linktarget]) bin << put_string(h[:datahash]) bin << put_string(h[:unknown1]) bin << put_int(h[:mode], 2) bin << put_int(h[:unknown2], 4) bin << put_int(h[:unknown3], 4) bin << put_int(h[:userid], 4) bin << put_int(h[:groupid], 4) bin << put_int(h[:mtime], 4) bin << put_int(h[:atime], 4) bin << put_int(h[:ctime], 4) bin << put_int(h[:filelen], 8) bin << put_int(h[:flag], 1) bin << put_int(h[:propertynum], 1) h[:properties].each do |k, v| bin << put_string(k) bin << put_string(v) end end bin end end if RUBY_VERSION >= "1.9" then `mv '#{ARGV[0]}' '#{ARGV[0]}.back'` mbdb = Mbdb.new("#{ARGV[0]}.back", true) mbdb.reject!(/HomeDomain::Library\/Keyboard/) # Reset UserDictionary mbdb.to_text_file("#{ARGV[0]}.txt") mbdb.to_mbdb_file(ARGV[0]) else puts 'Needs Ruby version 1.9 or later' end
ããã¯ã¢ãããä¿è·ããã·ã§ã«ã¹ã¯ãªããï¼reset_keyboard.shï¼
- ä¸è¨Rubyã³ã¼ããmbdbãä¿®æ£ããåã«ãããã¯ã¢ãããã³ãã¼ãã¦ãå®å ¨ã«ä½æ¥ããç°å¢ãæ´ããã
#!/bin/sh current_dir=`dirname $0` target_dir="$1" reset_dir="${target_dir}-reset-user-dictionary" rm -fr "$reset_dir"; cp -r "$target_dir" "$reset_dir" display_name=`defaults read "${reset_dir}/Info.plist" "Display Name"` defaults write "${reset_dir}/Info.plist" "Display Name" -string "${display_name}-reset-user-dictionary" ruby "${current_dir}/reset_keyboard.rb" "${reset_dir}/Manifest.mbdb"
ããã¯ã¢ãããªã¹ããè¿ãã·ã§ã«ã¹ã¯ãªããï¼current_backup_list.shï¼
- iPhoneã®ããã¯ã¢ããã¯ã端æ«åºæã®UniqueDeviceIDã¨ããè±æ°åãç¾ åãããã©ã«ãã«åå¨ããã
- ãªã»ãããã端æ«ãæå®ããæãè±æ°åã®ç¾ åã§ã¯æ±ãã«ããã®ã§ã端æ«åãé¢é£ã¥ãããªã¹ããè¿ãã
#!/bin/sh backup_folders=`find "$HOME/Library/Application Support/MobileSync/Backup" -name Info.plist -exec dirname {} \;` IFS=$'\n' for f in $backup_folders do deviceID=`defaults read "$f/Manifest.plist" 'Lockdown'|grep UniqueDeviceID|awk '{print $3}'|tr -d ';'` folder_name=`basename "$f"` if [ "$deviceID" = "$folder_name" ]; then echo "`defaults read "$f/Info.plist" 'Display Name'` :: $folder_name" fi done
AppleScriptã¢ããªã±ã¼ã·ã§ã³ã«ããGUIï¼reset_iOS7_UserDictionary.appï¼
- 以ä¸ã®ã¹ã¯ãªããããAppleScriptã¢ããªã±ã¼ã·ã§ã³ã¨ãã¦ã¾ã¨ãã¦ã¿ãã
- iOS端æ«ãæå®ããã¨ãä¸è¨ã¹ã¯ãªããã飿ºãã¦ãã¦ã¼ã¶è¾æ¸ããªã»ããããããã¯ã¢ãããçæããã®ã ã
activate
set current_backup_list_sh to (path to resource "current_backup_list.sh")'s POSIX path
set reset_keyboard_sh to (path to resource "reset_keyboard.sh")'s POSIX path
set device_list to (do shell script current_backup_list_sh)'s paragraphs
set selected_item to choose from list device_list with prompt "ã¦ã¼ã¶è¾æ¸ããªã»ãããã端æ«ã鏿ãã¦ãã ããã" with title my name
if selected_item is false then error number -128 --ãã£ã³ã»ã«
set selected_folder to split(selected_item as text, " :: ")'s item 2
display notification "ã¦ã¼ã¶è¾æ¸ããªã»ããä¸ã§ã..."
delay 1
set mobilesync_backup to (((path to application support folder from user domain) as text) & "MobileSync:Backup:")'s POSIX path
do shell script (reset_keyboard_sh & space & quoted form of (mobilesync_backup & selected_folder)) -- & " >& /dev/null &"
display notification "ãªã»ãããå®äºãã¾ããã"
delay 1
on split(src_text, delimiter) set last_delimiter to AppleScript's text item delimiters
set AppleScript's text item delimiters to delimiter
set res to src_text's text items
set AppleScript's text item delimiters to last_delimiter
res
end split
ãã¦ã³ãã¼ãã¨ä½¿ãæ¹
ä¾ï¼MacBookã¨iPhoneã®ã¦ã¼ã¶è¾æ¸ããªã»ããããå ´å
- ãã¹ã¦ã®ç«¯æ«ï¼MacBookãiPhoneï¼ã§ãiCloudã®ãæ¸é¡ã¨ãã¼ã¿ãã®åæããªãã«ããã
iCloudã®ã¦ã¼ã¶è¾æ¸ã®ãªã»ãã
- Webãã©ã¦ã¶ã§iCloudã«ã¢ã¯ã»ã¹ãã¦ããæ¸é¡ã¨ãã¼ã¿ã®ãªã»ããããå®è¡ããã
MacBookã®ã¦ã¼ã¶è¾æ¸ã®ãªã»ãã
iPhoneã®ã¦ã¼ã¶è¾æ¸ã®ãªã»ãã
- iTunesãèµ·åãã¦ãä»ããããã¯ã¢ããããå®è¡ããã
- äºåã«ãåçãåç»ãiPhotoãªã©ã«åãè¾¼ãã§ãã«ã¡ã©ãã¼ã«ã空ã£ã½ã«ãã¦ããã¨ãããã¯ã¢ãããç´ æ©ãå®äºããã
- reset_iOS7_UserDictionary.appãå®è¡ããã
- ã¦ã¼ã¶è¾æ¸ã®è¨å®ããªã»ãããããããã¯ã¢ãããçæããã
- iTunesã§ããããã¯ã¢ããã復å ...ããå®è¡ããã
- ããã¯ã¢ãããªã¹ãããã端æ«å-reset-user-dictionaryãã鏿ãã¦ã復å ãã¿ã³ãæ¼ãã
- 復å ãæåããã°ãiPhoneã®ã¦ã¼ã¶è¾æ¸ã¯ãªã»ããããã¦ããã¯ãã
- ãã¹ã¦ã®ç«¯æ«ï¼MacBookãiPhoneï¼ã§ãiCloudã®ãæ¸é¡ã¨ãã¼ã¿ãã®åæããªã³ã«æ»ãã
å¾ ã¤ãã¨æ«ããã¦ã¼ã¶è¾æ¸ã®åæãå§ã¾ããããããªãã