iOS应用接收文件打开类型

Posted by PaysonChen on January 19, 2022

0x00 背景

​ K歌音频上传工具1.0需求调研,在探索上传的几种方式当中,涉及到引导用户从QQ微信打开,并提供能力。这就牵涉到从其他应用讲音视频文件导入(打开/传入)到K歌的需要。

0x01 技术方案

​ 通过设置Xcode Document Types,可以设置项目可接收的文件类型,附带一份:官方提供的文件类型列表

0x02 项目实现

当前iOS应用的生命周期管理有以下两种方式

  • UIApplicationDelegate

    iOS13之前,Appdelegate的职责全权处理App生命周期和UI生命周期:

    在不需要多Window场景下,在AppDelegate中实现

    1
    2
    3
    4
    
    -(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
        NSLog(@"url=%@---options=%@", url, options);
        return YES
    }
    

    输出:

    1
    2
    3
    
    url=file:///private/var/mobile/Containers/Data/Application/32D902CA-E0EB-487B-8C08-8C5A277967E3/Documents/Inbox/RPReplay_Final1641554324-31.MP3---options={
        UIApplicationOpenURLOptionsOpenInPlaceKey = 0;
    }
    
  • UIWindowSceneDelegate

​ iOS13之后,Appdelegate不在负责UI生命周期,所有UI生命周期交给SceneDelegate处理:

在SceneDelegate场景中实现回调监听:

- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
    NSLog(@"scene = %@", URLContexts);
}

输出:

1
2
3
{(
    <UIOpenURLContext: 0x2817cc760; URL: file:///private/var/mobile/Containers/Data/Application/F63608F2-7BA5-4374-9ADB-6D6B1135C771/Documents/Inbox/RPReplay_Final1641554324-20.MP3; options: <UISceneOpenURLOptions: 0x2802b09c0; sourceApp: (null); annotation: (null); openInPlace: NO; _eventAttribution: (null)>>
)}

0x03 备注

音频文件导入:

QQ分享的音频可以支持其他应用打开,导入到第三方应用

微信分享的音频可以支持其他应用打开,导入到第三方应用

视频文件导入:

QQ分享的视频可以支持其他应用打开,导入到第三方应用

微信分享的视频无法导入

0x04 补充资料

Document Types Data包含关系如下:

各类型说明:iOS系统更多应用打开