2009-09-10 28 views
8

Bir uygulamayı (Clarke) 10.6 uyumluluk sağlamak için yükseltmeye çalışıyorum.Yeni bir API mevcut olduğunda, geriye dönük uyumlu bir OS X uygulaması oluşturma?

Planım, kullanımda olan OSX sürümüne bağlı olarak iki farklı kod yolu kullanmaktır.

10.5'te, herhangi bir belirli Kakao API'sine bağımlı olmayan tamamen özel koddan oluşan bir denetleyici kullanacaktır. 10.6'da yeni CoreLocation API'sini, aynı soyut sınıfa dayanan, aynı arayüzde saran başka bir kontrolör kullanacaktır. Çalışma zamanında, uygulama işletim sistemi sürümünü algılayarak kontrolörler arasında geçiş yapar.

Bu 10.6 SDK için inşa 10.6 üzerinde çalışıyor, ancak aynı yapı ile 10.5 üzerinde patlarsa: Ben 10.5 SDK için derlerseniz

10/09/2009 18:30:50 [0x0-0x12f12f].uk.co.tomtaylor.Clarke[4575] dyld: unknown required load command 0x80000022 
10/09/2009 18:30:51 com.apple.launchd[403] ([0x0-0x12f12f].uk.co.tomtaylor.Clarke[4575]) Exited abnormally: Trace/BPT trap 

belli ki, CoreLocation şeyler derleme olamaz.

Bu uygulama için tek bir ikili sunmayı umuyordum. CoreLocation API'sini 10.5'ten 'gizlemek için bir yol var mı?

cevap

4

Sen hedefin inşa ayarlarını değiştirerek bu sorunu çözmek mümkün olmalıdır:

  1. Set Baz SDK Dağıtım SDK
  2. 10.6 olarak ayarlayın 10.5
+4

Bu doğru yöntemdir ancak daha fazlası var: 10,6 değil 10.5 olan API'leri çağırmanız gerektiğinde, NSClassFromString() kullanarak sınıf adını almanız gerekir. Daha sonra, iade edilen sınıf adının geçerli olup olmadığını kontrol edin. Geçerliyse, devam edip ihtiyaç duyduğunuz API'ları arayabilirsiniz. Aksi takdirde, incelikle başarısız olmanız gerekir. – Jasarien

5

Dağıtım için SDK hilesi, yalnızca her iki platformda aynı çerçeveye sahip olduğunuzda, ancak yeni çağrılarda yeni aramalar yaptığınızda çalışır. CoreLocation için, tüm çerçeve 10.5'te eksiktir, bu nedenle uygulamanız yüklenemedi çünkü dinamik olarak çerçeveye bağlanamaz.

Yukarıdakileri yapmanız ve ayrıca CoreLocation'ı zayıf bir çerçeve olarak eklemeniz gerekir. Bağlantı Çerçevelerinizi ve Binaries yapı fazınızı seçin, Ayrıntı görünümünde Çekirdek Konum'u bulun ve orta sütunda "Zorunlu" "Zayıf" olarak değiştirin.

Uygulamanızı oluşturduğunuzda, Xcode bağlayıcıya -weak_framework CoreLocation öğesini aktarır ve uygulamanız CoreLocation'ın mevcut olup olmadığına bakılmaksızın tüm 10.5 ve 10.6 sistemlerine yüklenir. Aslında, 10.6'da çalışıyorsanız, CoreLocation yöntemlerini aramadığınızdan emin olun.

+0

-weak_framework, -weak-framework yerine – AlBlue

İlgili konular