Ios 我如何判断应用程序是从URL方案还是正常启动?
基本上,每当应用程序启动或打开时,我都会检查剪贴板上是否有链接,如果有,我会询问用户是否要添加链接 但是,我最近添加了使用x-callback-URL向应用程序添加URL的功能。如果他们使用类似LaunchPad的应用程序在我的应用程序中打开URL,“您想从剪贴板添加URL吗?”通知仍然会打开,这没有多大意义,因为他们已经启动该应用程序来添加URL 问题是,我的AppDelegate中的Ios 我如何判断应用程序是从URL方案还是正常启动?,ios,objective-c,x-callback-url,Ios,Objective C,X Callback Url,基本上,每当应用程序启动或打开时,我都会检查剪贴板上是否有链接,如果有,我会询问用户是否要添加链接 但是,我最近添加了使用x-callback-URL向应用程序添加URL的功能。如果他们使用类似LaunchPad的应用程序在我的应用程序中打开URL,“您想从剪贴板添加URL吗?”通知仍然会打开,这没有多大意义,因为他们已经启动该应用程序来添加URL 问题是,我的AppDelegate中的openURL:方法在appDidFinishLaunching和appWillEnterForeground
openURL:
方法在appDidFinishLaunching
和appWillEnterForeground
之后被调用来处理URL方案,所以我无法检查这些方法是否已经调用了openURL
方法。我可以在之后使用一个调度,但这看起来既懒惰又有黑客行为
是否有办法检查应用程序是如何启动的,即:通过URL方案还是通过手动打开?不要实施applicationdFinishLaunching:
。使用application:didfishlaunchingwithoptions:
。同样,不要使用application:handleOpenURL:
,而是使用application:openURL:sourceApplication:annotation:
如果您是从URL启动的,则选项字典将包含一个UIApplicationLaunchOptionsURLKey键,该键的值将是URL
但是,如果您的应用程序已在运行,但处于后台,并且用户调用URL重新打开您的应用程序,则您将收到一条application:openURL:sourceApplication:annotation:
消息。
您真正需要做的是实现一个handleURL方法,然后从application:didFinishLaunchingWithOptions:
和application:openURL:sourceApplication:annotation:
编辑:
请注意,在iOS 9中,Apple弃用了application:openURL:sourceApplication:annotation:
,并添加了新方法application:openURL:options:
如果您的应用程序仅限于iOS 9及更高版本,则应实现新的应用程序:openURL:options:
方法。如果您需要支持iOS 9和早期版本,您可能应该同时实现应用程序:openURL:sourceApplication:annotation:
和新的iOS 9方法应用程序:openURL:options:
。操作系统将调用您正在运行的操作系统版本的正确版本。然后我将创建一个公共方法,这两个方法都可以调用。这样,两个操作系统版本都会调用您,但您处理打开URL的代码只在一个位置。applicationIDbecomeactive
在openURL
和continueUserActivity
之后调用(在appWillEnterForeground
之后),因此是确定如何打开应用程序的好地方
将url缓存在openURL
和continueUserActivity
中(根据来源,深度链接可能来自continueUserActivity
)。有趣的是,我总是在从消息打开链接时看到调用该方法。然后在ApplicationIDBecomeActivity
中检查该url
private var launchURL:URL?
静态func应用程序(application:UIApplication,continue userActivity:NSUserActivity,restorationHandler:@escaping([Any]?)->Void)->Bool{
launchURL=userActivity.webpageURL
//用userActivity做点什么
返回真值
}
静态func应用程序(app:UIApplication,打开url:url,选项:[UIApplication.OpenUrlOptionKey:Any])->Bool{
launchURL=url
//用URL做些什么
返回真值
}
静态函数applicationIDBECOMEACTIVE(u应用程序:UIApplication){
推迟{
launchURL=nil//正在清理
}
让didLaunchFromURL=launchURL!=nil
}
查看此答案,了解如何使用Swift 3引用UIApplicationLaunchOptionsURLKey
:根据我们的测试,如果用户从URL启动,则即使应用程序尚未运行,也会调用application:openURL:options
。我看到在使用断点打开URL之前会调用didBecomeActive。@Kevin,@Amber K:didBecomeActive
可能发生在应用程序已在屏幕上并使用应用程序响应的URL扫描NFC标记(通过applinks技术)的情况下,该事件可能早于continueUserActivity