MST

星途 面试题库

面试题:Objective-C中Handoff功能实现的基础步骤

在Objective-C中,简要描述实现Handoff功能需要哪些基础步骤,包括如何配置项目以及关键的代码片段。
47.5万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

配置项目

  1. 启用 Handoff
    • 在 Xcode 项目中,打开 Capabilities 选项卡。
    • 启用 Handoff 功能,Xcode 会自动配置相应的 entitlements 文件。
  2. 设置 App 组
    • 同样在 Capabilities 中,启用 App Groups
    • 创建或选择一个 App 组,确保所有参与 Handoff 的应用(如 iOS 和 macOS 版本)都使用同一个 App 组。这允许应用间共享数据。

关键代码片段

  1. 设置活动(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;
}
  1. 接收活动: 在 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
  1. 在 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