Как управлять методом 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"];
}