Картонное QR-сканирование без Unity SDK
Я пытался выяснить, как сканировать и использовать QR-коды, поставляемые с картонными устройствами, без необходимости использовать API Unity. Я уже написал SCN-VR для SceneKit based VR для устройств iOS с Obj-c, и я хотел бы, чтобы сканирование QR-кодов также работало, чтобы упростить настройку профилей.
Я видел QR-код сканирования, чтобы goo.gl/pdNRON, что приводит к странице о том, как загрузить приложение Google Cardboard, но какой сервис HTTP приложение Google Cardboard собирается загрузить реальный профиль?
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