Tôi gặp sự cố nếu tôi gọi một ứng dụng hai lần trở lên nhưng chỉ chạy một phiên bản (đó là điều cần thiết).
Đầu tiên một số thông tin cơ bản (có thể cần thiết):
- Sử dụng MAC OS X El Capitan (10.11.6)
- Tôi có một ứng dụng được tạo bằng Node.js, Electron và được xây dựng bằng "npm build -m" (hãy gọi nó là APP.app)
- Tôi đã cài đặt ứng dụng App.app vào thư mục chương trình bằng cách mở tệp dmg đã tạo và di chuyển nó vào thư mục chương trình
- Sau đó, tôi khởi chạy ứng dụng App.app bằng cách nhấp vào biểu tượng App.app trong thư mục Chương trình
- Ứng dụng khởi động với một cửa sổ hiển thị và cũng chạy quy trình nền ẩn
- Nếu tôi đóng cửa sổ hiển thị, App.app-Icon vẫn ở trong dock (điều này không sao vì quá trình nền vẫn đang chạy)
- Bây giờ (đây là điểm khác biệt với việc xây dựng và chạy trong Windows), nếu tôi nhấp lại vào Biểu tượng App.app trong thư mục Chương trình, tôi chỉ tập trung vào ứng dụng đang chạy chứ không phải cửa sổ đang mở và đóng ứng dụng cũ (tôi có thể thấy nút chuyển đổi/kích hoạt tiêu điểm bằng tên menu chuyển đổi bên cạnh logo Apple ở đầu màn hình, nó thay đổi thành "Ứng dụng")
Việc tắt phiên bản đang chạy trước đó được xác định trong mã Electron trong phương thức init như sau:
var ShouldQuit = app.makeSingleInstance(function (commandLine, WorkingDirectory) {
console.info('bắt đầu phiên bản mới');
initInternal(dòng lệnh);
// Ai đó đã cố chạy phiên bản thứ hai, chúng ta nên tập trung vào cửa sổ của mình.
var windows = options.closeWindowsOnRestart Browser.getAllWindows() : appWindows.slice();
windows.forEach(hàm (val, chỉ mục) {
val.close();
});
sẵn sàngCallback();
});
Vì vậy, tôi đã làm một số bài tập về nhà và có thể đi đến kết luận sau:
- Nhấp chuột vào biểu tượng App.app của tôi sẽ trông giống như
mở/Ứng dụng/App.app
- Bằng cách này, nếu tôi gọi lại, tôi sẽ gặp vấn đề tương tự như mô tả ở trên (nó chỉ tập trung vào cửa sổ đã mở)
- Bây giờ đến phần thú vị. Nếu tôi gọi trực tiếp bằng
/Applications/App.app/content/MacOS/App.app
Mở ứng dụng và phiên bản ứng dụng cũ sẽ bị đóng và ứng dụng App.app mới sẽ được khởi động
- Tôi đọc qua
mở
-manual và thấy rằng nếu tôi sử dụng -N
-flag, ứng dụng cũng sẽ khởi chạy thành công phiên bản mới. (Mở /Applications/App.app -n
)
Tôi muốn biết tại sao? Bạn có manh mối nào không? Sự khác biệt giữa mở ứng dụng và gọi trực tiếp là gì?
Tôi đề xuất rằng info.pklist trong gói App.app làm cho các cuộc gọi mở khác với các cuộc gọi trực tiếp đến App.app.
BTW: Thật không may, tôi đã thử thêm khối thử bắt để gỡ lỗi, nhưng mở
Không có đầu ra nào được cung cấp cho thiết bị đầu cuối, nó chỉ mở cuộc gọi và gọi trực tiếp không gây ra lỗi, mọi thứ đều hoạt động tốt. Dù sao, tôi nghĩ đây là sự cố MAC OS X hơn là sự cố App.app.
Mong ai đó gặp vấn đề tương tự và cho tôi giải pháp
Xin vui lòng hỏi thêm chi tiết nếu cần thiết.
Phiên bản ngắn:
mở
Khởi chạy ứng dụng bằng LaunchService (và có thể thêm tham số khởi chạy trong info.plist)
- Và gọi trực tiếp ứng dụng chỉ cần khởi động ứng dụng mà không có bất kỳ tùy chọn khởi động nào khác
*Phiên bản dài*
Tôi đã đọc qua hướng dẫn mở đầu(người đàn ông mở
;nguồn:https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/open.1.html) và bạn có thể thấy rằng nếu bạn nhấp vào một mục, "Ứng dụng mặc định được xác định thông qua LaunchServices sẽ được sử dụng để mở tệp đã chỉ định."
Vì vậy, tôi đã đọc qua tài liệu LaunchService và đi đến kết luận sau:
"Mở các mục bằng tham chiếu hệ thống tệp [...] cách mặc định: Nếu mục được chỉ định là một ứng dụng: [...] Nếu ứng dụng đang chạy, nó sẽ được kích hoạt (được đưa ra phía trước màn hình) và được gửi một sự kiện 'rapp' ("mở lại ứng dụng") của Apple."
(nguồn:https://developer.apple.com/library/content/documentation/Carbon/Conceptual/LaunchServicesConcepts/LSCTasks/LSCTasks.html#//apple_ref/doc/uid/TP30000999-CH203-TP9)
Điều này phản ánh chính xác những gì tôi quan sát được và nếu tôi nhấp vào biểu tượng lần thứ hai, ứng dụng sẽ được tập trung/kích hoạt.
Do đó, tôi cần có khả năng yêu cầu ứng dụng mở một phiên bản mới (oapp-event) thay vì kích hoạt một ứng dụng đã mở (rapp-event)
Đọc thêm dẫn tôi đến các thông tin sau:
"Tùy chọn khởi chạy Khi mở một ứng dụng (dù là mở một ứng dụng hay mở một hoặc nhiều tài liệu hoặc URL), bạn có thể chỉ định các tùy chọn khởi chạy khác nhau để kiểm soát cách thức khởi chạy hoặc kích hoạt ứng dụng đó. Chúng có thể bao gồm: […] để khởi chạy một phiên bản mới của ứng dụng, ngay cả khi một phiên bản khác đang chạy"
(nguồn:https://developer.apple.com/library/content/documentation/Carbon/Conceptual/LaunchServicesConcepts/LSCConcepts/LSCConcepts.html#//apple_ref/doc/uid/TP30000999-CH202-BABBHID)
Vì vậy, tôi chỉ cần thêm "Tùy chọn khởi chạy" để xác định rằng nên tạo một phiên bản mới thay vì kích hoạt phiên bản hiện có. Nhưng nó không viết các tùy chọn khởi động của nó là gì và chúng sẽ được áp dụng như thế nào cho ứng dụng (tôi đề nghị nó thuộc về tệp info.plist).
Vì vậy, ít nhất đó là câu trả lời cho câu hỏi ban đầu của tôi, vì vậy tôi đăng nó ở đây.
open - Khởi chạy ứng dụng bằng Launch-Service (và các tham số tùy chọn được xác định trong info.plist) trong khi gọi trực tiếp ứng dụng, chỉ cần khởi chạy ứng dụng mà không có bất kỳ tùy chọn khởi chạy nào khác
Tôi là một lập trình viên xuất sắc, rất giỏi!