面试题答案
一键面试配置项目
- 启用 Handoff:
- 在 Xcode 项目中,打开
Capabilities
选项卡。 - 启用
Handoff
功能,Xcode 会自动配置相应的 entitlements 文件。
- 在 Xcode 项目中,打开
- 设置 App 组:
- 同样在
Capabilities
中,启用App Groups
。 - 创建或选择一个 App 组,确保所有参与 Handoff 的应用(如 iOS 和 macOS 版本)都使用同一个 App 组。这允许应用间共享数据。
- 同样在
关键代码片段
- 设置活动(Activity): 在 iOS 应用中,例如在视图控制器中设置当前活动,假设你有一个简单的文本编辑场景,想在不同设备间切换编辑:
#import <UIKit/UIKit.h>
#import <MobileCoreServices/MobileCoreServices.h>
@interface ViewController : UIViewController <UIActivityItemSource>
@property (nonatomic, strong) UITextView *textView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.textView = [[UITextView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:self.textView];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[self] applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];
}
// UIActivityItemSource 协议方法
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController {
return @"";
}
- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType {
return self.textView.text;
}
- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType {
return @"Handoff Text";
}
- (NSData *)activityViewController:(UIActivityViewController *)activityViewController dataTypeIdentifierForActivityType:(NSString *)activityType {
return (NSString *)kUTTypePlainText;
}
- 接收活动:
在
AppDelegate
中处理接收的活动,例如:
#import "AppDelegate.h"
#import <UIKit/UIKit.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *webPageURL = userActivity.webpageURL;
// 处理网页 URL,例如在应用内打开该网页
} else if ([userActivity.activityType isEqualToString:@"com.example.app.handoff"]) {
NSString *handoffText = userActivity.userInfo[@"handoffText"];
// 将接收到的文本显示在文本视图等地方
}
return YES;
}
@end
- 在 macOS 应用中类似处理:
在 macOS 的
AppDelegate
中,处理接收活动的方式类似,不过相关类和方法会基于 macOS 的框架,例如:
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(NSApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<NSUserActivityRestoring>> * _Nullable))restorationHandler {
if ([userActivity.activityType isEqualToString:@"com.example.app.handoff"]) {
NSString *handoffText = userActivity.userInfo[@"handoffText"];
// 处理接收到的文本,例如显示在文本视图中
}
return YES;
}
@end
同时在 macOS 应用中发起活动时,使用 NSSharingService
等相关类来设置活动内容,类似于 iOS 中的 UIActivityViewController
。