Как управлять методом openUrl внутри вызываемого приложения в iOS?

Я предполагаю, что это дубликат, но я не могу понять это.

Я должен вызвать другое приложение из моего приложения iOS, используя openUrl метод. После завершения работы другое приложение должно вернуться в мое приложение тем же способом. Я выясняю, как вызвать другое приложение и открыть его тоже. Моя проблема в том, как перехватить возврат в мое приложение. Мне нужно проверить значение из строки запроса.

Я нахожу этот метод handleOpenURL перехватывает возврат, и я могу обработать мою строку запроса.

И вот я застрял - как использовать эту информацию внутри моего ViewController? Я установил точку останова в viewDidLoad но он не был поражен. Какой метод я должен использовать?

РЕДАКТИРОВАТЬ:

Мой код (внутри AppDelegate):

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    NSLog(@"url recieved: %@", url);
    NSLog(@"query string: %@", [url query]);
    NSLog(@"host: %@", [url host]);
    NSLog(@"url path: %@", [url path]);
    NSDictionary *dict = [self parseQueryString:[url query]];
    NSLog(@"query dict: %@", dict);

    return YES;
}

- (NSDictionary *)parseQueryString:(NSString *)query {
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:6];
    NSArray *pairs = [query componentsSeparatedByString:@"&"];

    for (NSString *pair in pairs) {
        NSArray *elements = [pair componentsSeparatedByString:@"="];
        NSString *key = [[elements objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSString *val = [[elements objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

        [dict setObject:val forKey:key];
    }
    return dict;
}

Который работает отлично.

Внутри моего ViewController (VC):

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self setNeedsStatusBarAppearanceUpdate];

    // Instantiate App singleton
    singApp = [PESsingApplication sharedInstance];

    @try {

        // Localize resources using currently saved setting for language
        [self setLocalizedResources];

        // Init visual buttons
        [self baseInit];

        // Add code for keyboard management
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardShow:)
                                                     name:UIKeyboardWillShowNotification
                                                   object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardHide:)
                                                     name:UIKeyboardWillHideNotification
                                                   object:nil];

        CGRect screenRect = [[UIScreen mainScreen] bounds];
        _screenHeight = screenRect.size.height;
        _screenWidth = screenRect.size.width;

    }
    @catch (NSException *exception) {
        [self throwUnknownException:exception];
    }
}

-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent;
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

Мой URL:

Идентификатор URL: xx.mydomain.MyUrlScheme

URL-адреса: MyUrlScheme

У меня есть точки останова внутри моего VC (на каждом из методов, показанных выше).

Я использую следующую строку для вызова другого приложения: @"otherApp://openApp?param1=value1&callbackUrl=MyUrlScheme";

Они звонят мне из другого приложения, используя callbackUrl пары.

3 ответа

Решение

Если твой viewDidLoad не называется отлично попробуй в viewWillAppear или же viewDidAppear метод.

Например, цель:

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

NSDictionary *dict = [self parseQueryString:[url query]];
NSLog(@"query dict: %@", dict);

// add dictionary to standardUserDefaults for saving purpose, like 

 [[NSUserDefaults standardUserDefaults] setObject:dict forKey:@"DicKey"]; 
 [[NSUserDefaults standardUserDefaults] synchronize];

// add code for navigation/present view controller

  UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" 
                                                         bundle: nil];
YourViewController *yourController = (YourViewController *)[mainStoryboard 
  instantiateViewControllerWithIdentifier:@"YourViewControllerID"];
self.window.rootViewController = yourController;

return YES;
}

для получения

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

NSMutableDictionary *mutableRetrievedDictionary = [[[NSUserDefaults standardUserDefaults] objectForKey:@"DicKey"] mutableCopy];

 // here parse the dictionary and do your work here, when your works is over 

 // remove the key of standardUserDefaults 

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"DicKey"];
 [[NSUserDefaults standardUserDefaults] synchronize];
}

Вам нужно сделать свой собственный URL, пожалуйста, посмотрите ниже

