【问题标题】:Validating URL from drag and drop in a sandbox通过沙箱中的拖放验证 URL
【发布时间】:2017-10-25 12:14:24
【问题描述】:

考虑到file access in a sandboxed osx app with swift,它是否与通过 Finder 或其他应用程序提供的 URL 一样工作?

由于没有 NSOpenPanel 调用来提供本示例中的文件夹访问权限,只有 url - 我认为文件夹访问是隐式的,因为用户从源/桌面“文件夹”拖动文件与通过打开的隐式选择大致相同对话框。

我尚未开始沙盒迁移,但想验证我的想法是否准确,但这里有一个候选例程在沙盒模式下工作:

func performDragOperation(_ sender: NSDraggingInfo!) -> Bool {
    let pboard = sender.draggingPasteboard()
    let items = pboard.pasteboardItems

    if (pboard.types?.contains(NSURLPboardType))! {
        for item in items! {
            if let urlString = item.string(forType: kUTTypeURL as String) {
                self.webViewController.loadURL(text: urlString)
            }
            else
            if let urlString = item.string(forType: kUTTypeFileURL as String/*"public.file-url"*/) {
                let fileURL = NSURL.init(string: urlString)?.filePathURL
                self.webViewController.loadURL(url: fileURL!)
            }
            else
            {
                Swift.print("items has \(item.types)")
            }
        }
    }
    else
    if (pboard.types?.contains(NSPasteboardURLReadingFileURLsOnlyKey))! {
        Swift.print("we have NSPasteboardURLReadingFileURLsOnlyKey")
    }
    return true
}

因为没有 URL 被执行或抛出错误。

【问题讨论】:

    标签: macos swift3 drag-and-drop appstore-sandbox nspasteboard


    【解决方案1】:

    是的,文件访问是隐式的。由于沙盒实现的文档记录很差并且有/有很多错误,因此您需要解决 URL 和文件名。视图应该在初始化时为这两种类型注册自己。代码在 Objective-C 中,但 API 应该相同。

        [self registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, NSURLPboardType, nil]];
    

    然后在 performDragOperation 上:

    - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
    {
        BOOL dragPerformed = NO;
        NSPasteboard *paste = [sender draggingPasteboard];
        NSArray *typesWeRead = [NSArray arrayWithObjects:NSFilenamesPboardType, NSURLPboardType, nil];
        //a list of types that we can accept
        NSString *typeInPasteboard = [paste availableTypeFromArray:typesWeRead];
    
        if ([typeInPasteboard isEqualToString:NSFilenamesPboardType]) {
            NSArray *fileArray = [paste propertyListForType:@"NSFilenamesPboardType"];
            //be careful since this method returns id.  
            //We just happen to know that it will be an array. and it contains strings.
            NSMutableArray *urlArray = [NSMutableArray arrayWithCapacity:[fileArray count]];
            for (NSString *path in fileArray) {
                [urlArray addObject:[NSURL fileURLWithPath:path]];
            }
            dragPerformed = //.... do your stuff with the files;
        } else if ([typeInPasteboard isEqualToString:NSURLPboardType]) {
            NSURL *droppedURL = [NSURL URLFromPasteboard:paste];
            if ([droppedURL isFileURL]) {
                dragPerformed = //.... do your stuff with the files;
            }
        }
        return dragPerformed;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-28
      • 2016-10-26
      • 1970-01-01
      • 2023-04-05
      • 2014-02-11
      • 1970-01-01
      • 2019-11-06
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多