ios 如何将 NSUrl 转换为 NSString?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8867554/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to convert NSUrl to NSString?
提问by RAGOpoR
After AVAssetExportSession
has complete export video.
I have plan to garb Video Path to upload via Youtube.
but [GDataUtilities MIMETypeForFileAtPath:path defaultMIMEType:@"video/mp4"];
it only accept NSString
.
Is it possible to convert NSUrl in to NSString for video file path.
之后AVAssetExportSession
拥有完整导出视频。我计划通过 Youtube 装上视频路径来上传。但[GDataUtilities MIMETypeForFileAtPath:path defaultMIMEType:@"video/mp4"];
它只接受NSString
. 是否可以将 NSUrl 转换为视频文件路径的 NSString。
i have try to use NSString *path = [ExportoutputURL absoluteString];
but it crash.
我尝试使用NSString *path = [ExportoutputURL absoluteString];
但它崩溃了。
Here is the Code
这是代码
- (void)exportDidFinish:(AVAssetExportSession*)session {
ExportoutputURL = session.outputURL;
_exporting = NO;
NSIndexPath *exportCellIndexPath = [NSIndexPath indexPathForRow:2 inSection:kProjectSection];
ExportCell *cell = (ExportCell*)[self.tableView cellForRowAtIndexPath:exportCellIndexPath];
cell.progressView.progress = 1.0;
[cell setProgressViewHidden:YES animated:YES];
[self updateCell:cell forRowAtIndexPath:exportCellIndexPath];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:ExportoutputURL]) {
[library writeVideoAtPathToSavedPhotosAlbum:ExportoutputURL
completionBlock:^(NSURL *assetURL, NSError *error){
dispatch_async(dispatch_get_main_queue(), ^{
if (error) {
NSLog(@"writeVideoToAssestsLibrary failed: %@", error);
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[error localizedDescription]
message:[error localizedRecoverySuggestion]
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alertView show];
[alertView release];
}
else {
_showSavedVideoToAssestsLibrary = YES;
ExportCell *cell = (ExportCell*)[self.tableView cellForRowAtIndexPath:exportCellIndexPath];
[cell setDetailTextLabelHidden:NO animated:YES];
[self updateCell:cell forRowAtIndexPath:exportCellIndexPath];
NSArray *modes = [[[NSArray alloc] initWithObjects:NSDefaultRunLoopMode, UITrackingRunLoopMode, nil] autorelease];
[self performSelector:@selector(hideCameraRollText) withObject:nil afterDelay:5.0 inModes:modes];
}
});
}];
}
[library release];
}
- (void)uploadVideoFile {
NSString *devKey = DEVELOPER_KEY;
GDataServiceGoogleYouTube *service = [self youTubeService];
[service setYouTubeDeveloperKey:devKey];
NSURL *url = [GDataServiceGoogleYouTube youTubeUploadURLForUserID:kGDataServiceDefaultUser];
// load the file data
NSString *path = [ExportoutputURL absoluteString];//[[NSBundle mainBundle] pathForResource:@"video_2451" ofType:@"mp4"];//[mFilePathField stringValue];
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
NSString *filename = [path lastPathComponent];
// gather all the metadata needed for the mediaGroup
NSString *titleStr = @"Upload Test";//[mTitleField stringValue];
GDataMediaTitle *title = [GDataMediaTitle textConstructWithString:titleStr];
NSString *categoryStr = @"Entertainment";//[[mCategoryPopup selectedItem] representedObject];
GDataMediaCategory *category = [GDataMediaCategory mediaCategoryWithString:categoryStr];
[category setScheme:kGDataSchemeYouTubeCategory];
NSString *descStr = @"GData Description";//[mDescriptionField stringValue];
GDataMediaDescription *desc = [GDataMediaDescription textConstructWithString:descStr];
NSString *keywordsStr = @"RAGOpoR Demo";//[mKeywordsField stringValue];
GDataMediaKeywords *keywords = [GDataMediaKeywords keywordsWithString:keywordsStr];
BOOL isPrivate = NO;//([mPrivateCheckbox state] == NSOnState);
GDataYouTubeMediaGroup *mediaGroup = [GDataYouTubeMediaGroup mediaGroup];
[mediaGroup setMediaTitle:title];
[mediaGroup setMediaDescription:desc];
[mediaGroup addMediaCategory:category];
[mediaGroup setMediaKeywords:keywords];
[mediaGroup setIsPrivate:isPrivate];
NSString *mimeType = [GDataUtilities MIMETypeForFileAtPath:path
defaultMIMEType:@"video/mp4"];
// create the upload entry with the mediaGroup and the file
GDataEntryYouTubeUpload *entry;
entry = [GDataEntryYouTubeUpload uploadEntryWithMediaGroup:mediaGroup
fileHandle:fileHandle
MIMEType:mimeType
slug:filename];
SEL progressSel = @selector(ticket:hasDeliveredByteCount:ofTotalByteCount:);
[service setServiceUploadProgressSelector:progressSel];
GDataServiceTicket *ticket;
ticket = [service fetchEntryByInsertingEntry:entry
forFeedURL:url
delegate:self
didFinishSelector:@selector(uploadTicket:finishedWithEntry:error:)];
[self setUploadTicket:ticket];
GTMHTTPUploadFetcher *uploadFetcher = (GTMHTTPUploadFetcher *)[ticket objectFetcher];
}
Error EXC_BAD_ACCESS at
错误 EXC_BAD_ACCESS 在
NSString *path = [ExportoutputURL absoluteString];
回答by Peter Hosey
Is it possible to convert NSUrl in to NSString for video file path.
是否可以将 NSUrl 转换为视频文件路径的 NSString。
Yes. Send it an absoluteString
message.
是的。给它absoluteString
发消息。
i have try to use NSString *path = [ExportoutputURL absoluteString]; but it crash.
我尝试使用 NSString *path = [ExportoutputURL absoluteString]; 但它崩溃了。
If you want a path, send the URL a path
message. A string representing a URL is generally not a valid path; if you want a path, ask it for one.
如果需要路径,请向 URL 发送path
消息。表示 URL 的字符串通常不是有效路径;如果你想要一条路,就向它索要一条。
As for the crash, it does not mean absoluteString
is wrong. Sending absoluteString
to an NSURL object is the correct way to get an NSString object that represents the URL. The problem is somewhere else.
至于崩溃,并不意味着absoluteString
是错误的。发送absoluteString
到 NSURL 对象是获取表示 URL 的 NSString 对象的正确方法。问题出在其他地方。
Error EXC_BAD_ACCESS at
NSString *path = [ExportoutputURL absoluteString];
错误 EXC_BAD_ACCESS 在
NSString *path = [ExportoutputURL absoluteString];
This probably means that ExportoutputURL
points to something that is not nil
but is also not a valid object. It might have pointed to an NSURL object at some point, but it doesn't now.
这可能意味着ExportoutputURL
指向不是nil
但也不是有效对象的东西。它可能在某个时候指向了一个 NSURL 对象,但现在没有。
My guess would be that the problem is this:
我的猜测是问题是这样的:
ExportoutputURL = session.outputURL;
ExportoutputURL = session.outputURL;
You assign the URL to the ExportoutputURL
instance variable, but you don't retain the object or make your own copy. Therefore, you don't own this object, which means you are not keeping it alive. It may die at any time, most probably after this method (exportDidFinish:
) returns.
您将 URL 分配给ExportoutputURL
实例变量,但不保留对象或制作自己的副本。因此,您不拥有此对象,这意味着您没有使其保持活动状态。它可能随时死亡,最有可能是在此方法 ( exportDidFinish:
) 返回之后。
The crash is because you call uploadVideoFile
later, after the URL object has already died. You still have a pointer to it, but that object no longer exists, so sending a message to it—anymessage—causes a crash.
崩溃是因为您uploadVideoFile
稍后调用,在 URL 对象已经死亡之后。你仍然有一个指向它的指针,但那个对象不再存在,所以向它发送消息——任何消息——都会导致崩溃。
There are three simple solutions:
有三个简单的解决方案:
- Retain the URL object when you assign it to your instance variable.
- Make your own copy of the URL object and assign that to the instance variable.
- Declare
ExportoutputURL
as a property, with either thestrong
keyword or thecopy
keyword, and assign the object to the property, notthe instance variable. That will call the property's setter, which, if you synthesize it or implement it correctly, will retain or copy the URL for you.
- 将 URL 对象分配给实例变量时保留它。
- 创建您自己的 URL 对象副本并将其分配给实例变量。
ExportoutputURL
使用strong
关键字或copy
关键字声明为属性,并将对象分配给属性,而不是实例变量。这将调用属性的 setter,如果您合成或正确实现它,它将为您保留或复制 URL。
Either way, you will own the object, and that will keep it alive until you release it. Accordingly, you will need to release it when you are done with it (in dealloc
, if not earlier), so that you don't leak it.
无论哪种方式,您都将拥有该对象,这将使其保持活动状态,直到您将其释放。因此,您需要在完成后释放它(dealloc
如果不是更早的话),这样就不会泄漏它。
This all assumes that you are not using ARC. If you are using Xcode 4.2 or later, and can require iOS 4 or later, you should migrate your project to ARC, as it makes so many things much simpler. You would not need to retain or copy this object if you were using ARC, which means that migrating to ARC now is a fourth solution (but certainly a larger-scale one).
这一切都假设您没有使用 ARC。如果您使用的是 Xcode 4.2 或更高版本,并且可能需要 iOS 4 或更高版本,您应该将您的项目迁移到 ARC,因为它使许多事情变得更加简单。如果您使用 ARC,则不需要保留或复制此对象,这意味着现在迁移到 ARC 是第四种解决方案(但肯定是更大规模的解决方案)。
回答by nishanths
Use either absolutePath
or path
as mentioned by Miekand Nepster. Expanding on their answers, the difference between lies in the prefix.
使用Miek和Nepster提到的absolutePath
或。扩展他们的答案,两者之间的区别在于前缀。path
NSString* string1 = [url absoluteString]; // @"file:///Users/Hymanbrown/Music/song name.mp3"
NSString* string2 = [url path]; // @"/Users/Hymanbrown/Music/song name.mp3"`
回答by Miek
NSString *path = [[NSString alloc] initWithString:[url path]]; ?
回答by Jawad Zeb
Simply you can do it like this.
简单地你可以这样做。
NSString *myString = [myURL absoluteString];
回答by Atanu Mondal
Use this. I think it will help you.
用这个。我认为它会帮助你。
In Objective c
在目标 c
NSString *testString = testUrl.absoluteString;
In Swift
在斯威夫特
var testString : String = testUrl.absoluteString