Картонное QR-сканирование без Unity SDK



Я пытался выяснить, как сканировать и использовать QR-коды, поставляемые с картонными устройствами, без необходимости использовать API Unity. Я уже написал SCN-VR для SceneKit based VR для устройств iOS с Obj-c, и я хотел бы, чтобы сканирование QR-кодов также работало, чтобы упростить настройку профилей.



Я видел QR-код сканирования, чтобы goo.gl/pdNRON, что приводит к странице о том, как загрузить приложение Google Cardboard, но какой сервис HTTP приложение Google Cardboard собирается загрузить реальный профиль?

668   2  

2 ответов:

QR-коды могут быть проанализированы с помощью буферов протокола Google (https://developers.google.com/protocol-buffers/docs/cpptutorial?hl=en0 ). сокращенный URL-адрес, отсканированный из кода, перенаправляется на URL-адрес, содержащий фактическую информацию в поле запроса p=. Например, Ваш URL (goo.gl/pdNRON) перенаправляет на https://www.google.com/get/cardboard/download/?p=CgxNYXR0ZWwsIEluYy4SGFZJRVctTUFTVEVS4oSiIFZSIFZJRVdFUh0xCCw9JWiRbT0qEAAASEIAAEhCAABIQgAASEJYATUpXA89OggpXA8-SOE6P1AAYAM (который отображается в виде картонного сайта загрузки в браузере). Строка, которую вы хотите, - это длинная строка, начинающаяся с CgxNYXR. Поле имеет кодировку base64.

Файл определения буфера протокола доступен по адресу https://github.com/google/wwgc/blob/master/www/CardboardDevice.proto . После того, как вы построили компилятор буферов протокола (протокол, из ссылки учебника выше), просто запустите его на CardboardDevice.прото, и включают в себя выходной .CC и .H файлы в вашем проекте. Вы можете получить доступ к информация через Тип DeviceParams, после отправки декодированных данных к нему.

Для построения библиотеки буферов протокола и включения ее в ваш проект iOS: https://gist.github.com/BennettSmith/9487468ae3375d0db0cc . Или если у вас есть проблемы с созданием / связыванием библиотек, попробуйте это в качестве альтернативы: буферы протокола Google на iOS

Вот код для начала работы:

// Retrieve HEAD only (don't want the whole page)
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", myURL]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                       cachePolicy:NSURLRequestReloadIgnoringCacheData
                                                   timeoutInterval:10.0f];
[request setHTTPMethod:@"HEAD"];

// Start the request
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue mainQueue]
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    if (connectionError) {
        NSLog(@"%@", [connectionError localizedDescription]);
    } else {
        // Find the p attribute
        NSArray *comps = [[[response URL] query] componentsSeparatedByString:@"&"];
        for (NSString *comp in comps) {
            NSArray *subComps = [comp componentsSeparatedByString:@"="];
            if ([subComps count] == 2 && [subComps[0] isEqualToString:@"p"]) {
                NSString *base64 = subComps[1];

                // Replace _ with /, - with +, and pad with = to multiple of 4
                base64 = [base64 stringByReplacingOccurrencesOfString:@"_" withString:@"/"];
                base64 = [base64 stringByReplacingOccurrencesOfString:@"-" withString:@"+"];
                base64 = [base64 stringByPaddingToLength:(([base64 length]+3)/4)*4 withString:@"=" startingAtIndex:0];

                // Decode from base 64
                NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:base64
                                                                          options:NSDataBase64DecodingIgnoreUnknownCharacters];

                // Get the device parameters
                DeviceParams deviceParams;
                deviceParams.ParseFromArray([decodedData bytes], (int)[decodedData length]);

                // Do stuff with deviceParams
                // eg deviceParams.inter_lens_distance()
                break;
            }
        }
    }
}];

FWIW, если вы используете Swift и не хотите использовать зависимость protobuf, вы можете использовать это для декодирования.

Comments

    Ничего не найдено.