Запустите приложение с помощью 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
        }

    }