iOS 13, IPA с новой подписью, не удается прочитать файлы из приложений Apple (Файлы / Safari) - PullRequest
0 голосов
/ 27 мая 2020

Предыстория :

У меня есть приложение, которое нельзя разместить в AppStore (длинная история), и в результате мои пользователи повторно подписывают IPA со своим разработчиком. аккаунт (платный или бесплатный) или сторонний сервис.

Проблема

Если я подпишу IPA, используя свою платную учетную запись разработчика непосредственно из Xcode, я могу читать файлы, которые открываются с помощью приложения. Если я переподписываю приложение, это может быть ошибкой при открытии с помощью вызова openURL. Если я использую стороннюю службу увольнения, openURL не запускается, а параметры launchOptions (AppDelegate) или connectionOptions (SceneDelegate) пусты. Служба, уходящая из службы, оставляет идентификатор пакета прежним.

Если openURL не срабатывает, а файл передается через приложение '(BOOL): (UIApplication *) application didFinishLaunchingWithOptions: (nullable NSDictionary *) launchOptions', то я не могу прочитать содержимое при использовании приложение Apple. Я заметил, что приложения Apple (Safari и файлы), 'UIApplicationLaunchOptionsURLKey' для launchOption перечисляет путь к файлу как file: /// private ..... / Shared / AppGroup / ... тогда как если я использую Chrome, этого нет.

Я пробовал использовать [url startAccessingSecurityScopedResource] с NSFileCoordinator, но без кубиков. Я безуспешно переключал «Открыть на месте», «Поддерживает браузер документов».

Я не понимаю, как я могу заставить систему последовательно отправлять URL-адрес из любого приложения и в успешно прочитал его на iOS 13. Любые указания приветствуются.

Пример фрагмента кода

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary<UIApplicationLaunchOptionsKey,id> *)launchOptions {
    NSLog(@"Bundle Identifier detected as %@", [[NSBundle mainBundle] bundleIdentifier]);

    //  See if we have an incoming URL
    NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
    if (url) {
        NSLog(@"Launch URL detected - %@", url);
        __block NSData *data = [NSData dataWithContentsOfURL:url];
        if (!data) {
            NSLog(@"Failed to read the URL. Requesting permission");
            BOOL permissionToReadFile = [url startAccessingSecurityScopedResource];
            NSError *error;

            //  request permission
            [[NSFileCoordinator alloc] coordinateReadingItemAtURL:url options:NSFileCoordinatorReadingWithoutChanges error:&error byAccessor:^(NSURL * _Nonnull newURL) {
                NSLog(@"File Association: Security approved url: %@", url);
                data = [NSData dataWithContentsOfURL:newURL];
                if (data) { NSLog(@"File Association: Data Content: %@", data); }

                //  terminate permission if we had any
                if (permissionToReadFile) { [url stopAccessingSecurityScopedResource]; }
            }];
        }
    }
...

}

SceneDelegate.m

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    NSLog(@"%s", __PRETTY_FUNCTION__);
    NSLog(@"iOS 13 Scene method");
    NSLog(@"Scene Connection Options: %@", connectionOptions);

    //  See if we have an URL
    NSURL *url = connectionOptions.URLContexts.allObjects.firstObject.URL;
    if (url) {
        NSLog(@"Scene - URL detected -- %@", url);

        //  Variable for the data
        __block NSData *data = [NSData dataWithContentsOfURL:url];
        NSLog(@"Scene - URL Content (if null - it failed) - %@", data);
        if (!data) {
            NSLog(@"Scene - URL reading failed, asking for permission");
            NSError *error;
            BOOL isAccessSuccessful = [url startAccessingSecurityScopedResource];
            //  Create the file coordinator with the read permission
            [[NSFileCoordinator alloc] coordinateReadingItemAtURL:url options:NSFileCoordinatorReadingWithoutChanges error:&error byAccessor:^(NSURL * _Nonnull newURL) {
                NSLog(@"Scene - File Association: Security approved url: %@", url);
                data = [NSData dataWithContentsOfURL:newURL];
                if (data) { NSLog(@"File Association: Data Content: %@", data); }

                if (isAccessSuccessful) { [url stopAccessingSecurityScopedResource]; }
            }];
        }
    }

...

}

Примечание. Я использую Objective C вместо Swift

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...