GameKit: Отправить дополнительную информацию с GKSession без фактического подключения?

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

Проблема, с которой я столкнулся, заключается в том, что сеанс GKS позволяет передавать только одну строку до установления соединения. Я хотел бы передать имя файла, количество страниц и, возможно, миниатюру.

Единственный способ, которым я могу сейчас придумать, - это автоматически подключить клиент и серверы, обменяться информацией о файлах, а затем автоматически отключить их. Это может хорошо работать, если в данный момент передается только один или два файла, и при передаче большого количества разных устройств могут возникать проблемы с потоками / синхронизацией.

Например, 7 файлов могут быть доступны. Таким образом, клиент должен был бы соединиться с ними один за другим, чтобы получить информацию для всех файлов. Это может занять достаточно много времени, и пользователь, возможно, уже решил, что он хочет загрузить "файл 1". Нажав "файл 1", необходимо установить соединение и начать передачу. Это может не произойти мгновенно, если клиент занят поиском информации о других доступных файлах.

Я также прочитал некоторые проблемы с подключением к серверу снова вскоре после отключения от него.. ( что GKSession не подключается при каждой попытке?).

Так что я думаю, что это сводится к простым вопросам: есть ли у кого-нибудь идеи, как я мог бы позволить клиенту получать дополнительную информацию о сервере, кроме peerID и peerName?

2 ответа

Как насчет настройки отображаемого имени в формате CSV, и когда вы получаете имя CSV, отображать только имя устройства.

Или вы можете отправить JSON String NSDictionary в качестве отображаемого имени

Пример Json для превращения в NSString:

{
     "DeviceName" : "Example",
     "File" : [
            {
                "FileName" : "PDF1"
                "TotalPages" : 100
            }
            ]
}

Стригированная версия:

{"DeviceName" : "Example","File" : [{"FileName" : "PDF1","TotalPages" : 100}]}

Затем, когда вы получите DisplayName, только покажите DeviceName и проанализируйте Детали файла где-нибудь, чтобы отправить запросы на сервер позднее.

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

Я ограничил отображаемое имя 16 символами и использовал оставшиеся 24 символа для своего использования.

Я создал смещения, из которых читается различная информация, которая нужна приложению. Например, от 0 до 15 будет представлять имя устройства; 16-24 будет представлять расширение файла. От 24 до 39 будет представлять имя файла. Если строка длиннее соответствующего пространства, она обрезается или обрезается в зависимости от того, что вы предпочитаете. Если строка короче соответствующего пробела, она дополняется пробелами. Я написал методы для получения этих строк из отображаемого имени из 40 символов. Если у кого-то есть лучшее решение, я был бы рад здесь их. Не могу опубликовать код в данный момент, так как у меня нет доступа к нему.

ура

Другие вопросы по тегам