摘要:在 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 上。
重现步骤:
使用以下命令生成新应用:
$ sencha generate app -path /Library/WebServer/Documents/SchemeTest
根据上面链接的文档添加
'Ext.device.Device'
到requires:
应用程序的属性。将以下代码添加到 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);
通过将以下行添加到:指定自定义 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>"
这将导致表单的 URL
sencha:HereIsMyURL
在 iOS 设备或 iOS 模拟器上打开您的应用程序。使用以下命令在 iOS 模拟器中运行应用程序:
$ sencha package run packager.json
该应用程序将在 iOS 模拟器中启动,并将显示 URL 方案为 false,因为该应用程序尚未使用自定义 URL 启动:
单击“确定”关闭警报对话框,然后按 iOS 模拟器上的“主页”按钮将应用程序移至后台。打开 Mobile Safari 并输入 URL
sencha:HereIsMyURL
并按 Enter 或单击 Go 按钮以恢复应用程序:该应用程序将重新打开,您将看到 URL 已正确传入:
点击 iOS 模拟器上的 Home 按钮,然后双击 Home 按钮并在“我的应用程序”图标上按住鼠标按钮,直到图标开始抖动。使用红色“-”彻底杀死“我的应用程序”,使其不再运行:
再次按 Home 按钮,然后返回 Mobile Safari 并重新输入 URL
sencha:HereIsMyURL
,然后按 Enter 或单击 Go 按钮启动应用程序。该应用程序将启动,但
Ext.device.Device.scheme
仍为 false,因此无法检索 URL。(可选)
packager.json
使用有效的applicationName, applicationId, bundleSeedId, certificateAlias
and配置您的文件,provisionProfile
并将. 然后使用 为您的真实 iOS 设备重建您的本机应用程序,使用 XCode 将应用程序复制到您的设备,并在真实设备上重复步骤 7 到 11。结果是一样的。platform
iOS
$ 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。