虽然很明显我们无法在iOS上检索已安装的应用程序列表,但是有什么技巧可以让我们确定为给定文件类型注册的应用程序列表吗?也就是说,用户将在Open In ...菜单中看到该特定文件类型的列表.canOpenURL只返回一个布尔值,但理想情况下它会返回一个受支持的已安装应用程序列表.有任何想法吗?
在iOS 6中,点击Photos应用程序中的操作按钮会显示标准的UIActivityViewController:

从Messages中执行相同操作会提供一组不同的选项.这看起来像是在使用UIDocumentInteractionController api来拉取所有可以处理图像的应用程序.

我的问题是双重的:
如何进入"消息"操作菜单?Tumblr和Halftone,仅举几例,已经做到了......我似乎无法找到文档.
如何显示消息样式的操作菜单?当我呈现一个UIActivityViewController它没有那些选项...只是标准设置facebook/twitter/copy/print/save to camera roll/etc.
谢谢!
sharing ios uidocumentinteraction uidocument uiactivityviewcontroller
我的应用程序最初有一个标准的操作表,显示正在查看的PDF的电子邮件和打印选项.我使用Google Analytics跟踪了这些事件.
我现在用UIDocumentInteractionController替换了操作表,以允许在外部应用程序中打开PDF.这很好,但似乎没有办法跟踪我的Google Analytics的电子邮件和打印事件.我可以轻松跟踪使用哪个应用程序打开
- (void)documentInteractionController:(UIDocumentInteractionController *)controller willBeginSendingToApplication:(NSString *)application
Run Code Online (Sandbox Code Playgroud)
似乎没有可用于跟踪电子邮件,打印,复制等的等效功能.是否有人知道如何确定是否单击了这些按钮,或确定是否触发了其中一个特定事件?
我目前正在使用 UIDocumentInteractionController 来打开功能。当它打开时,它会显示设备上可以处理该文件类型的所有应用程序的列表。
有没有办法禁用我的应用程序向特定应用程序发送文档,即使它们支持该文件类型?例如 - 如果我在我的应用程序中打开了一个 PDF 文件并且 iBooks 在 iPad 上,如果我点击 UIDocumentInteractionController 中的 iBooks 图标,我不希望它发送到应用程序。
理想情况下 - 我认为这是建立一个黑名单(或白名单)。例如,这样做会很棒:
- (void) documentInteractionController: (UIDocumentInteractionController *) controller willBeginSendingToApplication: (NSString *) application {
// if app is blacklisted
if ([application isEqualToString:@"com.schimera.WebDAVNavigator"]) {
[self.interactionController dismissMenuAnimated:YES];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"FAIL" message:@"NO" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
return
}
}
Run Code Online (Sandbox Code Playgroud)
但是,即使文件被“列入黑名单”,该文件仍会发送到应用程序。
这种方法可能吗?
干杯!
我正在使用UIDocumentInteractionController发送带有PDF附件的电子邮件,如下所示:
我首先展示PDF文件
-(void)showPDFFile
{
NSURL *url = [NSURL fileURLWithPath:_filePath];
if (url) {
_documentInteractionController =
[UIDocumentInteractionController interactionControllerWithURL:url];
[_documentInteractionController setDelegate: self];
[_documentInteractionController presentPreviewAnimated:YES];
}
}
- (UIDocumentInteractionController *)setupControllerWithURL:(NSURL *)fileURL
usingDelegate:(id <UIDocumentInteractionControllerDelegate>)interactionDelegate {
UIDocumentInteractionController *interactionController =
[UIDocumentInteractionController interactionControllerWithURL: fileURL];
[interactionController setDelegate: interactionDelegate];
return interactionController;
}
Run Code Online (Sandbox Code Playgroud)
显示PDF文件时,用户单击"导出"选项,将显示iOS的"打开方式"视图.
现在单击该电子邮件会打开一个View Controller,准备发送电子邮件.
如何以编程方式设置To:CC/BCC和Subject字段?
谢谢!
我已经设法打开一个本地存储的ics文件,并且UIDocumentInteractionController将该文件识别为UTI com.apple.ical.ics(这是预期的)。数据显示了我所希望的大部分情况:

