2011-08-15 41 views
9

Tôi có ứng dụng Cocoa thường chạy ở chế độ 64 bit đầy đủ trên bất kỳ máy Mac nào hỗ trợ kiến ​​trúc này.Bắt buộc ứng dụng Cocoa bắt đầu ở chế độ 32 bit theo chương trình

Bây giờ tôi có API bên ngoài chỉ khả dụng dưới dạng trình cắm 32 bit để được tải vào chương trình chính. API này dành cho thiết bị đầu vào của bên thứ ba mà chỉ một phần nhỏ người dùng của tôi sẽ mua, nhưng điều đó quan trọng đối với tỷ lệ phần trăm nhỏ đó.

Vấn đề của tôi là chương trình chỉ có thể sử dụng API này nếu được thực hiện ở chế độ 32 bit. Điều đơn giản nhất là:

Trường hợp 1: yêu cầu người dùng khởi động chương trình ở chế độ 32 bit bằng cách thay đổi thông tin của chương trình qua hộp thoại Nhận thông tin của người tìm.

này được thực hiện một cách dễ dàng, nhưng hầu như không thanh lịch ..

Kịch bản 2: luôn luôn chạy ở chế độ 32-bit như vậy tránh được các vấn đề

Hầu như những gì tôi muốn làm một trong hai .. xử phạt 98 % người dùng vì lợi ích của một tính năng kỳ lạ.

Kịch bản 3: tự động thay đổi ra mắt của ứng dụng thuộc tính để nó bắt đầu ở chế độ 32-bit lần sau nó được đưa ra và mỗi lần sau đó

hoặc

Kịch bản 4: tại thời điểm ra mắt, thiết lập kiến ​​trúc nào đang được sử dụng, sau đó khởi chạy lại ở chế độ 32 bit nếu cần

Kịch bản 3 & 4 có vấn đề rất ít tài liệu về cách thực hiện điều này và m làm tôi gặp rắc rối với hướng dẫn của Mac App Store.

