web-dev-qa-db-ja.com

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をクリックしてアプリが終了した場合(アプリがまだ起動されていない場合)は、上記の処理関数を呼び出さずにアプリを起動するだけです。

検索した後、私が得ることができる最高の結果はこれです

application:WillFinishLaunchingWithOptions:URLを開くように要求された場合、このメソッドからの戻り結果はapplication:didFinishLaunchingWithOptions:メソッドからの戻り結果と組み合わされて、URL処理する必要があります。いずれかのメソッドがNOを返す場合、システムはapplication:openURL:options:メソッドを呼び出しません。メソッドのいずれかを実装しない場合、実装されたメソッドの戻り値のみが考慮されます。

-application:didFinishLaunchingWithOptions:このメソッドは、launchOptions辞書のキーを処理する最後の機会を表します。 application:willFinishLaunchingWithOptions:メソッドでキーを評価しなかった場合、このメソッドでキーを調べて、適切な応答を提供する必要があります。アプリのデリゲートではないオブジェクトは、UIApplicationDidFinishLaunchingNotificationという名前の通知を確認し、通知のuserInfoディクショナリにアクセスすることで、同じlaunchOptionsディクショナリ値にアクセスできます。この通知は、このメソッドが戻った直後に送信されます。このメソッドからの戻り結果は、application:willFinishLaunchingWithOptions:メソッドからの戻り結果と組み合わされて、URLを処理する必要があるかどうかを判断します。いずれかのメソッドがNOを返す場合、URLは処理されません。メソッドのいずれかを実装しない場合、実装されたメソッドの戻り値のみが考慮されます。

説明にもかかわらず、私はまだそれを行う方法を知らず、具体的なオンラインで何かを見つけることができませんでした。

ありがとう

よろしく

22

Kaloyanに同意します。「handleOpenURL」はアプリケーションの起動時に呼び出されません。したがって、didFinishLaunchingWithOptionsの「launchOptions」でURLを確認する必要があります。

しかしながら

QuickActions(3D Touch)にApple example code と同じソリューションを採用しました。変数、および 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
29
vmeyer

私は今、より良い答えがあると信じています、

  • application:handleOpenURL:
  • application:openURL:sourceApplication:annotation:両方はios 9で非推奨です。Apple提案は次のとおりです。

つかいます application:openURL:options:代わりに。

application:openURL:options:は、アプリがバックグラウンドまたは起動しますの場合に実行されるため、古いものとは異なる動作をします。

そのため、内部で開くURLを処理する必要がありますonly。以下のように:

- (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;
}
8
Ismail

こんにちは、アプリが以前に起動されていない場合、メソッド「handleOpenURL」は呼び出されません。キー「UIApplicationLaunchOptionsURLKey」を持つオブジェクトのdidFinishLaunchingWithOptionsで「launchOptions」を確認する必要があります

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

}
8
Kaloyan Dobrev

IOS 10の場合、使用

func application(_ app: UIApplication,
open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
6
ycwjjjj

私にとっては、application(_:open options:)outside AppDelegate {}スコープを作成しないでください????

0
hstdt