如果应用程序尚未打开,则“打开方式...”问题

Posted

技术标签:

【中文标题】如果应用程序尚未打开,则“打开方式...”问题【英文标题】:"Open with..." issue if app is not already open 【发布时间】:2013-02-03 02:41:56 【问题描述】:

我的应用可以读取使用“打开方式...”对话框打开的 .txt 文件。我在两个中都实现了我的读取功能

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

方法。

有趣的是,它似乎只有在应用程序之前打开时才有效。如果我在即邮件中打开一个 .txt 文件并选择“打开方式”然后是我的应用程序。我可以在控制台中看到

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

被调用。我还可以看到正确文件的 URL,该文件可能位于

file://localhost/private/var/mobile/Applications/F15C57D0-4F62-4979-943A-2D387488D59C/Documents/Inbox/myFile.txt

但是当我尝试打开文件时,我得到一个文件不存在的 Cocoa 错误。

如果我重复这些步骤(在后台打开应用程序),则找到该文件并立即运行。 这是为什么呢?

【问题讨论】:

你是指openUrl:url的url还是application:didFinishLaunchingWithOptions:的options字典中UIApplicationLaunchOptionsURLKey键指定的值? 如果您的应用尚未运行,您将收到带有选项字典中 URL 的 application:didFinishLaunchingWithOptions: 消息,然后您将收到 application:openURL:sourceApplication:annotation:信息。确保您没有在第一种方法中删除文件,然后期望在调用第二种方法时它仍然存在。 这可能是问题所在。我在didFinishLaunchingWithOptionsapplication:openURL 之后删除了文件,然后没有找到任何东西。我现在只处理application:openURL 中的文件,它似乎工作正常。 谢谢@rob mayoff。这对我来说也确实如此。我在启动时的清理过程中删除了文件。 【参考方案1】:

您应该只在application:openUrl:sourceApplication:annotations 处理此案。根据文档(https://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIApplicationDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:openURL:sourceApplication:annotation:):

如果您的应用必须启动才能打开 URL,应用首先调用 application:willFinishLaunchingWithOptions:application:didFinishLaunchingWithOptions: 方法,然后调用此方法。这些方法的返回值可用于防止调用此方法。 (如果应用程序已经在运行,则只调用此方法。)

因此,不再需要处理 application:didFinishLaunchingWithOptions: 中的打开文件了。

【讨论】:

正是我需要知道的,方法调用的顺序,我在别处找不到。【参考方案2】:

您应该在application:didFinishLaunchingWithOptions: 期间通过使用UIApplicationLaunchOptionsURLKey 键从options 字典中获取URL 来处理“打开方式...”,而不是直接在application:openUrl:sourceApplication:annotations 中传递的url

https://developer.apple.com/library/ios/#documentation/FileManagement/Conceptual/DocumentInteraction_TopicsForIOS/Articles/OpeningSupportedFileTypes.html#//apple_ref/doc/uid/TP40010412-SW1

【讨论】:

但是我该如何处理对已经在后台打开的应用程序的调用呢? application:didFinishLaunchingWithOptions 不会再次被调用,对吧?

以上是关于如果应用程序尚未打开,则“打开方式...”问题的主要内容,如果未能解决你的问题,请参考以下文章

如何修改在钉钉里的默认打开方式?

OpenID Connect,如果尚未登录,则无需登录表单即可重定向?

如果我使用“打开方式”,C# WPF 应用程序会静默崩溃

在“打开方式”菜单中显示应用程序……如果是来自 Microsoft 应用程序的文件附件

如果用户尚未登录,则用户登录的弹出窗口

BOM操作