La práctica de compartir el sistema iOS con tu propia aplicación.

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

imagen.png

imagen.png

La creación exitosa generará una carpeta.

imagen.png

info.plistExisten 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í.

imagen.png

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.

imagen.png

Insertar descripción de la imagen aquí

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

imagen.png

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á.

Supongo que te gusta

Origin blog.csdn.net/SSY_1992/article/details/132504693
Recomendado
Clasificación