2009-12-16 4 views
5

Tôi có một ứng dụng có thể được khởi chạy với người dùng hiện tại hoặc với quyền root.OS X: Cài đặt khi chạy Tên ứng dụng khi nó xuất hiện trong Thanh Dock và Menu

Thực tế, có khả năng ứng dụng chạy hai lần cùng một lúc - một lần dưới người dùng hiện tại và một lần là gốc.

Tôi muốn thông báo cho người dùng khi ứng dụng đang chạy dưới gốc. Hiện tại, tôi cho thấy điều này trong tiêu đề cửa sổ của nó, nhưng tôi muốn thay đổi tên của ứng dụng để nó đọc "Appname (Root)" khi thích hợp. Bằng cách đó, tên sẽ xuất hiện cả trong thanh trình đơn và trong Dock với thông tin "root" này, và nó sẽ cho phép người dùng biết được hai ứng dụng trong Dock là phiên bản gốc.

Có ai đó biết tên ứng dụng có thể được thay đổi bằng mã, tức là bản thân ứng dụng hay bằng trình khởi chạy không?

Nếu không, tùy chọn duy nhất của tôi có vẻ là thêm huy hiệu vào biểu tượng Dock có nội dung "gốc", nhưng đó là phương sách cuối cùng của tôi, vì nó sẽ không hoạt động cho thanh menu cũng như các công cụ khác hiển thị ứng dụng tên (tức là các trình khởi chạy ứng dụng khác như DragThing).

Trả lời

5
... có ít nhất năm tên ứng dụng nổi xung quanh, ít nhất là trong khái niệm: (1) tên tệp mà Finder thấy, trong trường hợp gói ứng dụng là tên gói (gói); (2) tên của tập tin thực thi bên trong gói, (3) tên dài được sử dụng ở nhiều nơi chỉ cho mục đích hiển thị; (4) tên viết tắt được sử dụng làm tiêu đề menu ứng dụng và ở một vài nơi khác có tên dài sẽ không phù hợp với mục đích hiển thị; và (5) tên quy trình của một ứng dụng đang chạy. Chúng không phải lúc nào cũng giống nhau, đặc biệt là trong các sản phẩm của Microsoft và Adobe.

- Bill Cheeseman

Từ những gì tôi có thể nói, tên trong vành móng ngựa là tên của gói ứng dụng (sans ".app") trên hệ thống tập tin.

Giá trị dưới khóa CFBundleName trong info.plist là nội dung hiển thị trong thanh thực đơn. Theo tôi biết, việc thay đổi những thứ này trong thời gian chạy sẽ không hoạt động ... nhưng những gì bạn có thể làm là có hai phiên bản ứng dụng của bạn, một phiên bản gốc và không phải root, bên trong ứng dụng của bạn .app. bó. Khi ứng dụng hướng về người dùng được khởi chạy, ứng dụng sẽ kiểm tra xem ứng dụng có đang chạy dưới dạng root hay không và khởi chạy bản sao thích hợp của ứng dụng thực, trong đó có CFBundleName và tên tệp bạn muốn.

Tôi ước mình biết một giải pháp thanh lịch hơn.

+0

Câu trả lời được giáo dục tốt, cảm ơn :) Đề xuất của bạn với hai bản sao cho tôi ý tưởng: Tôi có thể tạo một số liên kết tượng trưng cho "bản sao" thay thế bên trong ứng dụng của tôi. Tôi sẽ thử điều đó. –

+1

Xin chào! Tôi đã tạo một thư mục có tên "Appname (Root) .app" bên trong thư mục chính của ứng dụng, tạo một thư mục "Contents" trong đó, tạo các liên kết tới tất cả các mục Contents của ứng dụng và cuối cùng đặt Info.plist đã sửa đổi trong đó Tên. –

0

Nhãn đó xuất phát từ Info.plist của bạn và tôi không tin rằng nhãn đó đã được tư vấn lại sau khi nó được khởi chạy. Nếu bạn muốn có một ứng dụng cha mẹ không làm gì ngoài việc khởi chạy ứng dụng thực (có thể từ bên trong gói riêng của nó) sau khi đưa vào Info.plist của nó, thì điều đó có thể cho bạn hiệu ứng mà bạn đang hy vọng. Bạn sẽ nhận được hai biểu tượng nảy lúc khởi động, mặc dù.

+0

Đúng vậy, đó là những gì tôi đã tìm. Thay đổi Info.plist không phải là một lựa chọn. –

0

Các ứng dụng OS X thường không chạy với nhiều phiên bản. Hãy xem bất kỳ ứng dụng nào do Apple phát triển chẳng hạn. Nó sẽ phổ biến hơn để cho phép nhiều tài liệu/cửa sổ, trong trường hợp này mỗi cửa sổ có thể là một cửa sổ gốc hoặc không phải root.

Cách phổ biến nhất để cho phép xác thực gốc là có biểu tượng ổ khóa có thể được bấm để chuyển sang chế độ gốc bằng lời nhắc mật khẩu, điều này có thể thấy trong nhiều bảng Tùy chọn hệ thống.

+1

Tobias, tôi không thấy những gì bạn đang nhận được. Tôi biết cách khởi chạy ứng dụng ở chế độ gốc và xác thực cho ứng dụng (I ', sử dụng "AuthorizationExecuteWithPrivileges"), đó không phải là câu hỏi của tôi. Sự cố là ứng dụng thường được khởi chạy ở chế độ không phải root và người dùng có thể yêu cầu khởi chạy ứng dụng ở chế độ gốc (thông qua AuthorizationExecuteWithPrivileges). Vì lý do thiết kế, tôi không thể dễ dàng thay đổi, người dùng có thể kết thúc với hai phiên bản đang chạy của ứng dụng và tôi muốn nói cho anh ta biết đó là ứng dụng nào. –