我在我们的应用程序中实现了Handoff,当应用程序在前台或后台运行时,它适用于Web到应用程序切换,反之亦然.
但是,如果应用程序没有运行,那么如果用户从web启动应用程序到应用程序切换,则在launchOptions字典中,我得到了UIApplicationLaunchOptionsUserActivityDictionaryKey,但缺少对活动的引用.
看截图:
正如你所看到的,我只获得了ID NSUserActivity.这是iOS 9中的错误吗?
有没有办法通过使用id来获取对活动的引用?
编辑,这是代码,虽然我不认为这是相关的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (launchOptions && [[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsUserActivityDictionaryKey]) {
__block NSUserActivity *activity;
NSDictionary *userActivityDictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];
if (userActivityDictionary) {
[userActivityDictionary enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[NSUserActivity class]]) {
activity = obj;
}
}];
}
//app was started by URL (deep linking), check parameters
if (activity) {
NSURL *url = activity.webpageURL;
//resume from URL
}
}
return …Run Code Online (Sandbox Code Playgroud) 我想索引我的笔记以进行全局搜索。我使用了Ray Wenderlich的教程。
我在info.plist中添加了字符串:
"myapp.com.notes.note"
Run Code Online (Sandbox Code Playgroud)
这是我的对象:
struct Note {
public static let domainIdentifier = "myapp.com.notes.note"
public var userActivityUserInfo:[String: Any] {
return ["id": note_id]
}
public var userActivity: NSUserActivity {
let activity = NSUserActivity(activityType: Note.domainIdentifier)
activity.title = "\(note.title)"
activity.userInfo = userActivityUserInfo
activity.keywords = [note.title, note.text]
return activity
}
}
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何注册。在我的视图控制器中,我尝试过:
override func viewDidLoad() {
super.viewDidLoad()
for note in self.notes {
note.userActivity.becomeCurrent()
}
}
Run Code Online (Sandbox Code Playgroud)
但总是得到:
sendUserActivityToServer,在活动EC1785C0-2904-4F0A-9885-F4DB91C4B245无效后调用它,因此不执行任何操作。
我的设备:
我有两个上述设备之间的Handoff工作.Safari,邮件,消息,日历等所有切换都没有问题.
我甚至可以在Air上的网站和iPad上的原生应用之间切换.
我还不能做的是从我在iPad上的原生应用程序到我的Air上的Safari网站.
对于在我的原生应用程序中加载的第一个视图控制器,我有:
- (void)viewDidLoad
{
[super viewDidLoad];
NSUserActivity *webHandoff = [[NSUserActivity alloc] initWithActivityType:@"com.myApp.iphone.staging.webbrowsing"];
webHandoff.webpageURL = [NSURL URLWithString:@"http://staging.myApp.com"];
[webHandoff becomeCurrent];
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序的Info.plist文件中,我有:
<key>NSUserActivityTypes</key>
<array>
<string>com.myApp.iphone.staging.webbrowsing</string>
</array>
Run Code Online (Sandbox Code Playgroud)
我错过了什么或者我的配置错误吗?
谢谢你的帮助!
我试图让我的NSUserActivity被iOS中Spotlight中的私有索引编入索引.我已经按照Apple的索引活动和导航点指南中的所有步骤进行了操作,但我的活动似乎根本没有被聚光灯索引.
指南说:
为了保证活动及其元数据被编入索引,您必须拥有对活动的强引用,直到将其添加到索引中.有两种方法可以执行此操作:第一种方法是将活动分配给创建活动的控制器对象中的属性.第二种方法是使用UIResponder对象的userActivity属性.
我选择了第一个选项(在我的视图控制器中创建一个属性来保存NSUserActivity).
var lastSearchedUserActivity: NSUserActivity?
Run Code Online (Sandbox Code Playgroud)
这个想法是,当用户搜索某些内容时,他的最后一个查询将在设备上编入索引.我有以下方法准备用户活动和(据称)索引它:
func prepareLastSearchedUserActivity(tags: [String], server: Server) {
if Settings.applicationIndexedUserActivitiesAsShortcutTypes.contains(.LastSearched) {
print("Get ready to index. and tags \(tags.reduce("") { "\($0) \($1)" })")
let activity = NSUserActivity(activityType: ShortcutType.LastSearched.rawValue)
activity.title = server.serverName
activity.userInfo = ["tags": tags, "server name": server.serverName]
let attributeSet = CSSearchableItemAttributeSet()
attributeSet.contentDescription = tags.reduce("") { "\($0) \($1)" }
attributeSet.relatedUniqueIdentifier = ShortcutType.LastSearched.rawValue
activity.contentAttributeSet = attributeSet
activity.keywords = Set(tags)
activity.eligibleForSearch = true
activity.eligibleForHandoff = false
activity.becomeCurrent()
self.lastSearchedUserActivity = activity
//self.lastSearchedUserActivity?.becomeCurrent()
}
}
Run Code Online (Sandbox Code Playgroud)
调用此方法时没有问题,但活动无法搜索:我尝试使用title …
目前,我已经在我的 AppDelegate 中实现了这两个方法
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool
Run Code Online (Sandbox Code Playgroud)
和
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool
Run Code Online (Sandbox Code Playgroud)
如果用户使用 Spotlight 的搜索结果打开我的应用程序,第一个将被调用,如果我的应用程序从 Apple Maps(因为它是一个路由应用程序)打开,则第二个将被调用。
我的问题是,UIViewController从 AppDELEGATE转到特定位置的最佳方法是什么(无论用户处于何种视图都独立)?
我问的原因是因为目前我正试图根据用户所在的位置手动导航到它。例如,它们可能位于以UIViewController模态显示的a中(然后需要关闭),或者它们可能位于 a 的深处,UINavigationController然后应用程序需要在其中调用popToRootViewController.
这样做的话,代码会变得杂乱无章,而且似乎无法正常工作。这样做似乎也不正确,因为它非常脆弱。
uitabbarcontroller uiviewcontroller ios appdelegate nsuseractivity
从 iOS 13 开始,Apple 建议使用附加到场景的 NSUserActivity 对象来存储用户状态,因此我一直在尝试 a) 更好地理解 NSUserActivity 的工作原理和 b) 在我自己的代码中实现它。在阅读 Apple 的文档时,我遇到了这段代码:
class var activityType: String {
let activityType = ""
// Load our activity type from our Info.plist.
if let activityTypes = Bundle.main.infoDictionary?["NSUserActivityTypes"] {
if let activityArray = activityTypes as? [String] {
return activityArray[0]
}
}
return activityType
}
Run Code Online (Sandbox Code Playgroud)
我明白什么该做(它看起来在名为“NSUserActivityTypes”的条目的Info.plist文件,如果存在的话它会尝试获取activityTypes的关联数组,然后数组中读取的第一个项目),但什么我不明白这是为什么。特别是,我不明白为什么我们只读取 activityArray 中的第一项。在这种情况下,我们知道第一个(也是唯一的项目)是“com.apple.apple-samplecode.StateRestoration.activity”,因为我们必须手动创建该 plist 条目。但是我不明白为什么我们要硬编码查看数组的第一项以获取活动类型,因为如果我们知道我们将只返回字符串“com.apple.apple-samplecode”。 StateRestoration.activity",
class var activityType: String {
return "com.apple.apple-samplecode.StateRestoration.activity"
}
Run Code Online (Sandbox Code Playgroud)
我以前从未使用过 NSUserActivity,我知道它可以(通常是?)用于状态保存/恢复以外的其他事情,因此您的应用程序可以支持许多不同类型的用户活动(切换,Siri 集成) , 等等。)。所以我会假设我们希望我们的代码尽可能健壮,而不是对我们可能收到的 NSUserActivity 对象的种类做任何假设。 …
在放弃对 iOS 12 的支持时,我遇到了一个奇怪的问题。当从 AppDelegate 继续 userActivity 处理用户活动时,尽管我们放弃了 INStartAudioCallIntent 和 INStartVideoCallIntent 因为它在 iOS 13 中已弃用,但我们仍然从本机联系人卡接收上述 2 个意图。但实际上我们想要处理 INStartCallIntent。任何人都知道为什么我的调试版本是 14.6 会发生这种情况,谢谢。
我很好奇,有人设法让 SwiftUI 的 .onContinueUserActivity 工作吗?查看Apple 的示例代码,它似乎可以在他们的应用程序中运行(请注意自述文件中的测试说明)。但是当我为自己建立一个新项目并尝试重现它时,我无法让它工作。
我的只是一个普通的 SwiftUI 项目,进行了以下更改:
<key>NSUserActivityTypes</key>
<array>
<string>com.example.RnD.customActivity</string>
</array>
Run Code Online (Sandbox Code Playgroud)
@main
struct UserActivityDemoApp: App {
static let customActivityType = "com.example.RnD.customActivity"
var body: some Scene {
WindowGroup {
ContentView()
.userActivity(Self.customActivityType, isActive: true) { activity in
activity.title = "Doing Custom Activity"
activity.isEligibleForSearch = true
activity.isEligibleForHandoff = true
activity.becomeCurrent()
print("Defining user activity")
}
.onContinueUserActivity(Self.customActivityType) { activity in
print("we should resume \(activity.title ?? "misconfigured activity")")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这应该足以打印“我们应该恢复......”消息,但它不起作用。我在街区还需要做些什么吗.userActivity?苹果的文档似乎表明我已经做得足够多了。
iOS 9.2、xCode 7.2、Objective-C
我使用了本教程(Core Spotlight 版本)但将其翻译成 Objective-C:http : //code.tutsplus.com/tutorials/ios-9-introducing-search-apis--cms-24375
除了一件事之外,一切正常 - 当用户点击搜索结果时,我无法获得回调。看来我需要在我的应用程序委托中编写以下方法:
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler
Run Code Online (Sandbox Code Playgroud)
但它根本没有被调用。如何解决这个问题?
我在应用程序中使用mapItem实现NSUserActivity时遇到了一些麻烦.
我想要的是能够在应用程序切换器中使用"获取方向"建议,就像Foursquare所做的那样:
我在我的viewDidLoad方法中使用以下代码,在视图控制器中显示我想要注册的位置(一个pub).
NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@"co.pubmapper.ViewPub"];
CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(self.pub.lat, self.pub.lng);
MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coords];
MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem setName:self.pub.name];
activity.mapItem = mapItem;
// not sure any of these are necessary for my use case
[activity setEligibleForSearch:YES];
[activity setEligibleForHandoff:YES];
[activity setEligibleForPublicIndexing:YES];
[activity becomeCurrent];
Run Code Online (Sandbox Code Playgroud)
运行时,我在控制台中看到以下内容:
[main] sendUserActivityToServer, called on activity C626E4B1-ADF8-49D8-80FB-C773DB71243D after it had been invalidated, so doing nothing.
Run Code Online (Sandbox Code Playgroud)
这表明我的activity项目由于某种原因立即失效.我添加了以下内容来设置expirationDate但仍在控制台中获取相同的消息.
activity.expirationDate = [NSDate distantFuture];
Run Code Online (Sandbox Code Playgroud)
据我所知,我已经按照文档中的所有内容进行了操作https://developer.apple.com/reference/foundation/nsuseractivity?language=objc
我还添加了我的活动类型 …
nsuseractivity ×10
ios ×7
swift ×3
handoff ×2
ios13 ×2
objective-c ×2
app-search ×1
appdelegate ×1
continuity ×1
ios8 ×1
ios9 ×1
restore ×1
spotlight ×1
swiftui ×1