Вопрос по ios – Программно получить путь к каталогу другого приложения из процесса pid в системе iOS?

3

Как я могу получить путь к каталогу другого приложения из процесса pid & # xFF1F;

Похоже, на iOS нет вызовов proc_pidpath.

Ваш Ответ

2   ответа
0

чем это. Если вы хотите обмениваться файлами между приложениями, рассмотрите возможность использования iCloud - он позволит вам получать доступ к файлам на разных платформах и даже в разных приложениях, учитывая, что идентификатор разработчика, к которому принадлежат приложения, одинаков. Рэй Вендерлих написалполезный учебник об этом. Удачи!

Error: User Rate Limit Exceeded zsounder
3

sysctl какие приложения, такие как Activity Monitor Touch, используются в App Store, поэтому должны быть приемлемы для Apple. Однако то, что вы намереваетесь делать с указанным путем, может оказаться неприемлемым для Apple. Если вы не собираетесь отправлять свое приложение в App Store, то, скорее всего, это не проблема.

- (NSString *)pathFromProcessID:(NSUInteger)pid {

    // First ask the system how big a buffer we should allocate
    int mib[3] = {CTL_KERN, KERN_ARGMAX, 0};

    size_t argmaxsize = sizeof(size_t);
    size_t size;

    int ret = sysctl(mib, 2, &size, &argmaxsize, NULL, 0);

    if (ret != 0) {
        NSLog(@"Error '%s' (%d) getting KERN_ARGMAX", strerror(errno), errno);            

        return nil;
    }

    // Then we can get the path information we actually want
    mib[1] = KERN_PROCARGS2;
    mib[2] = (int)pid;

    char *procargv = malloc(size);

    ret = sysctl(mib, 3, procargv, &size, NULL, 0);

    if (ret != 0) {
        NSLog(@"Error '%s' (%d) for pid %d", strerror(errno), errno, pid);            

        free(procargv);

        return nil;
    }

    // procargv is actually a data structure.  
    // The path is at procargv + sizeof(int)        
    NSString *path = [NSString stringWithCString:(procargv + sizeof(int))
                                        encoding:NSASCIIStringEncoding];

    free(procargv);

    return(path);
}
Являетсяsysctl() работает правильно на 64-битных процессорах тоже? потому что на iPhone 5S он возвращает очень большой размер для меня, и я получаю ошибку.malloc: *** mach_vm_map(size=4295229440) failed (error code=3) *** error: can't allocate region
Error: User Rate Limit Exceeded
Спасибо миллион, это работает хорошо сейчас. zsounder
Хм, дай мне еще один взгляд.
Не очень хорошо работает как на OSX, так и на iOS, только несколько приложений кажутся правильными, путь многих приложений не читается, например: -x | ~ o # @ 0f zsounder

Похожие вопросы