如果应用程序尚未打开,则“打开方式...”问题
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:
信息。确保您没有在第一种方法中删除文件,然后期望在调用第二种方法时它仍然存在。
这可能是问题所在。我在didFinishLaunchingWithOptions
和application: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,如果尚未登录,则无需登录表单即可重定向?