Внешний ARSCNView, чтобы реагировать на собственный

avatar
Myyyyyyyyy
8 августа 2021 в 20:05
119
1
1

У меня есть собственное представление, использующее ARSCNView, скажем, что-то вроде

import Foundation
import UIKit
import ARKit
import SceneKit

@available(iOS 11.0, *)
class ARSceneView: ARSCNView, ARSessionDelegate, ARSCNViewDelegate {

}

Мне нужно использовать его в React Native, поэтому я создал диспетчер быстрого просмотра:

import UIKit

@objc(ARSceneViewManager)
class ARSceneViewManager : RCTViewManager {
  override func view() -> UIView! {
    if #available(iOS 11.0, *) {
      return ARSceneView(frame: .zero)
    } else {
      return UIView()
    };
 }

  override static func requiresMainQueueSetup() -> Bool {
      return true
    }
}

и файл ObjC:

#import "React/RCTBridgeModule.h"
#import "React/RCTViewManager.h"

@interface RCT_EXTERN_MODULE(ARSceneViewManager, RCTViewManager)

@end

Я использовал его в своем файле App.js:

const ARSceneView = requireNativeComponent('ARSceneView', ARSceneView);

Но он не появляется на экране - я вижу только черный экран. Что я делаю не так? Если я использую, например. Вместо UILabel все работает очень хорошо.

Это вывод Xcode:

2021-08-11 11:42:51.521528+0200 ARScreen[22000:1674182] [connection] nw_endpoint_handler_set_adaptive_read_handler [C1 172.20.10.2:8081 ready socket-flow (satisfied (Path is satisfied), viable, interface: bridge100, ipv4, dns)] unregister notification for read_timeout failed
2021-08-11 11:42:51.521615+0200 ARScreen[22000:1674182] [connection] nw_endpoint_handler_set_adaptive_write_handler [C1 172.20.10.2:8081 ready socket-flow (satisfied (Path is satisfied), viable, interface: bridge100, ipv4, dns)] unregister notification for write_timeout failed
2021-08-11 11:42:51.586421+0200 ARScreen[22000:1674025] [native] Running application ARScreen ({
    initialProps =     {
    };
    rootTag = 1;
})
2021-08-11 11:42:51.598740+0200 ARScreen[22000:1674182] [connection] nw_endpoint_handler_set_adaptive_read_handler [C2 172.20.10.2:8081 ready socket-flow (satisfied (Path is satisfied), viable, interface: bridge100, ipv4, dns)] unregister notification for read_timeout failed
2021-08-11 11:42:51.598819+0200 ARScreen[22000:1674182] [connection] nw_endpoint_handler_set_adaptive_write_handler [C2 172.20.10.2:8081 ready socket-flow (satisfied (Path is satisfied), viable, interface: bridge100, ipv4, dns)] unregister notification for write_timeout failed
2021-08-11 11:42:51.661793+0200 ARScreen[22000:1674183] [connection] nw_endpoint_handler_set_adaptive_read_handler [C3 172.20.10.2:8081 ready socket-flow (satisfied (Path is satisfied), viable, interface: bridge100, ipv4, dns)] unregister notification for read_timeout failed
2021-08-11 11:42:51.668304+0200 ARScreen[22000:1674183] [connection] nw_endpoint_handler_set_adaptive_write_handler [C3 172.20.10.2:8081 ready socket-flow (satisfied (Path is satisfied), viable, interface: bridge100, ipv4, dns)] unregister notification for write_timeout failed
2021-08-11 11:42:51.670879+0200 ARScreen[22000:1674183] [connection] nw_endpoint_handler_set_adaptive_read_handler [C4 172.20.10.2:8081 ready socket-flow (satisfied (Path is satisfied), viable, interface: bridge100, ipv4, dns)] unregister notification for read_timeout failed
2021-08-11 11:42:51.671031+0200 ARScreen[22000:1674183] [connection] nw_endpoint_handler_set_adaptive_write_handler [C4 172.20.10.2:8081 ready socket-flow (satisfied (Path is satisfied), viable, interface: bridge100, ipv4, dns)] unregister notification for write_timeout failed
2021-08-11 11:42:52.878308+0200 ARScreen[22000:1674193] [javascript] Running "ARScreen" with {"rootTag":1,"initialProps":{}}
2021-08-11 11:42:52.918248+0200 ARScreen[22000:1674025] Metal GPU Frame Capture Enabled
2021-08-11 11:42:52.918608+0200 ARScreen[22000:1674025] Metal API Validation Enabled
2021-08-11 11:42:53.123875+0200 ARScreen[22000:1674180] [connection] nw_endpoint_handler_set_adaptive_read_handler [C6 172.20.10.2:8081 ready socket-flow (satisfied (Path is satisfied), viable, interface: bridge100, ipv4, dns)] unregister notification for read_timeout failed
2021-08-11 11:42:53.123972+0200 ARScreen[22000:1674180] [connection] nw_endpoint_handler_set_adaptive_write_handler [C6 172.20.10.2:8081 ready socket-flow (satisfied (Path is satisfied), viable, interface: bridge100, ipv4, dns)] unregister notification for write_timeout failed
2021-08-11 11:42:54.571761+0200 ARScreen[22000:1674197] [connection] nw_socket_handle_socket_event [C5:1] Socket SO_ERROR [61: Connection refused]
2021-08-11 11:42:54.573292+0200 ARScreen[22000:1674180] [connection] nw_connection_get_connected_socket [C5] Client called nw_connection_get_connected_socket on unconnected nw_connection
2021-08-11 11:42:54.573526+0200 ARScreen[22000:1674180] TCP Conn 0x2805548f0 Failed : error 0:61 [61]
Источник

Ответы (1)

avatar
Andy Jazz
9 августа 2021 в 03:46
0

В файле info.plist проверьте наличие тегов RequiredDeviceCapabilities:

<key> UIRequiredDeviceCapabilities </key>
    <array>
        <string> armv7 </string>
        <string> arkit </string>
    </array>

и Privacy–CameraUsageDescription вариант:

<key> NSCameraUsageDescription </key>
    <string> This app needs your camera </string>

Также я надеюсь, что представление NSLayoutConstraints в порядке.

И убедитесь, что вы не забыли добавить слот сцены:

sceneView.scene = SCNScene() 
Myyyyyyyyy
9 августа 2021 в 18:32
1

Кажется, все установлено, как вы сказали, не могли бы вы описать, как убедиться, что NSLayoutConstraints в этом случае в порядке?

Myyyyyyyyy
9 августа 2021 в 19:10
1

Чтобы быть уверенным, я установил красный цвет ARSceneView, и представление, кажется, отображается правильно. Я также попытался изменить свой пользовательский вид на ARSCNView по умолчанию, и он также не работает.

Myyyyyyyyy
11 августа 2021 в 09:45
0

обновил, как вы сказали, и все равно не работает. Я добавлю вывод Xcode к моему вопросу, может быть, это поможет

Andy Jazz
11 августа 2021 в 17:47
0

В меню Xcode выберите Product > Scheme > Edit Scheme и установите для переменной среды OS_ACTIVITY_MODE значение disable. Затем посмотрите, что печатает консоль.