Безопасное достижение трех- и четырехсторонней синхронизации устройства без [[UIDevice] uniqueIdentifier]? - PullRequest
3 голосов
/ 03 ноября 2011

Переключение на пользовательские UUID устройства становится настоящим кошмаром! Я надеюсь, что кто-то сталкивался с этим раньше и мог бы знать, как с этим справиться.

Предположим, что у пользователя есть приложение с набором данных из 500 000 (маленьких) записей, поэтому невозможно просто скопировать всю базу данных устройства и объединить их. Пользователь установил это приложение на:

  1. iPhone
  2. MacBook
  3. планшет Android.

При подключении к одной и той же физической сети каждое устройство может видеть друг друга и может инициировать синхронизацию. Для достижения трехсторонней синхронизации данных (это не зависит от центрального сервера или подключения к Интернету).

  1. Каждое устройство хранит список изменений с отметкой времени.
  2. Каждое устройство знает, когда оно в последний раз синхронизировалось с каждым из двух других устройств.
  3. Когда устройство видит другое устройство, оно отправляет через все известные изменения с момента последнего обращения к этому устройству.
  4. Если обнаружено новое устройство, нет проблем, просто отправьте все введенные данные.

Проблема возникает, если пользователь создает резервную копию своего iphone или ipad и восстанавливает его на другом iphone или ipad. В этом сценарии мы получаем пользователя с двумя устройствами в локальной сети с одинаковым UUID. Обновления в конечном итоге (случайным образом) переходят на одно или другое идентично идентифицированное устройство.

Я знаю, что мы можем продолжать использовать уникальный идентификатор устройства, но я беспокоюсь о том, что произойдет, когда оно исчезнет!

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

Вместо этого вы можете сохранить сгенерированный UDID устройства в файле в каталоге Caches, где он не будет сохранен.Когда резервная копия восстановлена ​​на новом устройстве, база данных будет присутствовать, но не будет файла UDID.В этом случае создайте новый UDID;другие экземпляры увидят это как новый экземпляр и могут перенести все последние изменения.Возможно, вы захотите изменить логику, чтобы другие экземпляры запрашивали метку времени для нового UDID, а не предполагали, что новый экземпляр полностью пуст.

До iOS 5.0 ваш файл UDID не будет автоматически удаляться системой,Однако в iOS 5.0 вам нужно смириться с тем фактом, что он может быть очищен в ситуациях с нехваткой места на диске.Если это произойдет, просто следуйте той же процедуре, что и при восстановлении на новом устройстве: создайте новый UDID;другие экземпляры увидят это как новый экземпляр и перенесут последние изменения.

Как сказал Floix, в iOS 5.0.1 есть новый механизм (еще не выпущенный), который позволит вам указать, что файлне следует ни резервировать, ни очищать.

2 голосов
/ 03 ноября 2011

При запуске приложения вы ищете файл в папке документов приложений с именем udid.txt. Если этот файл недоступен, создайте его и создайте свой пользовательский UDID, сохраните его в этом файле. Используйте следующую функцию, чтобы добавить флаг в этот файл, чтобы исключить его из процедур резервного копирования и синхронизации.

#include <sys/xattr.h>
- (void) AddSkipBackupAttributeToFile: (NSURL*) url
{
  u_int8_t b = 1;
  setxattr([[url path] fileSystemRepresentation], "com.apple.MobileBackup", &b, 1, 0, 0);
}

Проблема с этим решением заключается в том, что пользователь может использовать iPhoneExplorer или что-то подобное для изменения UDID. Попробуйте зашифровать или скрыть файл, чтобы он не смог этого сделать.

Примечание. Работает только с iOS 5.0.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...