Cho đến nay, tôi đã thành lập:

  • rằng việc sử dụng công cụ "vòm" dòng lệnh sẽ cho phép tôi khởi động lại thực thi của tôi trong chế độ 32-bit
  • Finder kịch bản sẽ không cho phép tôi thay đổi các "Launch trong 32-bit mode" cờ
  • cờ được quản lý bởi Dịch vụ Launch API (http://blog.timac.org/?p=490)
  • NHƯNG tôi đã không tìm thấy bất kỳ giao diện để lập trình thay đổi cờ trong Dịch vụ Launch API

Cho đến nay tôi chỉ có thể thấy các tùy chọn, không ai trong số đó dường như đặc biệt lớn:

  1. relaunch các ứng dụng sử dụng NSTask và "vòm" dòng lệnh công cụ
  2. ghi trực tiếp vào com.apple. LaunchServices.plist
  3. cô lập các plug-in 32-bit vào riêng 32-bit quá trình duy nhất của nó và sử dụng IPC

giải pháp 1 có thể làm cho tôi vào rắc rối với việc nộp MAS. Giải pháp 2 gần như chắc chắn sẽ làm như vậy ở một số giai đoạn ..giải pháp duy nhất 3 sẽ hoàn hảo từ góc nhìn của người dùng nhưng thêm một số lượng lớn sự phức tạp để trả tiền tối thiểu.

Bất kỳ lời khuyên nào về cách thực hiện điều này "rõ ràng" và với nỗ lực hợp lý sẽ được đánh giá cao!

+5

Tại sao nó quan trọng nếu ứng dụng của bạn là 32-bit chỉ - nó cần một lượng lớn bộ nhớ (> 2 GB)? –

+1

Bạn có đang chạy luôn ở chế độ 32 bit có nhiều hình phạt không? – hamstergene

+0

Giải pháp 3 nghe hay nhất. – spudwaffle

Trả lời

3

Tùy chọn 5: Tạo một tệp thực thi khác chạy luôn dưới dạng 32 bit và mục đích duy nhất là điều khiển thành phần 32 bit được đề cập. Khởi chạy tệp thực thi đó từ ứng dụng chính của bạn và sử dụng một số loại trình xử lý độc lập io để giao tiếp với nhau, có thể là các ổ cắm.

1

Bạn có thể lập trình thay đổi chế độ nào ứng dụng của bạn sẽ khởi động trong bằng cách thay đổi các tập tin plist nằm ở đây:

~/Library/Preferences/com.apple.LaunchServices.plist

Bạn cần thay đổi chìa khóa nằm ở /LSArchitecturesForX86_64/[your.app.idenitfier]/Item 1/

  • đặt nó đến x86_64 sẽ chạy trong 64 bit
  • đặt thành i386 sẽ r un in 32 bit

Bạn có thể chỉnh sửa điều này bằng lệnh được xây dựng trong defaults hoặc lệnh được xây dựng trong plistbuddy. Tôi chưa bao giờ có nhiều may mắn nhận được một chìa khóa có thể xuống cấp để thay đổi với defaults, nếu tôi tìm ra cú pháp plistbuddy tôi sẽ đăng nó.

Khi bạn có tất cả, bạn có thể tạo một tập lệnh đơn giản để chạy khi đăng nhập để kiểm tra sự hiện diện của thiết bị đầu vào của bạn (hoặc thuộc tính khác, bộ phận vv) và đặt chế độ khởi chạy tương ứng.

2

tôi đã tìm ra cách để thiết lập khóa sử dụng giá trị mặc định ...

Cho một biến bash shell:

alias="<0000 .... 1234>" #(there is a lot more hex data than that...) 

Và nhận dạng theo gói:

bundle="com.mycompany.myprogram" 

Bạn có thể đặt khóa như vậy:

defaults write com.apple.LaunchServices LSArchitecturesForX86_64 -dict-add $bundle "($alias, i386)" 

Chúc may mắn tạo bí danh nhị phân. Tôi chỉ ăn cắp _CFURLAliasData từ com.plist.dock vì chương trình mà tôi đang cố gắng thiết lập để khởi động 32bit có một biểu tượng được cài đặt vào dock. Cách khác để tạo bí danh, nếu bạn có thể nắm được nó, có thể là sử dụng chương trình dockit.c. Tôi đã không thể tìm thấy chương trình đó.

+0

Biến bí danh có phải là phím 0 bên dưới mã định danh gói nếu tôi tìm kiếm trong plisteditor pro không? Tôi nghĩ nó có thể. Dù sao thì tôi nghĩ có một số loại bộ nhớ cache liên quan ở đây. Nếu tôi sử dụng cách tiếp cận Bash ở trên hộp thoại thông tin hộp thoại đánh dấu vào hộp không cho thấy rằng nó đã thay đổi KHÔNG CÒN tôi buộc bỏ Finder. Nó phải kích hoạt một cái gì đó mà xây dựng lại đó là bộ nhớ đệm nội bộ. Nhìn vào đây có vẻ như gợi ý rằng http://www.thexlab.com/faqs/resetlaunchservices.html –

+0

Ngay cả khi bắt buộc tôi đang tìm ứng dụng đặc biệt chỉ phản hồi các hộp thoại thông tin thủ công. Trong các từ khác ngay cả khi tôi chạy tập lệnh bash để nói 32 bit, và thấy nó thay đổi trong hộp chọn giao diện người dùng, ứng dụng của tôi vẫn khởi chạy trong 64bit. Tôi sẽ cố gắng tạo 2 bản sao của gói .app ngay bây giờ. –

0

Kịch bản của tôi rất giống nhau. Tôi sử dụng Ableton Live và Lý do là một nô lệ được viết lại. Nếu tôi khởi động Ableton trong 32bit, tôi cần Lý do ở chế độ 32 bit. Đây là những gì tôi đã làm.

  1. Tạo bản sao của ứng dụng bạn muốn có thể thay đổi chế độ nhanh chóng.
  2. Gọi bản sao 32.app (trong trường hợp của tôi là Reason32.ứng dụng)
  3. nội dung Hiện gói ứng dụng mới này và xóa thư mục Contents (Có một trong đó chứa mọi thứ)
  4. Bây giờ đi vào bản gốc, tạo ra một liên kết tượng trưng of Contents
  5. Sao chép liên kết tượng trưng vào gói appname32.app (trong đó một số cũ đã xóa được sử dụng để cư trú)
  6. Sử dụng các đặc tính công cụ tìm và đánh dấu chế độ 32 bit cho bản sao mới của bạn.

Bây giờ bạn có 2 ứng dụng bạn có thể dễ dàng khởi chạy/tập lệnh.

Các vấn đề liên quan