pro*_*ner 22 objective-c url-scheme ios
我已经实现了一个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;
}
Run Code Online (Sandbox Code Playgroud)
如果我的应用程序在后台,一切正常.单击URL时,应用程序将返回到Foreground,URL将按照上述函数中的编码进行处理.
但是,如果应用程序已终止(应用程序尚未启动),则通过单击URL,它仅启动应用程序而不调用上面显示的处理函数.
经过搜索,我得到的最好结果就是这个
application:WillFinishLaunchingWithOptions:
当要求打开URL时,此方法的返回结果与application:didFinishLaunchingWithOptions:
方法的返回结果相结合,以确定是否应该处理URL.如果任一方法返回NO,则系统不会调用application:openURL:options
:method.如果未实现其中一个方法,则仅考虑已实现方法的返回值.
- application:didFinishLaunchingWithOptions:
此方法表示您处理launchOptions字典中任何键的最后机会.如果您没有评估application:willFinishLaunchingWithOptions:
方法中的键,则应该在此方法中查看它们并提供适当的响应.不是app委托的对象可以通过观察名为的通知UIApplicationDidFinishLaunchingNotification
并访问通知的userInfo字典来访问相同的launchOptions字典值.该方法返回后不久发送该通知.此方法的返回结果与application:willFinishLaunchingWithOptions:
方法的返回结果相结合,以确定是否应处理URL.如果任一方法返回NO,则不处理URL.如果未实现其中一个方法,则仅考虑已实现方法的返回值.
尽管有解释,我仍然不知道该怎么做,我在网上找不到其他任何东西.
谢谢
问候
vme*_*yer 29
我同意Kaloyan的说法,"handleOpenURL"从未在应用程序启动时调用.因此,您必须在didFinishLaunchingWithOptions中的"launchOptions"中检查URL.
然而
我采用了与QuickActions(3D Touch)的Apple 示例代码相同的解决方案.我把网址在一个可变的推出,我处理得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
Run Code Online (Sandbox Code Playgroud)
小智 8
嗨,当以前没有启动应用程序时,永远不会调用方法"handleOpenURL".您必须在didFinishLaunchingWithOptions中检查具有键"UIApplicationLaunchOptionsURLKey"的对象的"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
}
Run Code Online (Sandbox Code Playgroud)
我相信现在有更好的答案,
application:handleOpenURL:
application:openURL:sourceApplication:annotation:
两者都在ios 9中被弃用.苹果的建议是:请
application:openURL:options:
改用.
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;
}
Run Code Online (Sandbox Code Playgroud)
小智 8
我在 iOS 13 上的应用程序中遇到了同样的问题。即使正确实现了- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
方法,它也从未被调用。
从 iOS13 开始,调用的是 SceneDelegate 而不是 AppDelegate 方法。一旦我实施了
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts
Run Code Online (Sandbox Code Playgroud)
在场景委托上,如果应用程序已经在内存中,它就会工作。但是,对于冷启动,我必须实现回调
-(void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions
Run Code Online (Sandbox Code Playgroud)
以及。
在实施的同时
-(void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions
Run Code Online (Sandbox Code Playgroud)
请记住处理不是从 URL 启动应用程序的情况。
这是一个有用的参考:https : //forums.developer.apple.com/thread/124132
小智 6
对于iOS 10,请使用
func application(_ app: UIApplication,
open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
Run Code Online (Sandbox Code Playgroud)
application(_:open:options:)
当应用程序在后台时没有被调用时,我遇到了同样的问题。原因是 Firebase SDK 使用了方法 swizzling。
我通过设置解决了这个问题,FirebaseAppDelegateProxyEnabled = NO
在Info.plist
有关其工作原理及其影响的更多详细信息,您可以在此处阅读https://firebase.google.com/docs/cloud-messaging/ios/client#method_swizzling_in
归档时间: |
|
查看次数: |
27197 次 |
最近记录: |