所以现在测试一些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.
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功能)时,我能够验证在冷启动应用程序上调用上述方法.
快速回答:
// Handle universal link
if let activityDic = launchOptions?[UIApplicationLaunchOptionsUserActivityDictionaryKey] as? [NSObject : AnyObject],
activity = activityDic["UIApplicationLaunchOptionsUserActivityKey"] as? NSUserActivity {
handleActivity(activity)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8383 次 |
| 最近记录: |