2012-10-18 14 views
7

Buduję wewnętrzną aplikację na iOS (więc - nigdy nie będzie w sklepie z aplikacjami), i muszę zachować katalog treści zsynchronizowany między serwerem a każdym z nich. wystąpienia aplikacji na iOS. Byłoby to łatwe, gdybym tylko chciał usunąć i ponownie pobrać tę zawartość za każdym razem, ale wolałbym użyć czegoś podobnego do rsync, aby pobierać tylko te elementy, które uległy zmianie.Synchronizacja katalogu plików między serwerem a aplikacją iOS

Nie znalazłem żadnego dobrego sposobu na wykorzystanie rsync. Rozważałem, patrząc na Objective-Git, jako możliwą opcję, ale na pierwszy rzut oka wyglądało na to, że wciąż jest dużo wsparcia dla zdalnych repozytoriów, które nie są jeszcze obsługiwane.

Jako ostatnia uwaga, chociaż nie będzie to w sklepie z aplikacjami, nie będę jailbreakować tych urządzeń i wolałbym nie polegać na żadnych prywatnych API (chociaż istniało eleganckie rozwiązanie wykorzystujące prywatne API Mogę to rozważyć).

Myśli?

UWAGA DODATKOWA: To musi być izolowane rozwiązanie. Nie będę polegać na usługach zewnętrznych (takich jak Dropbox, Box.net itd.). Musi to działać wyłącznie między urządzeniem a serwerem (który znajduje się w lokalnej sieci z urządzeniem).

+0

Doceniam opinie, ale szczerze mówiąc, twoja odpowiedź tak naprawdę nie ma tutaj zastosowania. HTTP + REST nie jest rozwiązaniem - to tylko sposób, w jaki można wdrożyć rozwiązanie. Szczerze mówiąc - zarówno rsync, jak i Objective-Git rozwiązałyby problem doskonale, gdyby były po prostu w pełni funkcjonalne, gdy zostały skompilowane na iOS. Oba mają obecnie ograniczenia, które uniemożliwiają taką możliwość. Istnieje wiele możliwych rozwiązań - niektóre używają HTTP, a inne nie. W końcu moim głównym zmartwieniem jest znalezienie czegoś, co działa. – dtuckernet

+0

W tym przypadku używam dystrybucji korporacyjnej. Możesz dowiedzieć się więcej na ten temat tutaj: https://developer.apple.com/programs/ios/enterprise/ – dtuckernet

+0

Sprawdź to, http://stackoverflow.com/questions/10774924/rsync-directories-vs-files – iDev

Odpowiedz

3

Użyj protokołu HTTP, aby wyświetlić zawartość każdego folderu na serwerze. Porównaj czas ostatniej modyfikacji każdego pliku z tymi na urządzeniu i znajdź dodane/usunięte pliki. Pobierz i zmodyfikuj pliki, usuń usunięte pliki.

+0

Doceniam porady dotyczące podejścia, ale tak naprawdę nie jest to rozwiązanie (tylko ogólne podejście). Wiele rozwiązań wdrożyło "aktualizacje zmian" w jednym lub drugim - i ma sens, aby wykorzystać jeden z nich zamiast pisać go od podstaw, jeśli to możliwe. – dtuckernet

0

Po prostu skonfiguruj interfejs RESTful i zrób to za pośrednictwem protokołu HTTP; w ten sposób można łatwo zapytać o czas modyfikacji, aby ustalić, czy pliki klienta lub serwera wymagają aktualizacji. Możesz również chcieć śledzić, które pliki na kliencie zostały zsynchronizowane, abyś mógł łatwo dowiedzieć się, które pliki dodać lub usunąć. Można to zrobić za pomocą prostego pliku .sync lub pliku plist/sqlite/itp.

+0

HTTP zawiera już wszystkie elementy do synchronizowania katalogu, nie ma potrzeby posiadania własnej usługi REST. – miho

0

Jeśli weźmiesz pod uwagę protokół FTP, dostępne są całkiem zaawansowane biblioteki klienckie. Na przykład iOS Chilkat bundle zawiera bibliotekę klienta FTP, która obsługuje synchronizację w obu kierunkach. Nie jest za darmo, ale jest dość tani - i dostajesz mnóstwo innych rzeczy, które mogą się kiedyś przydać. Oto przykład z iOS pociągając w dół wszystkie dodatki i zmiany (tryb 2):

http://www.example-code.com/ios/ftp_syncLocalTree.asp

Jedno zastrzeżenie - sądząc wyłącznie na przykładzie, nie wydaje się, aby zsynchronizować delecji. Jeśli jest to wymagane, możesz zrobić to sam bez większego wysiłku natychmiast po synchronizacji.

1

Wygląda na to, że możesz poprosić o bibliotekę, która już to robi, ale jeśli go nie znajdziesz, to oczywiście łatwo jest napisać to od podstaw, używając stat (2) na serwerze i tego samego lub odpowiednik wyższego poziomu na urządzeniach z iOS. Poproś iPhone o przesłanie drzewa plików z datą modyfikacji na serwer i wyświetl listę operacji wstawiania/usuwania/aktualizacji, które można wykonać za pomocą adresu URL (lub innego) dla każdego z nich, aby można było wykonać je przyrostowo w wątku tła. Czy informacje z serwera o nowe/zaktualizowane pliki zawierają datę modyfikacji serwera, aby można było ustawić to samo na urządzeniu z systemem iOS i wysłać to, gdy pytają serwer o status każdego pliku (rodzaj hackowania za pomocą system plików do przechowywania, ale działa).

+0

dtuckernet sprawił, że było jasne, że szukał istniejących rozwiązań, ale nagroda poszła na inne ogólne podejście. – slypete

0

Acrosync (patrz https://acrosync.com/library.html) wydaje się być dobrze dopasowany, biorąc pod uwagę pierwsze pytanie, jednak jeszcze go nie użyłem.

+0

Czy ktoś próbował tego? Wygląda obiecująco, ale obawiam się wdrożenia i możliwych zastrzeżeń ... –

Powiązane problemy