2012-05-15 29 views
8

從我所看到的,如果你正在建設一個OSX桌面HTML5應用,並希望localStorage的在你的WebView包裝堅持,你需要做的是這樣的:localStorage的在OSX應用程序不堅持(的Xcode 4.3)

WebPreferences* prefs = [webView preferences]; 
[prefs _setLocalStorageDatabasePath:@"~/Library/Application Support/MyApp"]; 
[prefs setLocalStorageEnabled:YES]; 

來自:How do I enable Local Storage in my WebKit-based application?

但這在Xcode 4.3中似乎不適用於我。相反,我得到

"No visible @interface for 'WebPreferences' declares the selector '_setLocalStorageDatabasePath:' 
"No visible @interface for 'WebPreferences' declares the selector 'setLocalStorageEnabled:' 

我很新的目標C,並可能做一些愚蠢的像不包括一些頭什麼的。

我已經包含這些頭的WebKit的框架,既:

#import <WebKit/WebKit.h> 
#import <WebKit/WebPreferences.h> 

,什麼是奇怪的是,我可以訪問的首選項的其他方法,即[prefs setDefaultFontSize:10] - 但只是沒有兩個以上我列舉。

任何想法?這是否已經在Xcode 4.3中被刪除?

+0

該錯誤消息說,沒有_setLocalStorageDatabasePath宣言: - 不,如果你調用它,它不會起作用。如果你打電話,它可能會工作,然後當Apple發佈10.8或10.7.5時,它可能會停止工作。很可能你不想以任何速度使用它們。 –

+1

@TomAndersen不,它實際上不會編譯。並注意'setLocalStorageEnabled'方法不起作用 - 而且這甚至不是私有方法。 – asgeo1

+0

你可以調用可可的任何東西:比如拿一個NSString aString,然後[aString thisIsACallThatWillNotWork];應該編譯並在運行時導致崩潰。也許你正在使用不同的編譯器設置。 –

回答

5

好的,我有一個解決方案。我查看了macgap的源代碼,並注意到他們是如何處理這個問題的。

事實證明,我得到的錯誤消息確實有點意義 - 我需要首先爲WebPreferences聲明一個接口。

@interface WebPreferences (WebPreferencesPrivate) 
- (void)_setLocalStorageDatabasePath:(NSString *)path; 
- (void) setLocalStorageEnabled: (BOOL) localStorageEnabled; 
@end 

... 

WebPreferences* prefs = [WebPreferences standardPreferences]; 
[prefs _setLocalStorageDatabasePath:"~/Library/Application Support/MyApp"]; 
[prefs setLocalStorageEnabled:YES]; 
[webView setPreferences:prefs]; 

就像我說的,我是Objective-C的新手。我真的不知道爲什麼需要這個接口來調用這兩個方法(即,當我可以在沒有接口的情況下調用其他方法時)。

+0

爲我工作w/Xcode 4.3.3。謝謝! – endemic

2

有好消息,有壞消息;我會假設你首先想要壞消息(如果我首先用壞消息回答你的問題,會更容易)。

壞消息

,爲什麼出現這種情況的唯一答案是,Xcode的4.3不提供這些方法了。你鏈接到的這個問題「How do I enable Local Storage in my WebKit-based application?」是一年前的最後一個活動(接受的答案在2011年初編輯)。自那時以來,至少有兩次更新Xcode(可能更多,我只是不記得它們),而且我認爲蘋果公司希望保留其私有方法是可行的,所以可以安全地假設他們刪除了它們以及對setLocalStorageEnabled:的支持。不支持您在WebPreferences實例調用

  1. 兩種方法:

    ,我不認爲有任何其他的回答你的問題的原因有以下幾點。這不僅僅是私有方法,因此Apple必須修改WebPreferences類,不僅刪除setLocalStorageEnabled:,還支持私有方法,如_setLocalStorageDatabasePath:。爲什麼他們支持私人方法,我不知道,但他們已經明確支持他們的支持,因爲我在一段時間內沒有看到有機會實施私人方法。

  2. 如果實現私有方法(甚至是其他公共方法)是可能的,那麼它就像代碼所做的那樣簡單。如果你看一個鏈接的問題,他們沒有提到任何難以獲得代碼支持的步驟。沒有任何方法可以導入一個框架的私有部分,如WebKit,而不是爲了不僅僅是發現私有部分,而是將它放入你的代碼中。即使在所有這些繁重的工作之後,您的代碼都可以支持這些方法,但Apple很可能不會對此感到滿意,並且他們可能會從應用商店中拒絕您的應用。

對不起,這是一個蠢貨,但我只是不認爲你的代碼會工作了,沒有一些深度挖掘和大的解決方法。如果你想讓它輕鬆工作,那麼你可能不得不回到2011年初,然後改用你的應用程序。

好消息

有可能是一些解決方案,不涉及我只是不知道,因爲使用WebKit我缺乏經驗,私人和不支持的方法。與其尋找你的代碼不工作的答案,我會開始尋找你的代碼應該做的替代方案。

+0

有一點要檢查:如果你編寫html5代碼(js + html5),那麼把它放在你的web視圖中是否有效?然後,如果你需要,你可以連接你的js到你的目標c來獲取/獲取數據。 –

+0

不,它不會工作;這是調用iOS SDK不再支持的方法,而不是Web視圖的內容。 –

+0

我認爲你是對的,不再支持。我可能必須使用PhoneGap的類似方法 - 在程序退出時將localStorage.db複製到安全位置,並在程序重新啓動時恢復。 – asgeo1

相關問題