Aquí hablamos principalmente sobre el uso de la extensión para compartir ( share extension
) para realizar la función de compartir el sistema con su propia aplicación, saltar a la aplicación host en la extensión y transmisión de datos, etc.
1. Agregar extensión para compartir
La creación exitosa generará una carpeta.
info.plist
Existen reglas para activar extensiones. Las reglas coincidentes harán que su propia aplicación aparezca en el sistema compartido.
NSExtensionActivationRule
: El valor predeterminado es la cadena "TRUEPREDICATE", lo que significa que la extensión siempre se muestra en el menú para compartir. No está disponible en el entorno de producción, debe cambiar el tipo a tipo Diccionario y luego agregar los siguientes campos:
NSExtensionActivationSupportsAttachmentsWithMaxCount
Los archivos adjuntos incluyen tres categorías: Archivo, Imagen y Película. El número total de selecciones individuales o mixtas no excede el número especificado.
NSExtensionActivationSupportsAttachmentsWithMinCount
La restricción mínima de archivos adjuntos entra en vigor cuando se establece el número máximo de campos anteriores. Se selecciona al menos 1 archivo adjunto de forma predeterminada y el icono de extensión se muestra en el menú para compartir.
NSExtensionActivationSupportsImageWithMaxCount
El número máximo de imágenes es limitado y ni la selección única ni la mixta superan el número especificado.
NSExtensionActivationSupportsMovieWithMaxCount
El número máximo de vídeos es limitado y ni la selección única ni la mixta superan el número especificado.
NSExtensionActivationSupportsText
Si se admite el tipo de texto o el tipo booleano, no se admite de forma predeterminada. Como compartir [memo]
NSExtensionActivationSupportsWebPageWithMaxCount
El límite máximo de la página web, que es de tipo numérico. El uso compartido de páginas web no se admite de forma predeterminada y usted debe establecer un valor.
NSExtensionActivationSupportsWebURLWithMaxCount
El límite máximo de enlaces web, que es de tipo numérico. Compartir hipervínculos no es compatible de forma predeterminada y usted mismo debe establecer un valor.
La clase de extensión para compartir predeterminada ShareViewController viene con sus propias vistas, que se pueden personalizar por completo. No entraré en detalles aquí.
2. Obtenga datos compartidos y acceda a la aplicación de host
dispatch_group_t group = dispatch_group_create();
NSExtensionItem *extensionItem = self.extensionContext.inputItems[0];
for (NSItemProvider *attachment in extensionItem.attachments) {
if ([attachment hasItemConformingToTypeIdentifier:(NSString *)kUTTypeImage]) {
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[attachment loadItemForTypeIdentifier:(NSString *)kUTTypeImage
options:nil
completionHandler:^(id<NSSecureCoding> _Nullable item, NSError * _Null_unspecified error) {
NSData *data = [[NSData alloc]initWithContentsOfURL:item];
dispatch_group_leave(group);
}];
});
}
if ([attachment hasItemConformingToTypeIdentifier:(NSString *)kUTTypeMovie]) {
dispatch_group_enter(group);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[attachment loadItemForTypeIdentifier:(NSString *)kUTTypeMovie
options:nil
completionHandler:^(id<NSSecureCoding> _Nullable item, NSError * _Null_unspecified error) {
NSData *data = [[NSData alloc]initWithContentsOfURL:item];
dispatch_group_leave(group);
}];
});
}
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
UIResponder* responder =self;
responder = [responder nextResponder];
while((responder = [responder nextResponder]) !=nil) {
if([responder respondsToSelector:@selector(openURL:)] ==YES) {
//打开APP
//这里的asancloud是app的URL Schemes ,home是自己随便定义的,用于判断
[responder performSelector:@selector(openURL:) withObject:[NSURL URLWithString:[NSString stringWithFormat:@"custome://"]]];
//执行分享内容处理
[self.extensionContext completeRequestReturningItems:@[] completionHandler:NULL];
}
}
});
Después de saltar a la aplicación host, maneje la lógica con el siguiente método
-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options;
3. Transmisión de datos (hay 3 tipos, aquí se presenta NSUserDefaults)
Primero, debe configurar los mismos grupos de aplicaciones, que deben comenzar con grupo.
NSUserDefaults *de = [[NSUserDefaults alloc]initWithSuiteName:@"group.(跟上面app groups一致)"];
[de setObject:value forKey:@"key"];
La aplicación host obtiene datos
NSUserDefaults *de = [[NSUserDefaults alloc]initWithSuiteName:@"group.(跟上面app groups一致)"];
id value = [de objectForKey:@"key"];
4. Depuración
La extensión debe elegir la aplicación host correspondiente para ejecutar, pero la extensión es un proceso independiente. Durante la depuración, cuando se ejecuta la extensión, los puntos de interrupción en la aplicación host no se ejecutarán. De manera similar, cuando se ejecuta la aplicación host, los puntos de interrupción en la extensión no se ejecutará.