Как обработать пользовательский URL в уже открытом приложении? - PullRequest
0 голосов
/ 07 апреля 2011


У меня есть приложение на основе шаблона Utility (т.е. контроллеры основного и флип-вида).Перевернутый вид позволяет выбрать определенный элемент для использования на главном экране.Пока - отлично работает.

Теперь я попытался добавить пользовательский URL.Кое-что с эффектом: myapp://itemID=40, которое в основном скажет основному представлению: «не нужно переворачивать - вы будете иметь дело с пунктом 40».

Я зарегистрировал схему типа URL как «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 в случае отсутствия URL:

- (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 ]

3 голосов
/ 06 декабря 2011

Я бы взглянул на документы по протоколу UIApplicationDelegate, в частности;

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

И это устарело.

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
1 голос
/ 07 апреля 2011

Ну, определенно не в методе, который вызывается только один раз при запуске приложения!Вам необходимо реорганизовать код обработки элемента в его собственный метод, а затем вызывать этот метод из viewDidLoad (один раз при запуске) и handleOpenURL при каждом вызове.

...