如何在已打开的应用程序中处理自定义URL?

时间:2011-04-07 06:37:31

标签: iphone objective-c uiviewcontroller custom-url


我有一个基于Utility模板的应用程序(即Main和Flip视图控制器)。翻转视图允许选择要在主视图上使用的特定项目。到目前为止 - 效果很好。

现在我尝试添加自定义网址。一些效果:myapp://itemID=40基本上会告诉主视图:“无需翻转 - 你将处理第40项。”

我将网址类型方案注册为“myapp”,并将以下方法添加到应用代理中:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    if (!url) {  
        return NO; 
    }

    NSString *urlString = [url absoluteString];
    NSLog(@"URL received: %@", urlString);
    NSString *itemID = [urlString stringByReplacingOccurrencesOfString:@"myapp://itemID=" withString:@""];
    NSLog(@"Item received: %@", itemID);
    [_mainViewController setStartupItem:itemID]; 
    return YES;
}

如您所见,itemID设置为startupItem中名为mainViewController的媒体资源。

然后我在常规application方法中添加了一行,以验证在没有网址的情况下startupItem将是nil

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Make sure URL string is empty
    [_mainViewController setStartupItem:nil];

    // Override point for customization after application launch.
    // Add the main view controller's view to the window and display.
    self.window.rootViewController = self.mainViewController;
    [self.window makeKeyAndVisible];
    return YES;
}

在MainViewController.m中,我添加了代码来处理viewDidLoad事件的项目。

这就是我的问题:如果应用程序是第一次从URL启动,这个方案效果很好。如果它已经在运行,那么我们永远不会再次到达viewDidLoad,因此不会处理该特定项目,而是继续,就像没有通过一样。

我的谦虚问题是:UIViewController我应该处理我的处理代码?或者,我是否以错误的方式接近这一切?应该在我的模型中处理吗?

一如既往,提前感谢您的时间!

2 个答案:

答案 0 :(得分:3)

我会看一下UIApplicationDelegate协议的文档,特别是

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

这是不推荐使用的。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

答案 1 :(得分:1)

绝对不是在应用程序启动时只调用一次的方法!您需要在自己的方法中重构项处理代码,然后从viewDidLoad(启动期间一次)调用此方法,并在每次调用它时调用handleOpenURL。