URL を使用したアプリの起動 (UIApplicationDelegate の handleOpenURL 経由) は iOS 4 では機能しますが、iOS 3.2 では機能しません
-
26-09-2019 - |
質問
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>ドキュメンテーションます:
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を宣言した後、。
おかげで、このための努力を置くためのクリスチャンに行きます。