我对文档的印象是,UIDocumentInteractionController它将自动识别此ics文件类型并提供一些与日历相关的选项,但是,似乎没有任何方法可以从此视图将这些事件添加到日历中。在“打开方式”菜单下,我将邮件和保管箱视为选项,但未将日历作为选项。如果我通过电子邮件将其发送给自己,则可以从邮件应用中添加事件。我是否缺少这种观点的工作方式?Mobile Safari以类似的方式处理ics文件,除了在标题栏中有一个“全部添加”按钮。这正是我认为的行为方式。我现在不希望使用EventKit,因为我只是想模仿Safari处理文件的方式。
我有一个PDF文件保存在文档目录中.该文件的路径存储在NSString属性"self.URL"中.这是我提供活动项目的代码:
-(void)presentDocumentInteractionController{
self.docController = [UIDocumentInteractionController interactionControllerWithURL:self.URL];
self.docController.delegate = self;
[_docController setUTI:@"com.adobe.pdf"];
[_docController presentOptionsMenuFromBarButtonItem:self.activityBarButton animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
在iOS 8之前,这段代码运行良好.向用户呈现了诸如打印,复印和电子邮件之类的项目列表以供选择.升级到iOS 8/XCode 6之后,我收到了这个运行时错误(它没有崩溃应用程序):
Unknown activity items supplied: (
"<UITextViewPrintFormatter: 0x7f908ba53ca0>"
)
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
objective-c ios uidocumentinteraction uiactivityviewcontroller
根据文档https://www.whatsapp.com/faq/en/iphone/23559013,将文件格式设置为 .wai 并将 UTI 设置为 net.whatsapp.image 只会在应用程序列表中显示 Whatsapp,
但它显示了其他应用程序,如添加到笔记,信使也与 whatsapp 选项一起。
if let imageData = UIImageJPEGRepresentation(image, 1.0)
{
let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let documentsDir: AnyObject = path[0]
let imagePath = documentsDir.stringByAppendingPathComponent("Main")
NSFileManager.defaultManager().createDirectoryAtPath(imagePath, withIntermediateDirectories: true, attributes: nil)
let tempFile = NSURL(fileURLWithPath: imagePath+"/image.wai")
do
{
try imageData.writeToURL(tempFile, options: .DataWritingAtomic)
self.documentController = UIDocumentInteractionController(URL: tempFile)
self.documentController.UTI = "net.whatsapp.image"
self.documentController.presentOpenInMenuFromRect(self.view.frame, inView: self.view, animated: true)
}
catch
{
// alert
}
}
Run Code Online (Sandbox Code Playgroud)
请建议我是否在这里做错了什么
UIDocumentInteractionController 不适用于具有多个页面的大型 pdf 文件。
在我的代码中,
var docController:UIDocumentInteractionController!
Run Code Online (Sandbox Code Playgroud)
...
DispatchQueue.main.async (execute: { [weak self] in
self?.docController = UIDocumentInteractionController(url: pdfFileURL!)
self?.docController.delegate = self
self?.docController.name = pdfFileURL?.lastPathComponent
self?.docController.presentPreview(animated: true)
})
Run Code Online (Sandbox Code Playgroud)
和委托方法,
func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {
return self
}
Run Code Online (Sandbox Code Playgroud)
这是控制台中的警告,
2017-05-26 12:46:51.178894 MyApp [3350:1136818] [默认]查看服务确实终止并出现错误:错误域=_UIViewServiceInterfaceErrorDomain代码= 3“(null)”UserInfo = {Message =服务连接中断}#Remote
下面附上空白图片,
请帮帮我谢谢。
我使用 UIDocumentInteractionController 全屏显示图像,自从升级到 xcode 13 以来,iOS 15 设备在执行[_documentInteractionController presentPreviewAnimated:YES];. 所有其他导航栏都很好。
这就是代表的样子
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller
{
UINavigationController* navController = [self navigationController];
navController.navigationBar.tintColor = [UIColor primaryColor];
navController.navigationBar.barTintColor = [UIColor primaryColor];
navController.view.backgroundColor = [UIColor primaryColor];
return navController;
}
Run Code Online (Sandbox Code Playgroud)
我最接近解决问题的方法是在代表中执行此操作
UINavigationBarAppearance *app = [UINavigationBarAppearance new];
[app configureWithOpaqueBackground];
app.backgroundColor = UIColor.redColor;
[[UINavigationBar appearance] setBarStyle: UIBarStyleBlack];
navController.navigationBar.standardAppearance = app;
navController.navigationBar.translucent = NO;
Run Code Online (Sandbox Code Playgroud)
然而,酒吧保持半透明。这是结果,颜色应该是红色。
设置navController.navigationBar.translucent = NO;似乎没有什么区别。
ios ×10
objective-c ×4
cocoa-touch ×1
email ×1
events ×1
ios15 ×1
ipad ×1
iphone ×1
printing ×1
sharing ×1
swift ×1
uidocument ×1
uikit ×1
whatsapp ×1
xcode ×1