Hi there :)
We're in our way to make an app to can communicate with DSLR camera by using ImageCaptureCore framework for PTP communication with the camera.
In our app, we're sending some PTP commands to the camera by using requestSendPTPCommand(_:outData:completion:). This is our snipped-code to execute a PTP command.
public extension ICCameraDevice {
func sendCommand(command: Command) async {
do {
print("sendCommand ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
print("sendCommand \(command.tag()) : sendCommand Started")
let result = try await self.requestSendPTPCommand(command.encodeCommand().commandBuffer, outData: nil)
let (data, response) = result
print("sendCommand \(command.tag()) : sendCommand Finished")
print("sendCommand data: \(data.bytes.count)")
print("sendCommand response: \(response.bytes.count)")
if !response.bytes.isEmpty {
command.decodeResponse(responseData: response)
}
print("sendCommand \(command.tag()) : sendCommand Finished with response code \(command.responseCode)")
print("sendCommand ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
if command.responseCode != .ok {
isRunning = false
errorResponseCode = command.responseCode.rawValue
print("response error with code = \(command.responseCode)")
return
}
let copiedData = data.deepCopy()
command.decodeData(data: copiedData)
} catch {
isRunning = false
print("Error Send Command with error: \(error.localizedDescription)")
}
}
}
The function sendCommand(command: Command) async is called in a while-loop in async-await way. So that it needs to wait a sent command to finish before executing another command. The looping keeps running since the device connected to the camera.
The result is, the process is running by no problem at all for several minutes, It can get camera's setting, device info, even its images. But then the problems occurred. The amount of time is random, some time it takes only 15 minutes, some time it takes 1 hour.
There are 2 problems recorded in our case:
1. The requestSendPTPCommand(_:outData:completion:) result returning empty data without throwing any error, because the error never be caught in catch block.
This is my printed result:
sendCommand +++++++++++++++++++++++++++++++++++++
sendCommand GetObjectHandlesCommand : sendCommand Started
sendCommand GetObjectHandlesCommand : sendCommand Finished
sendCommand data: 0
sendCommand response: 0
sendCommand GetObjectHandlesCommand : sendCommand Finished with response code undefined
sendCommand +++++++++++++++++++++++++++++++++++++
2. It crashes with the last message in my logger:
sendCommand +++++++++++++++++++++++++++++++++++++
sendCommand GetObjectHandlesCommand : sendCommand Started
2023-10-27 10:44:37.186768+0700 PTPHelper_Example[76486:11538353] [PTPHelper_Example] remoteCamera ! Canon EOS 200D - Error Domain=NSCocoaErrorDomain Code=4097 “connection to service with pid 76493 created from an endpoint” UserInfo={NSDebugDescription=connection to service with pid 76493 created from an endpoint}
2023-10-27 10:44:37.187146+0700 PTPHelper_Example[76486:11538353] [PTPHelper_Example] failureBlock ! Canon EOS 200D - Failure block was called due to a connection failure.
For crashed issue, I've tried to attach in this post. But it always failed with messaged An error occured while uploading this log. Please try again later.. So that, I uploaded it in my google drive with url: https://drive.google.com/file/d/1IvJohGwp1zSkncTWHc3430weGntciB3K/view?usp=sharing
Reproduced on iOS 16.3.1.
I've checked the stack traces of the other threads but nothing suspicious got my attention. But it might relate to this issue https://developer.apple.com/forums/thread/104576. But I can't ensure.
Any good idea of how to address these crashes shown above?
Thank you!
Post
Replies
Boosts
Views
Activity
Hi, currently I have a project to develop a customized iOS/iPadOS app that is expected to can connect and communicate an External Cameras to iPhone/iPad device through USB Connection. The app should be able to access the taken photo from the External Cameras and/or take a shot executed by the app. The external camera manufacturers are like Canon, Nikon, and Sony.
As references, there are some apps that have that capability above released in Appstore:
https://apps.apple.com/us/app/camera-connect-control/id1457548017
https://apps.apple.com/id/app/image-capture-go/id1606632530?platform=iphone
As far as I know, I can connect to the Camera by using External Accessory framework provided by Apple as long the external device is MFi program supported and I have the detail of command protocol of the the device used.
In my case, Canon Camera is listed as MFi device in https://mfi.apple.com/account/accessory-search. But I don't have the detailed command protocol of the device to communicate with.
Questions:
Is my understanding related External Accessory framework correct?
How to connect and communicate external camera to iPhone/iPad via USB by using External Accessory framework?
Is there any other work around to do the things like the reference apps in Appstore above?
Thank you very much.
Dear Apple Developers,
I have an issue about Siri shortcut that cannot run in iOS 16.
When I call the shortcut, Siri only responds "OK" or "Done" but do nothing.
But if I check in the "shortcut" and run my shortcut, it will run properly.
I'm so confuse about that, because it only happen in iOS 16, under iOS 16 can be used normally.
This is my code:
Present siri shortcut
fileprivate func presentAddSiriShortcutViewController(_ activity: NSUserActivity) {
if #available(iOS 12.0, *) {
let shortcut = INShortcut(userActivity: activity)
let viewController = INUIAddVoiceShortcutViewController(shortcut: shortcut)
viewController.delegate = self
present(viewController, animated: true)
}
}
Activity
+ (NSUserActivity *)openPhotoActivity {
if (@available(iOS 12.0, *)) {
NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:@"openPhoto"];
userActivity.eligibleForSearch = YES;
userActivity.eligibleForPrediction = YES;
userActivity.title = MyLocalizedString(@"title_open_photo");
userActivity.suggestedInvocationPhrase = MyLocalizedString(@"keyword_open_photo");
return userActivity;
} else {
return nil;
}
}
This code can be run normally in under iOS 16.
Does the use of "NSUserActivity" no longer apply to iOS 16?
Should I use Intent using SiriKit?
Hi,
I've found a problem related local network in iOS 14.
My app can show a message about local network permission, but I can't run a method after user tap OK/Allow. How to add a method after user give an access the local network?
Thank you.