Файл Json имеет значение null при печати в ресурсе пакета ios ionic objective c

Я запускаю сборку ios ionic проекта app.xcproj в xcode. Я загружаю файлы json с сервера в следующем месте: /var/mobile/Containers/Data/Application/63E66EE9-9A1B-4D4D-AEF6-F8C54D159ED0/Library/NoCloud/MyApp/Timing/DTS.json и я проверил, есть ли у меня файлы, распечатав:

NSURL *urlDTS = [NSURL fileURLWithPath: DTS_Path];
NSString *fileContentDTS = [NSString stringWithContentsOfURL:urlDTS encoding:NSUTF8StringEncoding error:nil];
NSLog(@"Json data is here of DTS  %@", fileContentDTS);

Это печатает весь файл в порядке, после этого, когда я получаю путь к ресурсу для дальнейших операций, он показывает null

NSString *filePathDTS = [[NSBundle mainBundle] pathForResource:getParameterDTSValueName ofType:@"json"];
NSLog(@"This is the dts path %@", filePathDTS);

Даже я получил местоположение файлов как /var/mobile/Containers/Data/Application/63E66EE9-9A1B-4D4D-AEF6-F8C54D159ED0/Documents/DTS.json

следуя эта ссылка:

NSString *documentdir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *tileDirectory = [documentdir stringByAppendingPathComponent:@"xxxx/DTS"];
NSLog(@"Tile Directory: %@", tileDirectory);

Обновлять

Вот что содержит файл: [{"value": 0}]

