Предыстория :
У меня есть приложение, которое нельзя разместить в 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