Как реализовать пользовательскую схему URL

Определение пользовательской схемы URL вашего приложения выполняется в файле Info.plist. Нажмите на последнюю строку в файле, а затем нажмите знак "+" справа, чтобы добавить новую строку. Выберите типы URL для нового элемента. После этого нажмите серую стрелку рядом с "Типы URL", чтобы отобразить "Элемент 0". Установите для вашего идентификатора URL уникальную строку - что-то вроде com.yourcompany.yourappname.

После того, как вы установили идентификатор URL, выделите эту строку, снова нажмите знак "+" и добавьте новый элемент для схем URL. Затем нажмите серую стрелку рядом с "Схемы URL", чтобы открыть "Элемент 0". Установите значение для элемента 0 в качестве имени вашей схемы URL.

Обработка пользовательских URL-вызовов

Чтобы ваше приложение отвечало, когда оно получает пользовательский URL-вызов, вы должны реализовать метод application:handleOpenURL в классе делегата приложения:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    // your code
}

Разбор пользовательского URL

URL состоит из нескольких частей:

Схема: // хост / путь запроса

Части URL-адреса могут быть получены с помощью объекта NSURL, который передается в приложение: метод handleOpenURL. Если у вас довольно простая схема именования URL и вы хотите разрешить доступ к определенным страницам / ключам, вы можете просто использовать имя хоста:

Значение пользовательского URL [хоста url]:

myapp://page1   page1
myapp://page2   page2
myapp://otherPage   otherPage

Чтобы передать данные в ваше приложение, вам нужно использовать строку запроса. Вот простой метод парсинга строки запроса по URL:

- (NSDictionary *)parseQueryString:(NSString *)query {
    NSMutableDictionary *dict = [[[NSMutableDictionary alloc] initWithCapacity:6] autorelease];
    NSArray *pairs = [query componentsSeparatedByString:@"&"];

    for (NSString *pair in pairs) {
        NSArray *elements = [pair componentsSeparatedByString:@"="];
        NSString *key = [[elements objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        NSString *val = [[elements objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

        [dict setObject:val forKey:key];
    }
    return dict;
}

Тестирование пользовательского URL

Вы можете легко проверить свою схему URL в симуляторе. Просто добавьте тестовую кнопку в одно из ваших представлений и реализуйте для него метод IBAction следующим образом:

- (IBAction)getTest:(id)sender {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"myappscheme://test_page/one?token=12345&domain=foo.com"]];
}

Затем в делегате приложения реализуйте метод application:handleOpenURL:

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    NSLog(@"url recieved: %@", url);
    NSLog(@"query string: %@", [url query]);
    NSLog(@"host: %@", [url host]);
    NSLog(@"url path: %@", [url path]);
    NSDictionary *dict = [self parseQueryString:[url query]];
    NSLog(@"query dict: %@", dict);
    return YES;
}

Наконец, если вы ищете способ получения ваших данных в любом месте, вы можете использовать эти два сценария. Вы можете просто использовать локальное уведомление или NSUserDefault

NSUserDefault

- (BOOL)application:(UIApplication *)application handleopenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
     NSUserDefaults *userDefaults=[[NSUserDefaults alloc] init];
     [userDefaults synchronize];
     NSString *status = [defaults stringForKey:@"any status"];
}

Локальное уведомление

- (BOOL)application:(UIApplication *)application handleopenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    if (localNotif == nil)
        return;
    localNotif.userInfo = [NSDictionary dictionaryWithObjectsAndKeys:VAL, @"value", nil];

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
}

Сохранить статус из другого приложения в NSUserdefaultsкогда ViewController вашего приложения запускает извлечение статуса в строку NSString NSUserdefaults и поднять его как предупреждение.

Позвоните handleopenURL в appdelegate

- (BOOL)application:(UIApplication *)application handleopenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
     NSUserDefaults *defaults=[[NSUserDefaults alloc] init];
     [defaults synchronize];
     NSString *status = [defaults stringForKey:@"status string from other app"];
}
Другие вопросы по тегам