2010-07-05 50 views
3

我已經編譯了一個應用程序,其中包含基於iPhone 4.0 SDK的iPhone OS 3.0上的部署目標。這個應用程序包含OS 4.0新功能:本地通知。在OS3.x上運行時,iPhone OS4功能鏈接錯誤

它適用於使用OS 4.0的iPod 2G;然而,每次該應用程序啓動與OS 3.0的iPhone 1G時,它崩潰。這似乎是運行時引用錯誤:

「使dyld:找不到符號:_OBJC_CLASS _從引用$ _ UILocalNotification :在/ var /移動/應用/ 73A3FAB1-63AE-4A71-8C6B-932142A728FE/Tapatalk X.app/Tapatalk X 預計在:/System/Library/Frameworks/UIKit.framework/UIKit」

如果UIKit框架是SDK3.0 & SDK4.0之間是不同的,它爲什麼不同時編制報告?如何在此應用程序上應用本地通知功能,而應用程序仍可以在裝有OS3.0的設備上運行?謝謝。

回答

8

This answer解決了這個問題對我來說:

That error is being triggered because you didn't weak-link the UIKit framework. The UIKit framework in iPhone OS 3.2 added the UISplitViewController, and if you link it in as normal your application will assume those symbols exist on 3.0, where they don't.

To weak-link a framework, find your application target in Xcode, inspect it, and go to the General tab. At the bottom of that tab should be a list of frameworks, with a column for Type. Change the Type for UIKit from Required to Weak and rebuild your application. That should take care of the runtime errors.

這似乎還給我,因爲UIKit中總是會成爲我們靶向的設備上。

+0

謝謝。這似乎工作! – user268743 2010-07-06 03:18:42

+2

感謝您的解決方案!順便說一句,在XCode4中,您可以通過點擊頂級項目文件夾來完成此操作,然後單擊「構建階段」選項卡。然後打開「鏈接二進制庫」部分。然後將UIKit.framework的設置從「必需」更改爲「可選」 – Harris 2011-07-16 22:35:23

1

如果您使用4.0 SDK功能並且想要支持3.0設備,則需要在使用它之前檢查功能是否存在。

如果您使用的是新的類(你是)像下面應該工作:

Class localNotificationC = NSClassFromString(@"UILocalNotification"); 
if (localNotificationC) { 
    UILocalNotification* localNotification = [[localNotificationC alloc] init]; 

    // do stuff 

    [localNotification release]; 
} 
else { 
    // what to do with the 3.0 SDK 
} 

至於爲什麼編譯器不會告訴你,好了,你告訴編譯器,你正在使用4.0 SDK,並且這些類/方法在4.0上工作。

+0

在運行任何用戶代碼之前可能發生此錯誤。我有一個引用UILocalNotification的類,正如你所建議的那樣,將代碼正確地包裝在一個塊中。這個應用程序在上述錯誤發生之前就崩潰了,很久以前它就到達了該類/方法。 – jamesh 2010-07-05 09:55:16

+0

感謝您的回答。但我的問題與jamesh相同。運行時引用錯誤是在應用程序啓動時發生的,直到調用「UILocalNotification」爲止。 – user268743 2010-07-05 10:21:11

+0

iOS4中的新框架肯定需要與您的應用程序弱聯繫。它也不會對UIKit造成任何傷害,所以它肯定值得嘗試。我不記得對UIKit的弱連接,儘管通用應用程序的「自動升級」可能爲我做了這些。我會檢查什麼時候回家。 – 2010-07-05 10:32:52

0

我發現這個信息真的很有用。然而,我的問題是如何測試應用程序崩潰或沒有這種變化後。

背景是我有我的iPad應用程序相同的問題。我的BaseSDK設置爲4.3,部署目標爲3.2。我在3.2 iPad上進行臨時配置和運行應用程序時從未發生過此類崩潰,並且也得到了Apple的批准。但是用戶報告說,當他們在iPad 3.2下載後啓動應用程序時,甚至在顯示主屏幕之前崩潰。

我使用[UILocalNotifition頁頭]在我的代碼,我認爲可能是出於以下的碰撞結果: 異常類型:EXC_BREAKPOINT(SIGTRAP) 異常代碼:00000001,0xe7ffdefe

我似乎已經解決了這個按斯蒂芬的建議轉換上述說法。 但是我真的不知道如何測試它。在3.2版提交之前測試應用程序時,我也沒有收到任何崩潰,目前也沒有在啓動時發生崩潰。

在將更新推送到應用商店之前,我確實需要驗證此修復程序。請問有人可以提供更多關於如何測試的信息嗎?如果我可以使用以前版本的應用程序重現此崩潰,並且在此修復程序之後的當前版本中不是這種情況,那將非常有幫助。