หมายเหตุ: คำตอบยังอยู่ระหว่างการก่อสร้าง ...
อีกหนึ่งส่วนที่จะเขียนโดยมีรายละเอียดสคริปต์ที่จะซิงค์สถานะการทำงานของแอปพลิเคชัน ฉันต้องเขียนสคริปต์เหล่านี้ก่อน
วัตถุประสงค์
แฉ่งประดิษฐ์หมายถึงสองแม็คเพื่อบันทึกและแบ่งปันข้อมูลเกี่ยวกับสภาพแวดล้อมของผู้ใช้รวมถึงการประยุกต์ใช้รัฐ / คุณสมบัติเอกสารการโหลดและการใช้งานที่ทำงานอย่างแข็งขัน
คำขอเริ่มต้นของคุณคือการย้ายจากเครื่องหนึ่งไปยังอีกเครื่องหนึ่งอย่างราบรื่นและสร้างสถานะของแอปพลิเคชั่นเปิดที่ฉันมีในโปรแกรมก่อนหน้าด้วยคำสั่ง เนื่องจากคุณได้ผ่อนคลายความคาดหวังของคุณเล็กน้อยและชี้แจงว่าแอพพลิเคชั่น "hot-reloading" ไม่ได้รับการร้องขอและข้อ จำกัด เล็ก ๆ น้อย ๆ เช่นขนาดและตำแหน่งของหน้าต่างไม่ใช่เรื่องที่น่ากังวล
ระเบียบวิธีเชิงมโนทัศน์
1. สองสคริปต์ + ไฟล์ข้อมูลที่ใช้ร่วมกัน
แนวคิดแรกของฉันคือการมีสำเนาของสคริปต์ (อาจเป็น AppleScript) ในแต่ละเครื่องที่จะมีตัวจัดการที่รับผิดชอบในการรับข้อมูลเกี่ยวกับสภาพแวดล้อมของแอปพลิเคชันและจัดเก็บไว้ในไฟล์ที่แชร์ซึ่งเครื่องทั้งสองจะสามารถเข้าถึงได้ (เช่น ผ่านDropbox , iCloud , ... ) สคริปต์จะมีตัวจัดการแยกต่างหากที่จะดึงเนื้อหาของไฟล์ที่แชร์นี้และใช้การตั้งค่ากับสภาพแวดล้อมในท้องถิ่น สิ่งนี้ต้องการให้ผู้ใช้เรียกใช้สคริปต์เมื่อมาถึงเครื่องเพื่อใช้การตั้งค่า และอีกครั้งก่อนออกจากเครื่องเพื่ออัปเดตไฟล์ข้อมูลที่ใช้ร่วมกันด้วยการตั้งค่าใหม่
2. การ.savedState
ประสาน
~/Library/Preferences/ByHost/com.apple.loginwindow.*
ความคิดที่สองของฉันได้แรงบันดาลใจจากความคิดของคนอื่นของซิงค์ไฟล์อยู่ที่ แม้ว่าการทำเช่นนั้นจะไม่เป็นประโยชน์ แต่ก็ทำให้เกิดคำถามว่าการซิงโครไนซ์.savedState
ไฟล์ที่พบในโฟลเดอร์~/Library/Saved Application State
จะเป็นวิธีแก้ปัญหาหรือไม่
เป็นที่ยอมรับว่าฉันไม่สามารถอ้างสิทธิ์ได้ว่าจะใช้ประโยชน์จากความพยายามในการซิงค์ไฟล์เหล่านี้ในสองระบบที่แตกต่างกันอย่างไร นั่นไม่ได้หมายความว่าจะมีสิ่งเลวร้ายเกิดขึ้น แต่เป็นดินแดนที่ไม่รู้จักดังนั้นจึงมีโอกาสเกิดผลลัพธ์ที่ไม่พึงประสงค์ อย่างไรก็ตามความรู้สึกของฉันคือว่ามันจะปลอดภัยและอาจไม่มีพิษภัยเลยทีเดียวถ้าหากมีสิ่งใดที่ผิดเพี้ยนไปจาก.savedState
ไฟล์ที่ไม่ดีการแก้ปัญหานั้นค่อนข้างจะลบ.savedState
ไฟล์และอนุญาตให้แอปพลิเคชันนั้น สร้างใหม่
ฉันสงสัยว่าจะต้องใช้ทั้งสองวิธีร่วมกัน
ซิงค์
ซิงค์~/
โฟลเดอร์ผ่าน Dropbox
การซิงค์โฟลเดอร์หลักอาจให้วิธีการในการทำให้เอกสารพร้อมใช้งานในแต่ละเครื่องเท่านั้น แต่อาจไม่อนุญาตให้คุณซิงค์~/Library
โฟลเดอร์หากไม่สามารถเปลี่ยนตำแหน่งของตำแหน่งได้ นอกจากนี้โฟลเดอร์นี้มีขนาด 26GB ในระบบของฉันดังนั้นจึงต้องมีการสมัครสมาชิกเพื่อใช้พื้นที่เก็บข้อมูลบนคลาวด์เพิ่มเติม
ท้ายที่สุดถ้าซิงค์โฟลเดอร์ที่บ้านจะถูก จำกัดDownloads
, Documents
, Music
และMovies
มันเป็นไปไม่มากของผลประโยชน์มากกว่าการมีDocuments
และDesktop
โฟลเดอร์ที่ซิงค์ผ่านiCloud
อย่างไรก็ตามการซิงค์เอกสารเป็นความคิดที่ดีเนื่องจากเป็นสิ่งสำคัญที่จะต้องเข้าถึงไฟล์เดียวกันในคอมพิวเตอร์ทั้งสองเครื่องและเพื่อให้การเปลี่ยนแปลงไฟล์หนึ่งมีผลกับอีกเครื่องหนึ่ง iCloudในขณะที่ค่อนข้างช้าเหมาะสำหรับงานนี้
กำลังซิงค์~/Library
โฟลเดอร์
~/Library
โฟลเดอร์หรืออย่างน้อยโฟลเดอร์ย่อยของมันที่เฉพาะเจาะจงจะเป็นเป้าหมายสำคัญหากใคร่ครวญโดยใช้.savedState
ไฟล์ไปยังแผนที่รัฐแอพลิเคชันจากระบบหนึ่งไปยังอีก โซลูชันการจัดเก็บข้อมูลบนคลาวด์ในบ้านเหมาะสำหรับงานนี้เนื่องจากไม่เก็บค่าธรรมเนียมการสมัคร ข้อมูลสำคัญของคุณจะปลอดภัยอยู่ในความครอบครองของคุณและไม่ได้เป็นเจ้าของDropboxหรือแอปเปิ้ล ; และจะไม่มีการควบคุมความเร็วที่นอกเหนือจากที่ ISP ของคุณกำหนดไว้หากทำการซิงค์ผ่านอินเทอร์เน็ต
ฉันใช้Resilio Syncแล้วซึ่งเป็นบริการฟรีสำหรับการใช้งานส่วนบุคคลและใช้การถ่ายโอนแบบ peer-to-peer เพื่อให้โฟลเดอร์ที่เลือกซิงค์กันระหว่างเครื่องหรืออุปกรณ์ใด ๆ ที่คุณติดตั้งแอปพลิเคชัน อาจเป็นกรณีง่าย ๆ ในการเลือก~/Library
โฟลเดอร์หรือ~/Library/Saved Application State
โฟลเดอร์ที่จะตรวจสอบและซิงค์ในเวลาจริง โฟลเดอร์สามารถคงอยู่ได้และถ้าคุณเลือกชำระเงินสำหรับคุณสมบัติเพิ่มเติม (ชำระครั้งเดียว) คุณสามารถเลือกซิงค์ไฟล์แต่ละไฟล์ภายในโฟลเดอร์และเข้ารหัสเพื่อความปลอดภัยของข้อมูล ฉันแนะนำแอปพลิเคชันนี้จริง ๆ และดูเหมือนว่าเหมาะสำหรับสถานการณ์เฉพาะนี้
การเขียนสคริปต์
หากการซิงโครไนซ์.savedState
ไฟล์สำเร็จสิ่งที่อาจจำเป็นต้องมีคือสคริปต์เพื่อเปิด (หรือเปิดใหม่) แอปพลิเคชันที่ทำงานบนเครื่องอื่น หวังว่าการเปิดอีกครั้งจะทำให้แอปพลิเคชันอ่าน.savedState
ไฟล์ที่อัปเดตแล้วและทำซ้ำสถานะที่อยู่ในระบบอื่น ฉันคิดว่านี่จะประสบความสำเร็จบางส่วน แต่อาจจะไม่ทั้งหมด
การดึงรายการแอปพลิเคชันที่ทำงานอยู่
นี่เป็นเรื่องที่ยากกว่าฟังดูเพราะมีหลายวิธีในการทดสอบว่าแอปพลิเคชันทำงานอยู่หรือไม่และไม่มีการทดสอบใดที่สมบูรณ์แบบ มีแอปพลิเคชันในเบื้องหน้าที่มองเห็นได้ด้วย windows; มีแอปพลิเคชั่นแถบเมนูบางตัวไม่มีวินโดว์ทำงานเป็นกระบวนการพื้นหลัง และอาจมีแอปพลิเคชั่นที่ซ่อนอยู่ย่อเล็กสุดใน Dock โดยไม่มีหน้าต่างที่มองเห็นได้
หลังจากทดลองด้วยวิธีการต่าง ๆ ใน AppleScript แล้วโค้ดบรรทัดนี้ดูเหมือนจะสร้างรายการแอพพลิเคชั่นที่ทำงานได้ดีและครบถ้วนสมบูรณ์รวมถึงแอปพลิเคชันแถบเมนู:
tell application "System Events" to set OpenApps to the ¬
name of every application process whose ¬
class of its menu bar contains menu bar and ¬
POSIX path of the application file does not start with "/System" and ¬
POSIX path of the application file does not start with "/Library"
ใช้เวลาสองสามวินาทีในการส่งคืนผลลัพธ์ แต่ฉันไม่คิดว่าความเร็วจะมีความสำคัญมากเกินไปหากสคริปต์ถูกนำไปใช้อย่างสมเหตุสมผล
วิธี Bash ในการรับรายการแอปพลิเคชั่นที่รันอยู่คือ:
IFS=$'\r\n'; basename $( \
egrep -i -e '^/Applications/.*\.app/Contents/MacOS/[^/]+$' \
<<<"$(ps -U 501 -o 'comm')" ) | sort -u
มันรวดเร็ว (ทันที) แต่พลาดสองแถบเมนูและแอปพลิเคชั่นพื้นหลัง
ฉันคิดว่าวิธีการใดวิธีหนึ่งในท้ายที่สุดจะใช้ได้กับสิ่งที่ต้องการเนื่องจากแอปพลิเคชันที่สำคัญที่สุดในการจับภาพคือแอปพลิเคชันที่คุณโต้ตอบด้วยเบื้องหน้าและวิธีการเหล่านั้นส่วนใหญ่
จัดเก็บข้อมูลในไฟล์การตั้งค่าที่ใช้ร่วมกัน
การเขียนการตั้งค่าที่ต้องบันทึกสามารถทำได้กับ.plist
ไฟล์ซึ่งเก็บคู่ของคีย์ / ค่าของข้อมูลพร้อมกับชนิดข้อมูล สิ่งนี้อนุญาตให้บันทึกและเรียกคืนค่าใด ๆ ด้วยชื่อ พวกเขายังค่อนข้างเพียงแค่การอ่านและแก้ไขโปรแกรมโดยใช้ AppleScript plutil
หรืออรรถประโยชน์บรรทัดคำสั่ง
สมมติว่าไฟล์การตั้งค่าที่ใช้ร่วมกันจะได้รับการบันทึกใน~/Example/savedState.plist
กรณีที่~/Example/
มีโฟลเดอร์แชร์บางประเภท (เช่นโฟลเดอร์ที่เก็บข้อมูลบนคลาวด์) ซึ่งคอมพิวเตอร์ทั้งสองเครื่องสามารถเข้าถึงได้
การใช้ AppleScript นี่เป็นวิธีที่คนหนึ่งอาจบันทึกรายการแอปพลิเคชันที่เปิดอยู่ในปัจจุบัน:
property plist : "~/Example/SavedState.plist"
tell application "System Events"
if not (the file plist exists) then make new property list file ¬
with properties {name:plist}
set plistf to the property list file named plist
tell plistf to make new property list item with properties ¬
{name:"OpenApps", kind:list, value:OpenApps}
end tell
โดยที่ตัวแปรOpenApps
นั้นนำมาจากข้อมูลโค้ด AppleScript ด้านบน อย่างชาญฉลาดmake new property list
คำสั่งจะเขียนทับรายการคีย์ / ค่าที่มีอยู่ที่มีชื่ออยู่"OpenApps"
แล้วดังนั้นมันจะไม่ซ้ำกัน
ต่อไปเราต้องการวิธีออกจากแอปพลิเคชันบนระบบ:
to kill(A as list, X as list)
local A, X
if A = {} then return
script jury
property A0 : item 1 of A
property An : rest of A
property OK : A0 is not in X
end script
tell the jury
ignoring application responses
if its OK then quit the application named (its A0)
kill(its An, X)
end ignoring
end tell
end kill
นี่คือตัวจัดการแบบเรียกซ้ำที่ส่งผ่านรายการแอปพลิเคชันเพื่อออกจาก (พารามิเตอร์A
) และรายการแอปพลิเคชันที่ต้องยกเว้น (พารามิเตอร์X
) จากนั้นจะผ่านรายการทีละรายการและตรวจสอบแอปพลิเคชันไม่ใช่รายการX
ก่อนที่จะออกจากรายการและย้ายไปยังส่วนที่เหลือของรายการ
เปิดเอกสารอีกครั้ง
ด้วยการใช้การใช้งาน.savedState
ไฟล์ที่ซิงโครไนซ์หวังว่าเมื่อแอปพลิเคชันในระบบหนึ่งเริ่มต้นใหม่ (พูดโดยการปิดและเปิดอีกครั้ง) ระบบจะเปิดเอกสารที่เปิดอยู่อีกครั้ง
อย่างไรก็ตามมันอาจเป็นการเก็บรายชื่อของเอกสารที่เราสามารถตรวจจับได้
[หมายเหตุสำหรับฉันที่จะรวมเข้าไปในคำตอบ]
- ฉันสังเกตเห็นว่า
.savedState
ไฟล์บางไฟล์ถูกจัดเก็บใน~/Library/Saved Application State
นามแฝง (ลิงก์สัญลักษณ์) แทนที่จะเป็นไฟล์จริง เหล่านี้มักจะเชื่อมโยงไปยัง~/Library/Containers/%bundle-id%/Data/Library/Saved Application State/%file%
สถานที่ที่%bundle-id%
เป็นตัวอย่างเช่น, com.apple.Preview
และของที่สอดคล้องกันคือ%file%
com.apple.Preview.savedState
ซึ่งหมายความว่า~/Library/Containers
จะต้องมีการซิงโครไนซ์ระหว่างเครื่องสองเครื่องเช่นกัน
.savedState
ไฟล์จะถูกลบเมื่อใดก็ตามที่แอปพลิเคชันออกจากระบบอย่างหมดจด ดังนั้นโปรดทราบว่าการปิดแอปพลิเคชันในระบบหนึ่งจะลบไฟล์ข้อมูลเหล่านั้นจากนั้นอาจซิงโครไนซ์การลบเหล่านี้กับเครื่องอื่น