If the frame and its canvas is a single object (so called mono-model), then you cannot apply a texture to just the surface of the canvas. You need the canvas to be a separate part. The simplest solution in this case would be to create a Plane primitive and apply a texture to it. Then transform the plane as needed and attach it to the same anchor.
import UIKit
import RealityKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
override func viewDidLoad() {
super.viewDidLoad()
let frameEntity = try! Entity.loadModel(named: "frame.usdz")
let canvas: MeshResource = .generatePlane(width: 0.3, height: 0.4)
var material = SimpleMaterial()
material.color = try! .init(texture: .init(.load(named: "canvas")))
let canvasEntity = ModelEntity(mesh: canvas, materials: [material])
canvasEntity.position = [0.3, 0.1, 0.0]
canvasEntity.scale *= 1.25
let anchorEntity = AnchorEntity()
anchorEntity.addChild(frameEntity)
anchorEntity.addChild(canvasEntity)
arView.scene.anchors.append(anchorEntity)
}
}