URL-адрес MSMessage остается нулевым после установки в него URL-адреса файла

У меня есть приложение с приложением iMessage для iOS 10. Когда я прикрепляю свой файл URL к MSMessagemessage.URL является (null), Я действительно не знаю, что вызывает это. Когда я проверяю логи, я вижу правильный URL: URL: file:///thisuser/... и т.д. Однако, message.URL бревна (null),

Я построил Exporter класс, это сохраняет файл на диск и затем возвращает путь к нему.

+ (NSString *) saveToDisk:(NSDictionary *)dictionary {
    // Figure out destination name (in public docs dir)
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *zippedName = [self getExportFileName:dictionary withExtension:YES];
    NSString *zippedPath = [documentsDirectory stringByAppendingPathComponent:zippedName];

    // Export to data buffer
    NSData *gzData = [NSKeyedArchiver archivedDataWithRootObject:dictionary];

    if (gzData == nil) return FALSE;

    // Write to disk
    [gzData writeToFile:zippedPath atomically:YES];

    return zippedPath;
}

Это вернет что-то вроде: /Users/thisuses/Library/Developer/CoreSimulator/Devices/.../Documents/new-save.rst, где .rst это пользовательское расширение файла только для моего приложения. Это, в свою очередь, добавляется к MSMessage,

MSConversation *conversation = [self activeConversation];

MSMessageTemplateLayout *layout = [[MSMessageTemplateLayout alloc] init];
layout.image = [UIImage imageNamed:@"test"];
layout.caption = url.host;

MSMessage *message = [[MSMessage alloc] init];
message.layout = layout;

NSLog(@"Converter: %@", [Converter toDictionary:array]);
NSLog(@"Exporter: %@", [Exporter saveToDisk:[Converter toDictionary:array]]);
NSLog(@"URL: %@", [NSURL fileURLWithPath:[Exporter saveToDisk:[Converter toDictionary:array]]]);

message.URL = [NSURL fileURLWithPath:[Exporter saveToDisk:[Converter toDictionary:array]]];

NSLog(@"Message URL 1: %@", message.URL);

[conversation insertMessage:message completionHandler:^(NSError * error) {
    NSLog(@"MSConvo error: %@",error);
}];

== Редактировать: я добавил проверку к коду, чтобы увидеть, возвращает ли экспортер правильный путь к файлу и, оказывается, это так.

NSURL *fileURL = [NSURL fileURLWithPath:[Exporter saveRequestToDisk:[Converter databaseToRequest:history]]];

if ([fileURL isFileURL]) {
    NSLog(@"is File URL!");
    message.URL = fileURL;
}

1 ответ

Решение

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

[...][кодировать] данные для передачи вместе с сообщением.

Я думаю, правильный путь -

Кодируйте данные вашего приложения в URL. Например, вы можете кодировать данные в виде пар ключ-значение в строке запроса URL, как показано ниже:

guard let components = NSURLComponents(string: myBaseURL) else {
    fatalError("Invalid base url")
}

let size = NSURLQueryItem(name: "Size", value: "Large")
let count = NSURLQueryItem(name: "Topping_Count", value: "2")
let cheese = NSURLQueryItem(name: "Topping_0", value: "Cheese")
let pepperoni = NSURLQueryItem(name: "Topping_1", value: "Pepperoni")
components.queryItems = [size, count, cheese, pepperoni]

guard let url = components.url  else {
    fatalError("Invalid URL components.")
}

message.url = url

(Код взят из документации, вы можете преобразовать его в ObjC...)

Таким образом, вместо преобразования вашего словаря в NSData и записи его в файл, вы можете захотеть закодировать его в queryItems, возможно, так:

NSMutableArray *queryItems = [[NSMutableArray alloc] init]; // Or initWithCapacity for the sake of performance...
NSDictionary *dict = [Converter toDictionary:array];

for (id key in dict) {
    id value = queryDictionary[key];
    NSURLQueryItem *queryItem = [NSURLQueryItem queryItemWithName:key value:value];
    [queryItems addObject:queryItem];
}

[url setQueryItems:queryItems];
Другие вопросы по тегам