Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我如何判断应用程序是从URL方案还是正常启动?_Ios_Objective C_X Callback Url - Fatal编程技术网

Ios 我如何判断应用程序是从URL方案还是正常启动?

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

基本上,每当应用程序启动或打开时,我都会检查剪贴板上是否有链接,如果有,我会询问用户是否要添加链接

但是,我最近添加了使用x-callback-URL向应用程序添加URL的功能。如果他们使用类似LaunchPad的应用程序在我的应用程序中打开URL,“您想从剪贴板添加URL吗?”通知仍然会打开,这没有多大意义,因为他们已经启动该应用程序来添加URL

问题是,我的AppDelegate中的
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