Запустите приложение с помощью URL, но OpenUrl не вызывается
я реализовал схему URL и использую ее для передачи данных в мое приложение путем вызова метода. Весь код показан ниже
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
// Check the calling application Bundle ID
if ([[url scheme] isEqualToString:@"yuvitime"])
{
NSLog(@"URL scheme:%@", [url scheme]);
NSString * yuvitimeRequestValue = [url query];
NSDictionary * userInfor = [[NSDictionary alloc]initWithObjectsAndKeys:yuvitimeRequestValue, @"YuvitimeRequest", nil];
NSNotificationCenter * notificationCentre = [NSNotificationCenter defaultCenter];
[notificationCentre postNotificationName:@"URLSCHEMEACTIVATEDNOTIFICATION" object:self userInfo:userInfor];
return YES;
}
else
return NO;
}
если мое приложение находится в фоновом режиме, все работает нормально. Когда вы нажимаете URL-адрес, приложение возвращается на передний план, и URL-адрес обрабатывается как закодированный в вышеуказанной функции.
однако, если приложение завершается (приложение еще не запущено), щелкнув URL-адрес, оно запускает приложение только без вызова функции обработки, которая показанный выше.
после поиска, лучший результат, который мне удается получить это
применение:WillFinishLaunchingWithOptions:
при запросе на открытие URL-адреса результат возврата из этого метода сочетается с результатом возврата из application:didFinishLaunchingWithOptions:
метод, чтобы определить, следует ли обрабатывать URL-адрес. Если любой из методов возвращает NO, система не вызывает application:openURL:options
: метод. Если вы не реализуете один из методов, только возвращаемое значение рассматривается реализованный метод.
- применение: didFinishLaunchingWithOptions:
этот метод представляет ваш последний шанс обработать любые ключи в словаре launchOptions. Если вы не оценили ключи в своем application:willFinishLaunchingWithOptions:
метод, вы должны посмотреть на них в этом методе и предоставить соответствующий ответ.
Объекты, которые не являются делегатом приложения, могут получить доступ к тем же значениям словаря launchOptions, наблюдая уведомление с именем UIApplicationDidFinishLaunchingNotification
и доступ к словарю userInfo уведомления. Это уведомление отправляется вскоре после возвращения этого метода.
Результат возврата из этого метода сочетается с результатом возврата из application:willFinishLaunchingWithOptions:
метод, чтобы определить, следует ли обрабатывать URL-адрес. Если любой из методов возвращает NO, URL-адрес не обрабатывается. Если вы не реализуете один из методов, учитывается только возвращаемое значение реализованного метода.
несмотря на объяснение, я до сих пор не знаю, как это сделать и я не смог найти ничего конкретного в интернете.
спасибо
в отношении
5 ответов
Я согласен с Калояном," handleOpenURL " никогда не вызывается при запуске приложения. Таким образом, вы должны проверить URL-адрес в "launchOptions" в didFinishLaunchingWithOptions.
Я принял то же решение, что и Apple пример кода для QuickActions (3D Touch). Я сохраняю URL при запуске в переменной, и я обрабатываю его в applicationDidBecomeActive:.
@interface MyAppDelegate ()
@property (nonatomic, strong) NSURL *launchedURL;
@end
@implementation MyAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.launchedURL = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
...
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if (self.launchedURL) {
[self openLink:self.launchedURL];
self.launchedURL = nil;
}
}
- (BOOL) application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
NSURL *openUrl = url;
if (!openUrl)
{
return NO;
}
return [self openLink:openUrl];
}
- (BOOL)openLink:(NSURL *)urlLink
{
...
}
@end
Привет, когда приложение не запускается раньше, метод "handleOpenURL" никогда не вызывается. Вы должны проверить " launchOptions "в didFinishLaunchingWithOptions для объекта с ключом"UIApplicationLaunchOptionsURLKey"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
//call function to handle the url like in handleURL, but do not call handleURL directly
}
Я считаю, что лучше ответить сейчас,
-
application:handleOpenURL:
-
application:openURL:sourceApplication:annotation:
Оба они устарели в ios 9. Предложение Apple:
использовать .
application:openURL:options:
имеет другое поведение, чем старые, так как он будет выполнен в случае, если приложение было в фоновом режиме или запуск.
Итак, вам нужно обработать открытие URL-адреса в нем только. как ниже:
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<NSString *,id> *)options {
// Check the calling application Bundle ID
if ([[url scheme] isEqualToString:@"yuvitime"])
{
NSLog(@"URL scheme:%@", [url scheme]);
NSString * yuvitimeRequestValue = [url query];
NSDictionary * userInfor = [[NSDictionary alloc]initWithObjectsAndKeys:yuvitimeRequestValue, @"YuvitimeRequest", nil];
NSNotificationCenter * notificationCentre = [NSNotificationCenter defaultCenter];
[notificationCentre postNotificationName:@"URLSCHEMEACTIVATEDNOTIFICATION" object:self userInfo:userInfor];
return YES;
}
else
return NO;
}
для iOS 10, используйте
func application(_ app: UIApplication,
open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
Swift 2.x
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
if (url.scheme == "yuvitime") {
print("URL scheme:\(url.scheme)")
let yuvitimeRequestValue = url.query!
let userInfor = [
"YuvitimeRequest" : yuvitimeRequestValue
]
let notificationCentre = NSNotificationCenter.defaultCenter()
notificationCentre.postNotificationName("URLSCHEMEACTIVATEDNOTIFICATION", object: self, userInfo: userInfor)
return true
}
else {
return false
}
}