代码之家  ›  专栏  ›  技术社区  ›  Jordan Johnson

使用NSExtension的基于Swift的iOS应用程序扩展

  •  1
  • Jordan Johnson  · 技术社区  · 6 年前

    我正在使用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审查。它永远不会靠近应用商店。

    0 回复  |  直到 6 年前