2

摘要:在 Sencha Touch 2.1(和 2.2alpha)中成功创建了一个带有自定义 URL 方案的原生 iOS 应用程序。在 iOS 模拟器和真实设备上,使用自定义 URL 从冷启动应用程序不会将 URL 传递给应用程序(Ext.device.Device.scheme始终false,无论您是否使用自定义 URL 启动应用程序)。但是,如果应用程序已经在后台运行,则用于恢复它的自定义 URL 将成功传递给schemeupdate事件。从冷启动的行为与文档不一致,当应用程序从冷启动时,我需要一种解决方法来获取自定义 URL。

详情

按照http://docs.sencha.com/touch/2-1/#!/api/Ext.device.Device上的说明为我的原生 iOS 应用程序指定自定义方案 URL。我正在使用 XCode 4.5.1 在 OS X Lion 上构建。

这发生在 Sencha Touch 2.1 和 2.2alpha 以及 iOS 5 和 iOS 6 上。

重现步骤:

  1. 使用以下命令生成新应用:

    $ sencha generate app -path /Library/WebServer/Documents/SchemeTest
    
  2. 根据上面链接的文档添加'Ext.device.Device'requires:应用程序的属性。

  3. 将以下代码添加到 app.js 中的启动函数中:

    alert("Scheme is " + Ext.device.Device.scheme);
    
    if (Ext.device.Device.scheme) {
        // the application was opened via another application. Do something:
        alert('Applicaton pened via another application: ' + Ext.device.Device.scheme.url);
    }
    
    // Listen for future changes
    Ext.device.Device.on('schemeupdate', function(device, scheme) {
        // the application was launched, closed, and then launched another from another application
        // this means onReady wont be called again ('cause the application is already running in the 
        // background) - but this event will be fired
        alert('Applicated reopened via another application: ' + scheme.url);
    }, this);
    
  4. 通过将以下行添加到:指定自定义 URL 方案packager.json

    "rawConfig": "<key>CFBundleURLTypes</key><array><dict><key>CFBundleURLSchemes</key><array><string>sencha</string></array><key>CFBundleURLName</key><string>com.sencha.example</string></dict></array>"
    

    这将导致表单的 URLsencha:HereIsMyURL在 iOS 设备或 iOS 模拟器上打开您的应用程序。

  5. 使用以下命令在 iOS 模拟器中运行应用程序:

    $ sencha package run packager.json
    
  6. 该应用程序将在 iOS 模拟器中启动,并将显示 URL 方案为 false,因为该应用程序尚未使用自定义 URL 启动:

    没有 URL 方案的应用程序启动

  7. 单击“确定”关闭警报对话框,然后按 iOS 模拟器上的“主页”按钮将应用程序移至后台。打开 Mobile Safari 并输入 URLsencha:HereIsMyURL并按 Enter 或单击 Go 按钮以恢复应用程序:

    使用 URL 方案的应用程序简历

  8. 该应用程序将重新打开,您将看到 URL 已正确传入:

    传递给恢复应用的 URL 参数

  9. 点击 iOS 模拟器上的 Home 按钮,然后双击 Home 按钮并在“我的应用程序”图标上按住鼠标按钮,直到图标开始抖动。使用红色“-”彻底杀死“我的应用程序”,使其不再运行:

    杀死正在运行的应用程序

  10. 再次按 Home 按钮,然后返回 Mobile Safari 并重新输入 URL sencha:HereIsMyURL,然后按 Enter 或单击 Go 按钮启动应用程序。

  11. 该应用程序将启动,但Ext.device.Device.scheme仍为 false,因此无法检索 URL。

    应用程序从 URL 方案冷启动

  12. (可选)packager.json使用有效的applicationName, applicationId, bundleSeedId, certificateAliasand配置您的文件,provisionProfile并将. 然后使用 为您的真实 iOS 设备重建您的本机应用程序,使用 XCode 将应用程序复制到您的设备,并在真实设备上重复步骤 7 到 11。结果是一样的。platformiOS$ sencha package build packager.json

这意味着只有当应用程序已经在后台运行时才能检索自定义 URL。使用自定义 URL 从冷启动应用程序时,应用程序无法正确检测到已使用自定义 URL 方案,因此无法将信息传递给应用程序。有谁知道这个的解决方法?

我已经提交了一份错误报告,可以在http://www.sencha.com/forum/showthread.php?254153-ST-2.1-and-2.2alpha-Ext.device.Device.scheme-is-false-看到on-launch-from-custom-URL

4

0 回答 0