由于NSUserActivity,iOS应用程序启动.如何访问该对象?

Leg*_*las 17 objective-c ios

所以现在测试一些ios9 beta功能,但是NSUserActivity已经出现了一段时间,这是在切换中使用的.

基本上就是这样.当应用程序向NSUserActivity启动doe时,我可以看到它launchOptions有一个键集.

    NSDictionary *userActivityKey = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];
Run Code Online (Sandbox Code Playgroud)

基本上这个方法永远不会被调用.

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray * __nullable restorableObjects))restorationHandler
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为应用程序刚刚因活动而被打开.但令我困惑的是这个.

当我检查launchOptions时,我无法访问NSUserActivity.显然操作系统会为你创建那个对象?

你们有没有人这样做?

ern*_*sto 21

你不应该这样做.你应该YES-(BOOL)application:didFinishLaunchingWithOptions:,然后-(BOOL)application:continueUserActivity:restorationHandler也会被召唤.Apple文档说:

如果应用无法处理URL资源或继续用户活动,则为NO,否则返回YES.

  • 是的,这是正确的答案.您没有在launchOptions字典对象中获取NSUserActivity对象.你需要在`application:didFinishLaunchingWithOptions:`中返回YES.注意你是否使用Facebook SDK并返回`application:didFinishLaunchingWithOptions:``[[FBSDKApplicationDelegate sharedInstance]应用程序:application didFinishLaunchingWithOptions:launchOptions]`它将返回**NO**和你的`application:continueUserActivity:restorationHandler`委托不会被叫! (7认同)

mar*_*kim 16

我使用a UIAlertView来获取来自NSUserActivity的launchOptions的描述:

NSDictionary *userActivityDictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"alert"
                                                    message:[userActivityDictionary description]
                                                   delegate:nil
                                          cancelButtonTitle:@"Okay"
                                          otherButtonTitles:nil];
[alertView show];
Run Code Online (Sandbox Code Playgroud)

显然,这本词典附带了几个键,我似乎找不到文档:

UIApplicationLaunchOptionsUserActivityIdentifierKey
UIApplicationLaunchOptionsUserActivityKey
UIApplicationLaunchOptionsUserActivityTypeKey // there is documentation for this key
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

似乎NSUserActivity对象在这个字典中,但从Apple的角度来看它可能不太好(或者如果Apple决定改变它可能会破坏),试图访问这个对象(例如,可能循环通过字典键和寻找NSUserActivity对象).

****解决方案****

编辑:这是关于如何从launchOptions访问NSUserActivity对象的一些实现:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSDictionary *userActivityDictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];
    if (userActivityDictionary) {
        [userActivityDictionary enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
                if ([obj isKindOfClass:[NSUserActivity class]]) {
                    NSLog(@"found NSUserActivity object!");
                }
            }];
    }
}
Run Code Online (Sandbox Code Playgroud)

使用此方法,您无需知道未记录的密钥UIApplicationLaunchOptionsUserActivityKey的值.

如果您对上述解决方案感到不舒服,另一种方法可能是在您的应用进入此方法时捕获NSUserActivity对象,

- (BOOL)application:continueUserActivity:restorationHandler:
Run Code Online (Sandbox Code Playgroud)

然后,将此用户活动设置为AppDelegate的属性,以便以后检索.

注意:在测试Core Spotlight(iOS 9功能)时,我能够验证在冷启动应用程序上调用上述方法.


Chr*_*s C 7

快速回答:

// Handle universal link
    if let activityDic = launchOptions?[UIApplicationLaunchOptionsUserActivityDictionaryKey] as? [NSObject : AnyObject],
              activity = activityDic["UIApplicationLaunchOptionsUserActivityKey"] as? NSUserActivity {          
        handleActivity(activity)
    }
Run Code Online (Sandbox Code Playgroud)