Nik*_*ani 17 xcode user-activity ios ios9 corespotlight
我正在尝试使用核心聚光灯从聚光灯搜索结果中打开视图控制器.
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray *restorableObjects))restorationHandler
{
if(self.window.rootViewController){
[self.window.rootViewController restoreUserActivityState:userActivity];
}
return YES;
}
Run Code Online (Sandbox Code Playgroud)
当应用程序已经在后台运行时,这似乎有效,但是当它关闭时我点击聚光灯搜索结果似乎没有调用此方法,我得到的行为是我的应用程序只是在主界面中启动.
当我的应用程序关闭时,你有什么建议让它工作吗?有没有办法调试正在发生的事情(因为我需要运行应用程序以连接调试器我不知道如何从搜索结果模拟应用程序打开)?
小智 38
尼科,
首先:有一种方法可以从Xcode启动您的应用程序而不是立即打开它:打开您的方案属性,转到"运行"部分,在"信息"下,有一个开关可以帮助您调试正在发生的事情:
"等待可执行文件启动".
如果您激活此开关,您可以从Xcode启动应用程序,Xcode将等待从搜索打开应用程序,然后它将附加调试器.
希望有所帮助!
伊万
ada*_*rov 34
在新的 Swift 5 中有一个名为SceneDelegate.swift. 使用方法scene(_ scene: UIScene, continue userActivity: NSUserActivity)
小智 21
如果您正在使用Facebook SDK,并且在didfinishlaunching返回时FBSDK,而不是纯文本,并在最后返回true,则可能会导致问题continueuseractivity.
经过大量搜索,并尝试不同的方式,我只需返回true并对此进行评论:
FBSDKApplicationDelegate.sharedInstance().application(application,didFinishLaunchingWithOptions:launchOptions)
didFinishLaunchingWithOptions需要返回YES,因此将调用continueUserActivity.
添加到应用程序结束:didFinishLaunchingWithOptions:
NSDictionary *activityDictionary = launchOptions[UIApplicationLaunchOptionsUserActivityDictionaryKey];
if (activityDictionary) {
NSUserActivity *userActivity = activityDictionary[UIApplicationLaunchOptionsUserActivityTypeKey];
if (userActivity) {
return YES;
}
}
return NO;
Run Code Online (Sandbox Code Playgroud)
如果您的应用程序使用场景,请确保您已实现两个委托:
这适用于单击链接时应用程序未运行的情况:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// the url is expected to be in connectionOptions.userActivities.first?.webpageURL in case if its type is NSUserActivityTypeBrowsingWeb
}
Run Code Online (Sandbox Code Playgroud)
这适用于应用程序位于后台或前台的情况:
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
// the url is going to be in userActivity.webpageURL
}
Run Code Online (Sandbox Code Playgroud)
如果您的应用程序不使用场景:
仔细检查这个方法调用,因为它已经改变了一段时间,遗留项目仍然可以有旧代码:
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool
Run Code Online (Sandbox Code Playgroud)
这是在我的案例中有效的调用:
func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
Run Code Online (Sandbox Code Playgroud)
(不要被 Xcode 建议添加的警告所欺骗private- 它不会有帮助)
有关更多详细信息,请查看Apple 关于通用链接的文档。
continue userActivity在最新的 swift 版本中已更改。更改 func 对我有用。
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool
Run Code Online (Sandbox Code Playgroud)
到
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool.
Run Code Online (Sandbox Code Playgroud)
如果应用程序已关闭,则不会调用application:continueUserActivity:.相反,您将在应用程序中获取所有信息launchOptions dictionnary:didFinishLaunchingWithOptions:
// In application: didFinishLaunchingWithOptions:
NSDictionary *activityDic = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];
if (activityDic) {
// Continue activity here
}
Run Code Online (Sandbox Code Playgroud)
以下是根据您的建议提供的完整答案。
// In application: didFinishLaunchingWithOptions:
NSDictionary *activityDic = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];
if (activityDic) {
if(self.window.rootViewController){
NSUserActivity * userActivity = [activityDic valueForKey:@"UIApplicationLaunchOptionsUserActivityKey"];
[self.window.rootViewController restoreUserActivityState:userActivity];
}
}
Run Code Online (Sandbox Code Playgroud)