NSURL *libraryDirURL = [[NSFileManager.defaultManager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *urlDTSK = [libraryDirURL URLByAppendingPathComponent:@"NoCloud/MyApp/MyFolder/DTS.json"];
NSString *filePathDTS = [NSString stringWithContentsOfURL:urlDTSK encoding:NSUTF8StringEncoding error:nil];
NSLog(@"This is Dts PATH %@", filePathDTS);
NSData *dataDTS = [NSData dataWithContentsOfFile:filePathDTS];
NSLog(@"here is DTS data  %@", dataDTS); //this shows null
NSDictionary *jsonDTS = [NSJSONSerialization JSONObjectWithData:dataDTS options:kNilOptions error:nil];
NSLog(@"here is jason DTS %@", jsonDTS);
NSMutableArray *DTSvalue = [jsonDTS valueForKeyPath: @"Value"];
DTSValueIs = DTSvalue[0];
NSLog(@"here is DTS Value first%@", DTSvalue[0]);
NSLog(@"here is DTS value is%@", DTSValueIs);

Это показывает This is Dts contents [{"value":0}] 2018-06-11 17:04:40.940006+0500 Muslims 365[3356:819935] here is DTS data (null)

Пожалуйста, объясните мне, как я могу получить данные из файла json, предоставив ресурс в основном пакете ??? поскольку он показывает null.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

pathForResource - это правильный способ получить путь внутри вашего пакета приложений. Обратите внимание, что это место ТОЛЬКО ДЛЯ ЧТЕНИЯ. Вы не можете скачать файл и сохранить его там. pathForResource обращается только к файлам, которые у вас есть во время компиляции, и возвращает nil - это означает, что файл не найден. Когда вы создаете свой проект, он создает «пакет» - папку с именем «MyApp.app». В Xcode вы можете увидеть его в группе «Продукты» слева, и вы можете щелкнуть правой кнопкой мыши и открыть это в Finder, затем щелкнуть правой кнопкой мыши - показать содержимое - чтобы увидеть, что внутри. Таким образом вы можете визуализировать структуру вашего основного пакета. Если ваш файл находится внутри подкаталога, вам нужно использовать pathForResource: ofType: inDirectory:.

Папка «Библиотека» внутри контейнера - хорошее место для хранения данных времени выполнения. Например, файлы, которые вы скачиваете. Это место ЗАПИСАНО и пусто при первом запуске приложения. Если в вашем пакете есть файл, который нужно изменить, вы можете скопировать его из комплекта в «Библиотеку». Обратите внимание, что если вы загружаете некоторые файлы, которые позже можно будет повторно загрузить, лучше использовать «Кеши» (подпапка «Библиотека»). Если вы из мира Windows, идея «библиотеки» похожа на «AppData».

«Документы» - это место, предназначенное для файлов, которые видны пользователю и могут редактироваться или управляться пользователем. Он также доступен для записи. Вы можете думать об этом как о «Документах» в macOS или «Мои документы» в Windows, но только для определенного приложения.

Если ваш файл находится в «Библиотеке», позже вы можете получить путь к библиотеке и загрузить файл в виде строки, например:

NSURL *libraryDirURL = [[NSFileManager.defaultManager URLsForDirectory:NSLibraryDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *urlDTS = [libraryDirURL URLByAppendingPathComponent:@"NoCloud/MyApp/MyFolder/DTS.json"];
NSString *fileContentDTS = [NSString stringWithContentsOfURL:urlDTS encoding:NSUTF8StringEncoding error:nil];

Итак, что мне делать, чтобы получить данные из json из основного пакета?

iOS Developer 09.06.2018 12:55

Убедитесь, что он находится внутри связки. Как это сделать, я описываю в первом абзаце - откройте MyApp.app и посмотрите, есть ли он там. Если нет - вам нужно пометить его как ресурс в Xcode. (Google: этап создания копий ресурсов)

battlmonstr 09.06.2018 12:57

Добавьте файл в проект, а затем перетащите его здесь

battlmonstr 09.06.2018 13:05

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

iOS Developer 09.06.2018 13:22

Вы не можете загрузить в бандл, ТОЛЬКО ЧИТАЙТЕ! Что ты пытаешься сделать?

battlmonstr 09.06.2018 13:24

Я загружаю четыре файла json, они загружаются здесь: / var / mobile / Containers / Data / Application / 63E66EE9-9A1B-4D4D-A‌ EF6-F8C54D159ED0 / Lib‌ rary / NoCloud / MyApp / M‌yFolder / DTS. json

iOS Developer 09.06.2018 13:28

Чтобы получить этот путь позже, вам нужно получить путь к «Библиотеке», а затем добавить к нему «NoCloud / MyApp / MyFolder / DTS.json».

battlmonstr 09.06.2018 13:31

так как я могу определить свой путь к пакету ??? например NSString * filePathDTS = [[NSBundle mainBundle] pathForResource: @ "DTS": @ "json"];

iOS Developer 09.06.2018 13:36

Забудьте о связке. Комплект! = Библиотека. Получите путь к библиотеке как это, а затем добавьте «NoCloud / MyApp / MyFolder / DTS.json».

battlmonstr 09.06.2018 15:03

после добавления он получает тот же путь, что и /var/mobile/Containers/Data/Application/EF9E024B-B2D4-41E7-9‌​248-E56E1643B838/Lib‌​rary/NoCloud/MyApp/M‌​y_Folder/DTS.json

iOS Developer 11.06.2018 10:33

Конечно, если вы не переместили файл, он все равно должен находиться по тому же пути и быть доступен для чтения с помощью stringWithContentsOfURL.

battlmonstr 11.06.2018 10:36

дорогой, но когда я обрабатываю дальше, я имею в виду, когда я определяю в основном пути пакета имя файла, которое он дает null, как мне разрешить это

iOS Developer 11.06.2018 10:38

Вы не можете использовать «[NSBundle mainBundle] pathForResource» для чтения «Библиотеки». Вы используете pathForResource для чтения «пакета», и вы используете некоторые другие функции (например, stringWithContentsOfURL) для чтения внутри «библиотеки».

battlmonstr 11.06.2018 10:42

пожалуйста, помогите мне, как мне заменить эту строку NSString *filePathDTS = [[NSBundle mainBundle] pathForResource:DTSValuePathOkName ofType:@"json"];, эта строка дает мне значение null, как я могу заменить ее как pathForResource

iOS Developer 11.06.2018 10:49

он работает до тех пор, пока содержимое не покажет null, как я уже упоминал подробно, см. обновление вопроса в последнем разделе

iOS Developer 11.06.2018 11:51

stringWithContentsOfURL уже дает вам содержимое, если вам нужен NSData, используйте [NSData dataWithContentsOfURL:urlDTSK]; вместо ваших строк 3-5

battlmonstr 11.06.2018 13:52

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