我正在使用NSExtension私有API在iOS上试验守护进程。
我一直在关注伊恩·麦克道尔的文章
Multi-Process iOS App Using NSExtension
。文章结尾处提供了一个可供下载的示例项目。
我的目标是将这个示例项目从Objective-C移植到Swift。将AppDelegate和ViewController移植到主机应用程序的swift已经足够简单了。XCode 9.2似乎映射了PrivateHeader中的NSExtension方法声明。h到Swift以供使用。
私家侦探。H
@interface NSExtension : NSObject
+ (instancetype)extensionWithIdentifier:(NSString *)identifier error:(NSError **)error;
- (void)beginExtensionRequestWithInputItems:(NSArray *)inputItems completion:(void (^)(NSUUID *requestIdentifier))completion;
- (int)pidForRequestIdentifier:(NSUUID *)requestIdentifier;
- (void)cancelExtensionRequestWithIdentifier:(NSUUID *)requestIdentifier;
- (void)setRequestCancellationBlock:(void (^)(NSUUID *uuid, NSError *error))cancellationBlock;
- (void)setRequestCompletionBlock:(void (^)(NSUUID *uuid, NSArray *extensionItems))completionBlock;
- (void)setRequestInterruptionBlock:(void (^)(NSUUID *uuid))interruptionBlock;
@end
我在尝试将应用程序扩展类从Objective-C移植到Swift时遇到了麻烦。下面是原始类和我的端口的简化:
扩大H
#import <Foundation/Foundation.h>
@interface Extension : NSObject <NSExtensionRequestHandling>
@end
扩大M
#import "Extension.h"
@implementation Extension
- (void)beginRequestWithExtensionContext:(NSExtensionContext *)context {
NSLog(@"Beginning request with context: %@", [context description]);
}
@end
扩大敏捷的
import Foundation
class Extension: NSObject, NSExtensionRequestHandling {
func beginRequest(with context: NSExtensionContext) {
print("Beginning request with context: \(context.description)")
}
}
试图发射Swift
Extension
进程在XCode中导致以下错误:
无法设置扩展上下文-错误:无法与帮助程序应用程序通信。
iPhone扩展(CoreFoundation)[366]:***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“***-[\uu NSDictionaryM setObject:forKey:]:对象不能为零
是否有人能够提供任何关于这里可能出现的问题的额外见解?从Objective-C到Swift的转换似乎很简单。在扩展应用程序似乎崩溃之前,我甚至无法在其上点击断点。
注意:我知道这可能不会通过AppStore审查。它永远不会靠近应用商店。