Статьи

Приложения для Windows 8 для PhoneGap Developer-Files

(Это часть 5 из моей серии о приложениях для Windows 8 для разработчика PhoneGap.)

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

PhoneGap предоставляет доступ к файлам несколькими различными способами. Давайте начнем с самого простого сценария и продолжим работу.

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

С помощью приложений JavaScript для Windows 8 вы можете сохранять настройки несколькими способами. Самый простой способ — просто сделать это.

var localSettings = Windows.Storage.ApplicationData.current.localSettings;
localSettings.values["my setting"] = "this is a setting";

Это оно! Теперь у вас есть настройки, сохраненные для приложения локально. Если приложение удаляется и переустанавливается, настройка очищается. Ни одно другое приложение не может получить доступ к настройкам этого приложения. Вы можете хранить строки и целые числа и так далее. Читать это тоже легко.

// Simple setting

var value = localSettings.values["my setting"];
        
if (!value)
{
    // No data
}
else
{
    // Access data in value
}

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

// Composite setting

var composite = new Windows.Storage.ApplicationDataCompositeValue();
composite["loginAttemptCount"] = 1;
composite["lastUserName"] = "johndoe123";

localSettings.values["loginAttempts"] = composite;

Вы также можете иметь контейнеры настроек для более сложных сценариев.

Помимо локальных настроек, у вас могут быть настройки роуминга. Они связаны с комбинацией учетной записи Microsoft пользователя (ранее Live ID) и вашего приложения. Поэтому, если я запускаю ваше приложение на нескольких компьютерах, на которых у меня есть учетная запись, все, что вы сохраняете в настройках роуминга, автоматически синхронизируется между компьютерами. Это отлично подходит для высоких результатов и самого дальнего уровня, достигнутого в играх — не должно иметь значения, на какой машине я разблокирую уровень berzerker, у меня должен быть доступ к ней на каждой машине с моими учетными данными и вашим приложением. Они очень просты в использовании, и вам не нужно настраивать облачные сервисы или что-то еще! Вот пример, приведенный выше, для роуминга.

var roamingSettings = Windows.Storage.ApplicationData.current.roamingSettings;
roamingSettings.values["my setting"] = "this is a setting";

Существует довольно ненавязчивый механизм синхронизации, работающий с перемещаемым профилем. Но иногда вам нужно синхронизировать материал очень быстро. Для этого просто создайте параметр роуминга (или составной) с именем HighPriority. Это будет синхронизировано в течение минуты!

Если ваше приложение работает и вы хотите узнать, доступны ли новые роуминговые данные, которые были сохранены на другом компьютере, вы можете подписаться на событие обновленных данных. Затем вы можете обновить свое приложение, даже не нажимая кнопку обновления.

var applicationData = Windows.Storage.ApplicationData.current;
 
function initialize() 
{
    applicationData.addEventListener("datachanged", datachangeHandler);
}

function dataChangeHandler(eventArgs)
{
    // TODO: Refresh your data
}

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

Еще одна замечательная особенность настройки — вы можете создавать версии . То есть, если в версии 1 вашего приложения используется определенный набор данных настроек, а в версии 2 вашего приложения вы измените его (добавьте или удалите параметры, измените типы данных и т. Д.), Чтобы приложение могло проверить версию настройки на компьютере пользователя. Таким образом, вы узнаете, можете ли вы просто положиться на них как есть или вам нужно обновить их.

Если у вас есть более чем простые настройки для сохранения, скажем, таких файлов, как изображения или что-то еще, вы можете использовать свойство localFolder (или roamingFolder, если хотите) свойства данных приложения. Это сохраняет в определенном месте для каждого приложения. Вы пишете и читаете файлы, используя методы в классе Windows.Storage.FileIO , вот так.

function writeSpeech() {
   localFolder.createFileAsync("gettysburg.txt", Windows.Storage.CreationCollisionOption.replaceExisting)
      .then(function (sampleFile) {
         var speechText = "Four score and seven years ago, etc...";
         return Windows.Storage.FileIO.writeTextAsync(sampleFile, speechText );
      }).done(function () {      
      });
}

