2015-02-11 65 views
2

我在嘗試將Parse與跨平臺的Xamarin應用程序集成時遇到了很多問題。起初,我能夠使用Xamarin和MvvmCross創建Android應用程序,並與Parse服務集成(通過在Xamarin中添加Parse組件完成)。當開發iOS應用程序時,由於Parse目前不支持Xamarin PCL項目,因此我有問題需要將Parse依賴項重構爲Core PCL項目。因此,沒有可以添加到PCL項目的Parse NuGet包或Xamarin組件。我可以輕鬆地將Parse組件添加到iOS項目和Android項目中,但這需要在兩個項目中進行大量的代碼重複。如何使解析與Xamarin的PCL項目和MvvmCross一起工作?

我讀過,在Core項目中引用Parse.dll和Parse.NetFx45.dll使我可以在Core項目中使用Parse調用。我做到了這一點,並能夠成功編譯所有內容。但是,當我嘗試使用ParseClient.Initialize("ApplicationID", "DotNetKey");初始化Core項目中的Parse時,我在運行時得到TypeInitializationException

問題是,將解析服務與Xamarin集成的最佳方法是什麼?& Mvvm跨平臺應用程序?我想很多人會這樣做,但無法找到參考/例子。在iOS和Android項目中複製代碼絕對不應該是這樣。

回答

3

這裏有一對夫婦的想法:

首先,如果你正在手動複製解析代碼更改從項目到項目,你可以通過編寫一個可以將某些文件克隆到另一個項目的腳本來加速該過程。或者你也許可以編寫一個grunt腳本,當它檢測到一個變化時自動複製文件。

現在,這裏是存儲解析代碼在一個項目,但跨平臺是共享的另一種方法:

問題:我用,而不是PCL共享項目的房子我Xamarin.Forms和解析碼。 Parse代碼工作得很好,但是當我在XAML的ContentPage中使用我自己的自定義ContentView時,遇到了一個問題。我想要一個解決方案,可以讓我的自定義ContentView和我的Parse代碼一起工作 - 都來自同一個項目。

解決方案:我已經切換到現在住房我的Xamarin.Forms和解析代碼在PCL。但是有一個小問題。在我解釋捕獲之前,只需知道它的工作方式是否解析代碼複製(除了每個平臺特定項目中的解析初始化代碼的一行外)。

有什麼收穫?問題在於,在您的可移植類庫中,您必須手動交換Parse.iOS.dll或Parse.Android.dll,具體取決於您當時編譯的內容。

它會增加文件大小嗎?編號我使用共享項目(使用平臺項目的參考文獻到Parse DLL)與可移植類庫(您必須在平臺項目中添加對dll的引用以及PCL ),並通過這種方式發現應用程序文件大小沒有增加。

以下是目前正在爲我工​​作的項目結構(項目名稱已更名爲機密)。 (供參考:我使用Xamarin爲Mac。)

MyProject.iOS 
- Reference to Parse.iOS.dll 
- Reference to the Portable Class Library 
MyProject.Android 
- Reference to Parse.iOS.dll 
- Reference to the Portable Class Library 
Portable Class Library 
- Parse Code 
- Xamarin Forms Code 
- Reference to either Parse.iOS.dll or Parse.Android.dll 

重要:當PCL換出的DLL,我發現,如果我用鼠標右鍵單擊引用菜單下的DLL,然後單擊刪除,它在我的項目中導致了問題,在那裏iOS項目不再編譯,因爲它仍然在尋找Parse.Android.dll,反之亦然。我試圖清理解決方案,從解決方案的文件系統中刪除bin和obj文件夾無濟於事。我通過這樣做再次運行它:右鍵單擊引用,單擊編輯引用,然後取消選中一個Parse DLL並選中其他框。但是,之後,我再次嘗試「刪除」方法,並沒有編譯問題。誰知道,也許這個問題會再次出現。

這不會讓人討厭嗎?根據您在不同平臺之間切換的頻率,DLL的手動交換可能會或可能不會令人討厭。不管這是多麼惱人,它不會比有重複的代碼差。 (也許這個交換過程可以通過腳本實現自動化?我認爲如果你使用腳本修改.csproj,你將不得不卸載PCL並重新加載它。任何人在那裏面對挑戰?或者也許有一種方法基於它正在編譯的平臺做DLL的條件引用。想想任何人?)

我希望這有助於。如果你喜歡這些想法比你現在做的更好,請接受這個答案,讓我們知道你決定採取哪條路線。

0

因此,我通過在所有3個項目(Core,iOS和Android)中引用Parse.Android.dll,在Android和iOS上都能正常工作。是的,這聽起來很奇怪,但這就是我的工作。只需到Parse download page並在Android部分下載Xamarin SDK即可。它也可以創造奇蹟!沒有代碼重複,沒有混亂:)

+0

請注意,在iOS上,當這樣做時,Mono.Android運行時將需要包含在iOS中,導致應用程序大小爲_huge_!也許這不是最好的方式畢竟:( – 2015-03-27 04:39:16

+0

你有沒有找到一個很好的方式使解析工作的iOS和Android沒有重複解析邏輯,並沒有使iOS應用程序巨大? – 2015-05-16 02:15:27

+0

@AnthonyTietjen我們結束了把代碼需要與Parse進行交互,這些類實現了一個在Core中定義的接口,因此,假設我想查詢位於Core的ViewModel中的總銷售數量,我將調用await ISomeParse。 GetNumberOfSales()'.Droid/iOS類中的代碼是相同的(命名空間除外),並且它們實現相同的接口,所以不幸的是存在代碼重複,但它工作得很好。確定其他項目中的其他副本已更新 – 2015-05-20 07:51:27

1

是不是最好的方式來創建一個用於Mvvmcross Parse插件?你在哪裏定義你想要使用的接口。

而在每個平臺特定的庫中,您引用解析dll並調用該方法。所以,在你的核心項目,你應該能夠調用IParse.methods ...

+0

好主意,但它仍然會導致重複代碼,因爲這兩個平臺的代碼完全相同。這兩個平臺之間的唯一區別是需要引用的dll。 – 2015-05-24 15:48:38

+0

是的,但是你可以創建類似SQLite aplugin的東西...... Core中的共享代碼用於所有平臺,它們被添加爲特定平臺插件中的鏈接 – 2015-05-24 17:22:32

相關問題