[Interest] iOS didFinishLaunchingWithOptions and such

Edward Sutton edward.sutton at subsite.com
Fri Nov 13 19:42:21 CET 2015


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<mailto: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<mailto:var/mobile/Library/Mail/IMAP-xxxxxx at gmail.com>@imap.gmail.com/INBOX.imapmbox/Attachments/2126/2/530_1.KAP<http://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<mailto: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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20151113/aedc332e/attachment.html>


More information about the Interest mailing list