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

时间:2013-02-18 15:54:31

标签: ios objective-c appdelegate ios6.1

我的应用可以读取使用“打开方式...”对话框打开的.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
  

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

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

如果我重复这些步骤(应用程序在后台打开),则找不到文件,它会立即生效。 这是为什么?

2 个答案:

答案 0 :(得分:4)

您应该只在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:):

  

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

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

答案 1 :(得分:1)

您应该在application:didFinishLaunchingWithOptions:期间处理“打开方式...”,方法是使用options密钥从UIApplicationLaunchOptionsURLKey词典中获取网址,而不是直接传递给url application:openUrl:sourceApplication:annotations

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