首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将MSMessage url设置为文件的url后,它将保持为零。

将MSMessage url设置为文件的url后,它将保持为零。
EN

Stack Overflow用户
提问于 2016-11-01 14:57:20
回答 1查看 375关注 0票数 3

我有一个iOS 10 iMessage应用程序。当我将文件URL附加到MSMessage时,message.URL就是(null)。我真的不知道是什么导致了这一切。当我检查日志时,我看到一个正确的url:URL: file:///thisuser/...等,但是,message.URL日志(null)

我已经构建了一个Exporter类,它将文件保存到磁盘,然后返回它的路径。

代码语言:javascript
复制
+ (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中。

代码语言:javascript
复制
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);
}];

==编辑:我在代码中添加了一个检查,看看出口商是否返回了一个有效的文件路径,结果是这样的。

代码语言:javascript
复制
NSURL *fileURL = [NSURL fileURLWithPath:[Exporter saveRequestToDisk:[Converter databaseToRequest:history]]];

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-01 15:56:14

在查看文档和浏览这篇文章之后,我认为url属性不应该指向文件。相反,它应该

..。要与消息一起传输的数据。

我想正确的方法是

在URL中对应用程序的数据进行编码。例如,可以在URL的查询字符串中将数据编码为键值对,如下所示:

代码语言:javascript
复制
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,可能如下所示:

代码语言:javascript
复制
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];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40362668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档