URL を使用したアプリの起動 (UIApplicationDelegate の handleOpenURL 経由) は iOS 4 では機能しますが、iOS 3.2 では機能しません

StackOverflow https://stackoverflow.com/questions/3612460

質問

UIApplicationDelegateを実装しました

application:didFinishLaunchingWithOptions:

そして

application:handleOpenURL:

仕様によると、つまり、

application:didFinishLaunchingWithOptions:
returns YES 

そして

application:handleOpenURL: opens the URL. 

このコードは iOS 4 で動作します (どちらの場合でも、つまり、アプリが起動されたときと、サスペンド状態からアクティブになったとき)。ただし、このコードは iOS 3.2 では機能しません。

役に立ちましたか?

解決

私自身の質問に答えます。解決策を見つけるのに時間がかかり、かなりイライラしました。インターネットで検索すると、部分的な答えが見つかりますが、次の解決策を見つけるまでにはまだ時間がかかりました。これである程度の明確さが増すことを願っています。

まず、アプリの推奨動作は次のようになります (「 サポートされているファイルの種類を開く iOS リファレンス ライブラリ内):

  • 実装しないでください applicationDidFinishLaunching: (次のメモを参照してください) UIアプリケーションデリゲート).
  • 埋め込む application:didFinishLaunchingWithOptions: URL を確認し、開ける場合は YES を返し、そうでない場合は NO を返しますが、開かないでください。
  • 埋め込む application:handleOpenURL: URL を開き、成功した場合は YES を返し、そうでない場合は NO を返します。

iOS 4 では、URL をアプリに渡すと、次の 2 つの動作のいずれかになります。

  • アプリが起動した場合は、 application:didFinishLaunchingWithOptions: と呼ばれる application:handleOpenURL: との場合に呼び出されます application:didFinishLaunchingWithOptions: YESを返しました。
  • アプリが一時停止状態からアクティブになる場合は、 application:didFinishLaunchingWithOptions: は呼ばれませんが、 application:handleOpenURL: と呼ばれます。

ただし、iOS 3.2 では次のように表示されます。 application:handleOpenURL: 決して呼ばれません!iOS 3.2 では動作が異なるというヒントは、次の場所にあります。 URLリクエストの処理. 。そこでそれを見つけます application:handleOpenURL: の場合に呼び出されます application:didFinishLaunchingWithOptions: 実装されていませんが、 applicationDidFinishLaunching: が実装されています。しかし application:handleOpenURL: の場合は呼び出されません application:didFinishLaunchingWithOptions: が実装されています。

したがって、コードを 3.2 および 4.0 で動作させるための 1 つの解決策は次のとおりです。

  • の URL を開きます application:didFinishLaunchingWithOptions:, ただし、それを防ぐために NO を返します application:handleOpenURL: と呼ばれます。
  • の URL を開きます application:handleOpenURL:, 4.0 未満でアプリが一時停止状態だった場合に備えて。

この解決策は別の投稿で見つけましたが、iOS Ref Lib ドキュメントの推奨事項 (つまり、 application:didFinishLaunchingWithOptions:)。(その時点では、ドキュメント自体が矛盾していることに気づきませんでした)。

現在の iOS 4.0 の動作が将来の動作になると思います。私は次の解決策を好みます。

  • 実装しないでください applicationDidFinishLaunching:.
  • 埋め込む application:didFinishLaunchingWithOptions: URL を確認し、開ける場合は YES を返し、そうでない場合は NO を返しますが、開かないでください。3.2 を使用している場合は、URL を開きます。
  • 埋め込む application:handleOpenURL: URL を開き、成功した場合は YES を返し、そうでない場合は NO を返します。

要約すると、iOS 4 の動作を実装し、次の行を追加しました。 application:didFinishLaunchingWithOptions:

    if([[[UIDevice currentDevice] systemVersion] hasPrefix:@"3.2"]) {
        [self application:application handleOpenURL:url];
    }

これにより、コードが 3.2 で動作するようになります。

他のヒント

application:handleOpenURL:廃止されます。

のiOS 4.2の時点で、あなたはオープニングのURLのためにこれを使用することができます:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
        sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
<のp>ドキュメンテーションます:

https://developer.apple .COM /ライブラリ/ IOS /#DOCUMENTATION / UIKitに/リファレンス/ UIApplicationDelegate_Protocol /リファレンス/のreference.htmlする

Dropbox APIを使用したアプリケーションを書き始めました。概念を理解するために、dropbox/developer に記載されているキー/シークレットを使用してサンプル アプリケーションを実行しました。 ドキュメンテーション。サンプル アプリが動作し始めたら、アプリケーションに同じキー/シークレット値を使用しました。

サンプル アプリの場合、handleOpenURL (または iOS 4.2 の openURL) の実装は期待どおりに実行されます。奇妙な理由で、私のアプリではそうではありませんでした。Dropbox のログイン画面と認証ページを表示するために、アプリがバックグラウンドに入りました。ログインと認証が成功した後、アプリがフォアグラウンドに移行しませんでした。これは、プラットフォーム シミュレータとデバイス (iPad) の両方に当てはまります。

この投稿を含め、インターネット上にリストされているほぼすべてのことを試しました。ありがとう。しかし、成功はありませんでした。

ついに、それは 開始しました 次の操作を行ったときにアプリケーションで動作しました:

  • シミュレータ上で、「iOS シミュレータ --> コンテンツと設定のリセット」を選択し、リセットします。
  • デバイス上で、サンプル アプリケーション関連の実行可能ファイルを削除し、それに関連するキャッシュも削除しました。

application:DidFinishLaunchingWithOptionsの最後に以下を追加します:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    ...    

    NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
    if (url != nil && [url isFileURL]) {
        return YES;
    }  else return NO;
} // End of application:didFinishLaunchingWithOptions:

// New method starts 
-(BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    mvc = [nc.viewControllers objectAtIndex:0];
    if (url != nil && [url isFileURL]) {
        [mvc handleOpenURL:url];
    }
    return YES;
}
MVCは私のメインのViewControllerで、私のナビゲーションコントローラNC

次にMainViewControllerに、このような何かを行います

- (void)handleOpenURL:(NSURL *)url {
    [self.navigationController popToRootViewControllerAnimated:YES];

    // Next bit not relevant just left in as part of the example
    NSData *jsonData = [NSData dataWithContentsOfURL:url];        
    NSError *error;
    NSDictionary *dictionary = [[NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error] objectAtIndex:0];
    [self managedObjectFromStructure:dictionary withManagedObjectContext:self.context];
    ...
}
当然の.hの中handleOpenURLを宣言した後、

おかげで、このための努力を置くためのクリスチャンに行きます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top