[Interest] iOS didFinishLaunchingWithOptions and such

maitai maitai at virtual-winds.org
Sun Nov 15 09:08:23 CET 2015


So simple... that should be written somewhere in the iOS documentation 
section

I'll give it a try

BTW what other scheme can we use apart from "file" ?

Thanks Robert for the tip, didn't knew that one...

Le 14-11-2015 20:37, Robert Iakobashvili a écrit :
> Gentlemen,
> For iOS works general cross-platform Qt url handling mechanism.
> 
> //
> // Register for: iOS "Open In" file sharing  and for our special file 
> extensions
> //
> QDesktopServices::setUrlHandler("file", this,
> "handle_shared_ios_file_and_app_ext_we_are_registed_for");
> 
> Existing Qt iOS delegate calls all URL-handling.
> 
> Take care.
> 
> Regards,
> Robert
> 
> 
> On Sat, Nov 14, 2015 at 3:09 PM, maitai <maitai at virtual-winds.org> 
> wrote:
>> I finally fixed my problem by running app->exec() much sooner in 
>> main.cpp
>> (using a QTimer::singleShot(0, ...) to finished my initialization). It 
>> seems
>> that the fact that exec() and eventloop was not started soon enough
>> conflicted somehow with openUrl(), while in a normal situation that 
>> was not
>> a problem.
>> 
>> Thanks again Edward for your help, that was very helpful.
>> 
>> Philippe Lelong
>> 
>> 
>> 
>> 
>> 
>> Le 13-11-2015 20:17, maitai a écrit :
>> 
>> Ok then, I need to review all that it's clear.
>> 
>> Thank you a thousand times for your input, it helps a lot to know that 
>> it's
>> something wrong with my own code.
>> 
>> I'll post back when fixed
>> 
>> 
>> 
>> 
>> 
>> Le 13-11-2015 20:10, Edward Sutton a écrit :
>> 
>> 
>> On Nov 13, 2015, at 1:01 PM, maitai <maitai at virtual-winds.org> wrote:
>> 
>>> And just to make sure I understand well, if you press your app icon 
>>> "copy
>>> to MyApp" your app launches and all is fine? If this is the case then 
>>> the
>>> problem must be on my side obviously
>> 
>> Yes. My Qt 5.5 widget app launches splash screen, then app opens the 
>> data
>> file displaying the data inside the app.
>> 
>> I just powered-off and repeated test. App launched just fine.
>> 
>> iPhone 5c, iOS 9.1.
>> 
>> Built on Xcode 7.1.1 on OS X 10.10.5
>> 
>> -Ed
>> 
>> 
>> 
>> 
>> 
>> Le 13-11-2015 19:56, Edward Sutton a écrit :
>> 
>> 
>> 
>> On Nov 13, 2015, at 12:50 PM, maitai <maitai at virtual-winds.org> wrote:
>> 
>> Thanks Edward for your fast answer.
>> 
>>> That is working also if your app is not in the background (i.e not
>>> started)?
>> 
>> Yes. Since Qt 5.4 and currently using Qt 5.5.1
>> 
>> I just closed my app to make sure.
>> 
>> Then I went to iOS mail and opened an email attachment of a file with 
>> a
>> *.TSR file extension associated with my application.  The sharing 
>> thing
>> opens.  One of the options displayed my app's icon with text "Copy yo 
>> MyApp"
>> 
>> -Ed
>> 
>> 
>> 
>> 
>> 
>> Le 13-11-2015 19:42, Edward Sutton a écrit :
>> 
>> I am using a pure Qt 5.5.1 iOS widgets app.  Disclaimer: This solution 
>> works
>> but may not be the best solution.  Recommendations for a cleaner 
>> approach
>> are welcome.
>> 
>> Using Qt 5.5.1 I added myApplicationDelegate.mm that posts an 
>> fileOpenEvent.
>> It would be nice if this was built into Qt. See below File:
>> myApplicationDelegate.mm.
>> 
>> Then I subclass QApplication to include  to add a member variable for 
>> my
>> QMainWindowto watch for QEvent::FileOpen and call
>> 
>> 
>> 
>> /// Looks for QFileOpenEvent to implement app file open from
>> 
>> /// other apps, for example, Finder on OS X, or Apple Mail on iOS and 
>> OS X.
>> 
>> ///
>> 
>> ///
>> 
>> /// \remarks Could this work on Android too?
>> 
>> ///
>> 
>> /// See file: myApplicationDelegate.mm
>> 
>> /// \see myApplicationDelegate.mm.mm
>> 
>> ///
>> 
>> bool TcmwApplication::event(QEvent* event)
>> 
>> {
>> 
>>     // iOS receives ApplicationDeactivate, ApllicationStateChange, 
>> when Home
>> is pressed
>> 
>>     // When iOS user opens Mail file attachment using "Open in TSR",
>> ApplicationActivate event received but NOT QEvent::FileOpen
>> 
>>     switch (event->type())
>> 
>>     {
>> 
>> 
>> 
>> #if 0 // Why was I calling m_mainWindow.show() here? Android problem?
>> 
>>         case QEvent::ApplicationActivate:
>> 
>>         {
>> 
>>             //clean();
>> 
>>             if (false == m_mainWindow.isMinimized())
>> 
>>             {
>> 
>>                 qDebug("m_mainWindow.show()");
>> 
>>                 // Why was I calling m_mainWindow.show() here? Android
>> problem?
>> 
>>                 //m_mainWindow.show();
>> 
>>             }
>> 
>>             return true;
>> 
>>         }
>> 
>> #endif
>> 
>>         case QEvent::FileOpen:
>> 
>>         {
>> 
>>             // Should file attachments be copied locally as if they 
>> were
>> downloaded from a TK?
>> 
>>             QString fileName = static_cast<QFileOpenEvent 
>> *>(event)->file();
>> 
>>             m_mainWindow.openFile(fileName);
>> 
>>             return true;
>> 
>>         }
>> 
>>         default:
>> 
>>             break;
>> 
>>     }
>> 
>>     return QApplication::event(event);
>> 
>> }
>> 
>> #endif
>> 
>> 
>> 
>> -Ed
>> 
>> 
>> 
>> File: myApplicationDelegate.mm
>> 
>> 
>> #include <UIKit/UIKit.h>
>> 
>> 
>> 
>> #include <QDebug>
>> 
>> #include <QFileOpenEvent>
>> 
>> 
>> 
>> 
>> 
>> #include "qiosapplicationdelegate.h"
>> 
>> 
>> 
>> /// \category QIOSApplicationDelegate(TcmwApplicationDelegate)
>> 
>> /// \abstract A category on QIOSApplicationDelegate to override 
>> openURL
>> 
>> 
>> 
>> 
>> 
>> /// Use the Objective-C category feature to override the openURL 
>> method
>> 
>> @implementation QIOSApplicationDelegate (TcmwApplicationDelegate)
>> 
>> 
>> 
>> /// Posts a QFileOpenEvent to QCoreApplication when iOS calls openURL.
>> 
>> ///
>> 
>> /// This allows userto open a TSR file from Apple Mail,
>> 
>> /// select "Open in TSR", to launch TSR and pass openURL the
>> 
>> /// file to open.
>> 
>> ///
>> 
>> /// Must add UTExportedTypeDeclarations and CFBundleDocumentTypes to 
>> your
>> 
>> /// Info.plist for this to work.
>> 
>> ///
>> 
>> /// Example: Info.plist
>> 
>> /// \verbatim
>> 
>> ///    <key>UTExportedTypeDeclarations</key>
>> 
>> ///    <array>
>> 
>> ///        <dict>
>> 
>> ///            <key>UTTypeConformsTo</key>
>> 
>> ///            <array>
>> 
>> ///                <string>public.data</string>
>> 
>> ///            </array>
>> 
>> ///            <key>UTTypeDescription</key>
>> 
>> ///            <string>Tracking Status Report</string>
>> 
>> ///            <key>UTTypeIdentifier</key>
>> 
>> ///            <string>com.ditchwitch.tsr</string>
>> 
>> ///            <key>UTTypeTagSpecification</key>
>> 
>> ///            <dict>
>> 
>> ///                <key>public.filename-extension</key>
>> 
>> ///                <string>tsr</string>
>> 
>> ///                <key>public.mime-type</key>
>> 
>> ///                <string>public.data</string>
>> 
>> ///            </dict>
>> 
>> ///        </dict>
>> 
>> ///    </array>
>> 
>> ///    <key>CFBundleDocumentTypes</key>
>> 
>> ///    <array>
>> 
>> ///        <dict>
>> 
>> ///            <key>CFBundleTypeIconFiles</key>
>> 
>> ///            <array>
>> 
>> ///                <string>Icon.png</string>
>> 
>> ///            </array>
>> 
>> ///            <key>CFBundleTypeName</key>
>> 
>> ///            <string>Tracking Status Report</string>
>> 
>> ///            <key>CFBundleTypeRole</key>
>> 
>> ///            <string>Editor</string>
>> 
>> ///            <key>LSHandlerRank</key>
>> 
>> ///            <string>Owner</string>
>> 
>> ///            <key>LSItemContentTypes</key>
>> 
>> ///            <array>
>> 
>> ///                <string>com.ditchwitch.tsr</string>
>> 
>> ///                <string>public.data</string>
>> 
>> ///            </array>
>> 
>> ///        </dict>
>> 
>> ///    </array>
>> 
>> /// \endverbatim
>> 
>> ///
>> 
>> /// See file: tcmwapplication.cpp
>> 
>> /// \see tcmwapplication.cpp
>> 
>> ///
>> 
>> /// \see
>> https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html
>> 
>> ///
>> 
>> - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
>> 
>>                                        sourceApplication:(NSString
>> *)sourceApplication
>> 
>>                                               
>> annotation:(id)annotation
>> 
>> {
>> 
>>     Q_UNUSED(application);
>> 
>>     Q_UNUSED(annotation);
>> 
>> 
>> 
>>     NSLog(@"sourceApplication: %@",sourceApplication);
>> 
>>     NSLog(@"url: %@",url);
>> 
>> 
>> 
>>     QString filePath = QString::fromNSString(url.path);
>> 
>>     qDebug("filePath %s", filePath.toLatin1().data());
>> 
>> 
>> 
>>     QFileOpenEvent *fileOpenEvent = new QFileOpenEvent(filePath);
>> 
>>     QCoreApplication::postEvent(QCoreApplication::instance(),
>> fileOpenEvent);
>> 
>> 
>> 
>>     return YES;
>> 
>> }
>> 
>> 
>> 
>> @end
>> 
>> 
>> 
>> 
>> On Nov 13, 2015, at 12:24 PM, maitai <maitai at virtual-winds.org> wrote:
>> 
>> Hello all,
>> 
>> Since I updated to 5.5, I cannot launch my application by opening an 
>> email
>> attachment or such methods, for file extensions that have been 
>> registered
>> for my app in info.plist
>> 
>> I can open the documents only if the app is already running.
>> 
>> I can see in the app's log the following message:
>> 
>> (...)
>> Nov 13 19:03:39 iPad-maitai com.apple.mdt[483] <Notice>: Copy
>> /var/mobile/Library/Mail/IMAP-xxxxxx at gmail.com@imap.gmail.com/INBOX.imapmbox/Attachments/2126/2/530_1.KAP
>> ->
>> /private/var/mobile/Containers/Data/Application/53F9684F-8FF2-4A10-A9BD-87A93C97FB11/Documents/Inbox
>> Nov 13 19:03:39 iPad-maitai kernel[0] <Notice>: xpcproxy[484] 
>> Container:
>> /private/var/mobile/Containers/Data/Application/53F9684F-8FF2-4A10-A9BD-87A93C97FB11
>> (sandbox)
>> Nov 13 19:03:39 iPad-maitai qtVlm[484] <Warning>:
>> didFinishLaunchingWithOptions option happen
>> Nov 13 19:03:39 iPad-maitai qtVlm[484] <Warning>: url received:
>> /private/var/mobile/Containers/Data/Application/53F9684F-8FF2-4A10-A9BD-87A93C97FB11/Documents/Inbox/530_1.KAP
>> Nov 13 19:03:40 iPad-maitai kernel[0] <Notice>: Sandbox: qtVlm(484) 
>> deny(1)
>> file-read-data /dev/tty
>> Nov 13 19:03:40 iPad-maitai qtVlm[484] <Warning>: qwarning received:
>> starting up nslogmessage
>> Nov 13 19:03:40 iPad-maitai qtVlm[484] <Warning>: qwarning received: 
>> step 2
>> Nov 13 19:03:40 iPad-maitai qtVlm[484] <Warning>: qwarning received: 
>> step 3
>> Nov 13 19:03:40 iPad-maitai qtVlm[484] <Warning>: qwarning received: 
>> step 4
>> Nov 13 19:03:40 iPad-maitai qtVlm[484] <Warning>: <CATransformLayer:
>> 0x15da1ee0> - changing property masksToBounds in transform-only layer, 
>> will
>> have no effect
>> Nov 13 19:03:40 iPad-maitai qtVlm[484] <Warning>: <CATransformLayer:
>> 0x15da4680> - changing property masksToBounds in transform-only layer, 
>> will
>> have no effect
>> Nov 13 19:03:40 iPad-maitai qtVlm[484] <Warning>: <CATransformLayer:
>> 0x15d50730> - changing property masksToBounds in transform-only layer, 
>> will
>> have no effect
>> Nov 13 19:03:40 iPad-maitai qtVlm[484] <Warning>: qwarning received: 
>> step 5
>> just before qApp->exec()
>> Nov 13 19:03:41 iPad-maitai kernel[0] <Notice>: 024305.657672 
>> wlan0.W[123]
>> AWDL MODE: OFF
>> Nov 13 19:03:57 iPad-maitai backboardd[63] <Warning>: CoreAnimation: 
>> updates
>> deferred for too long
>> Nov 13 19:03:59 iPad-maitai SpringBoard[48] <Warning>: Forcing crash 
>> report
>> of <FBApplicationProcess: 0x192412a0; qtVlm; pid: 484> (reason: 1,
>> description: com.meltemus.qtvlm failed to scene-create after 19.68s 
>> (launch
>> took 0.32s of total time limit 20.00s))
>> (...)
>> 
>> The full story is that I override QIOSApplicationDelegate to be able 
>> to
>> manage didFinishLaunchingWithOptions and openUrl methods, but even if 
>> I
>> remove my implementations and let Qt regular QIOSApplicationDelegate 
>> load, I
>> get the same crash. I can see that main.cpp reaches the point where it 
>> calls
>> qApp->exec() and stays stuck there until a timeout of some sort 
>> occurs. I
>> can see that didFinishLaunchingWithOptions is called if I activate my 
>> own
>> delegate, as you can read from the log. But anyway with or without my 
>> own
>> delegate, I get this crash when I launch the app through a file 
>> opening.
>> What is this message about CoreAnimation taking too long that I don't 
>> get
>> when I launch the app normally?
>> 
>> If I launch the application by clicking on the icon, it works and 
>> takes less
>> than 2secs to load, and it will even accept all incoming files through
>> openUrl. didFinishLaunchingWithOptions is called at startup too, but 
>> with no
>> url as expected.
>> 
>> I am sure that was working before with qt 5.4.2.
>> 
>> What should I do to make this working? And btw what is the recommended 
>> way
>> to override QIOSApplicationDelegate in order not to be annoyed each 
>> time a
>> new qt version is released, and still be able to handle openUrl and 
>> such?
>> 
>> Thanks in advance
>> Philippe Lelong
>> _______________________________________________
>> Interest mailing list
>> Interest at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/interest
>> 
>> 
>> This email and any files transmitted with it from The Charles Machine 
>> Works,
>> Inc. are confidential and intended solely for the use of the 
>> individual or
>> entity to which they are addressed. If you have received this email in 
>> error
>> please notify the sender. Our company accepts no liability for the 
>> contents
>> of this email, or for the consequences of any actions taken on the 
>> basis of
>> the information provided, unless that information is subsequently 
>> confirmed
>> in writing. Please note that any views or opinions presented in this 
>> email
>> are solely those of the author and do not necessarily represent those 
>> of the
>> company. Finally, the recipient should check this email and any 
>> attachments
>> for the presence of viruses. The company accepts no liability for any 
>> damage
>> caused by any virus transmitted by this email.
>> 
>> _______________________________________________
>> Interest mailing list
>> Interest at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/interest
>> 
>> This email and any files transmitted with it from The Charles Machine 
>> Works,
>> Inc. are confidential and intended solely for the use of the 
>> individual or
>> entity to which they are addressed. If you have received this email in 
>> error
>> please notify the sender. Our company accepts no liability for the 
>> contents
>> of this email, or for the consequences of any actions taken on the 
>> basis of
>> the information provided, unless that information is subsequently 
>> confirmed
>> in writing. Please note that any views or opinions presented in this 
>> email
>> are solely those of the author and do not necessarily represent those 
>> of the
>> company. Finally, the recipient should check this email and any 
>> attachments
>> for the presence of viruses. The company accepts no liability for any 
>> damage
>> caused by any virus transmitted by this email.
>> 
>> _______________________________________________
>> Interest mailing list
>> Interest at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/interest
>> 
>> 
>> This email and any files transmitted with it from The Charles Machine 
>> Works,
>> Inc. are confidential and intended solely for the use of the 
>> individual or
>> entity to which they are addressed. If you have received this email in 
>> error
>> please notify the sender. Our company accepts no liability for the 
>> contents
>> of this email, or for the consequences of any actions taken on the 
>> basis of
>> the information provided, unless that information is subsequently 
>> confirmed
>> in writing. Please note that any views or opinions presented in this 
>> email
>> are solely those of the author and do not necessarily represent those 
>> of the
>> company. Finally, the recipient should check this email and any 
>> attachments
>> for the presence of viruses. The company accepts no liability for any 
>> damage
>> caused by any virus transmitted by this email.
>> 
>> 
>> _______________________________________________
>> Interest mailing list
>> Interest at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/interest
>> 
>> 
>> _______________________________________________
>> Interest mailing list
>> Interest at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/interest
>> 



More information about the Interest mailing list