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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-30 16:19:29  来源:igfitidea点击:

How to convert NSUrl to NSString?

objective-cioscocoa-touchcocoa

提问by RAGOpoR

After AVAssetExportSessionhas 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 absoluteStringmessage.

是的。给它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 pathmessage. 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 absoluteStringis wrong. Sending absoluteStringto 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 ExportoutputURLpoints to something that is not nilbut 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 ExportoutputURLinstance 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 uploadVideoFilelater, 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:

有三个简单的解决方案:

  1. Retain the URL object when you assign it to your instance variable.
  2. Make your own copy of the URL object and assign that to the instance variable.
  3. Declare ExportoutputURLas a property, with either the strongkeyword or the copykeyword, 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.
  1. 将 URL 对象分配给实例变量时保留它。
  2. 创建您自己的 URL 对象副本并将其分配给实例变量。
  3. 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 absolutePathor pathas mentioned by Miekand Nepster. Expanding on their answers, the difference between lies in the prefix.

使用MiekNepster提到的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