Обратите внимание, что запись выполняется асинхронно с использованием шаблона Promise с синтаксисом .then.

Читать тоже легко.

function readSpeech() {
   localFolder.getFileAsync("gettysburg.txt")
      .then(function (sampleFile) {
         return Windows.Storage.FileIO.readTextAsync(sampleFile);
      }).done(function (speechText) {
         // Data is contained in speechText
      }, function () {
         // speechText not found, grab an envelope and start writing again!
      });
}

Это те же самые методы чтения и записи, которые используются для другого варианта сохранения данных, который управляет вещами как файлами, с которыми взаимодействует пользователь. Это может быть файл изображения, который вы хотите сохранить вместе с вашим приложением, или регистр чекового аккаунта, который сохраняется как полный файл данных. Дело в том, что в этой технике пользователь указывает имя файла при сохранении или открытии. Например, при работе с Word, Excel или PowerPoint. Вы можете получить доступ к этим файлам либо напрямую с помощью кода, либо с помощью средства выбора файлов.

В коде вы можете использовать классы в пространстве имен Windows.Storage . Вероятно, это наиболее похоже на приложение PhoneGap в том смысле, что вы можете запрашивать каталоги и / или файлы, создавать их, читать их, перемещать их и т. Д. Например, если вы хотите получить доступ к файлам, которые пользователь сохранил в своей папке «Мои документы» вы можете использовать свойство documentsLibrary класса Windows.Storage.KnownFolders, чтобы добраться до них. То есть, если вы указали правильную возможность в манифесте своего приложения. Вы не забыли сделать это. Правильно?

DocumentsLibraryAccess

Вы используете такие методы, как getItemsAsync, чтобы получить коллекцию, которую вы можете .forEach обработать и обработать. Вы можете искать файлы и создавать запросы к папкам с некоторыми интересными опциями , такими как группировка изображений по месяцам, группировка музыки по исполнителю и т. Д.

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

// Create the picker object and set options
var savePicker = new Windows.Storage.Pickers.FileSavePicker();
savePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.documentsLibrary;
// Dropdown of file types the user can save the file as
savePicker.fileTypeChoices.insert("Plain Text", [".txt"]);
// Default file name if the user does not type one in or select a file to replace
savePicker.suggestedFileName = "New Document";

savePicker.pickSaveFileAsync().then(function (file) {
    if (file) {
        // Prevent updates to the remote version of the file until we finish making changes and call CompleteUpdatesAsync.
        Windows.Storage.CachedFileManager.deferUpdates(file);
        // write to file
        Windows.Storage.FileIO.writeTextAsync(file, "windows 8 rocks!").done(function () {
            // Let Windows know that we're finished changing the file so the other app can update the remote version of the file.
            // Completing updates may require Windows to ask for user input.
            Windows.Storage.CachedFileManager.completeUpdatesAsync(file).done(function (updateStatus) {
                if (updateStatus === Windows.Storage.Provider.FileUpdateStatus.complete) {
                  //success!
                } else {
                  //epic fail
                }
            });
        });
    } else {
        //user cancelled
    }
});
   }

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

filepicker 

Вы можете не осознавать, что помимо возможности выбора файлов, позволяющей пользователю выбирать файлы на своем компьютере, они также могут выбирать файлы для чтения или сохранения в том виде, в котором они предоставляются другими приложениями в системе. Например, у меня установлено приложение SkyDrive, поэтому я могу сказать приложению сохранить его.

подборщик

Ваше приложение просто получает ссылку на файл для чтения / записи. Чтобы получить доступ к файлу, ему не нужно знать, как работает SkyDrive или каковы мои учетные данные. Все, что нужно сделать пользователю — это установить приложение SkyDrive (или любое другое приложение, предоставляющее файлы) в своей системе и войти в него ранее. Довольно мощная возможность!

Просмотрите все эти краткие руководства по работе с данными и файлами, и вы откроете для себя великолепные возможности программирования, позволяющие создавать сценарии, о которых вы даже не задумывались!