摘要:使用自定义网址方案在Sencha Touch 2.1(和2.2alpha)中成功创建了原生iOS应用。在iOS模拟器和真实设备上,使用自定义网址从冷启动应用程序时,不会将URL传递给应用程序(Ext.device.Device.scheme
始终为false
,无论您是否使用是否自定义URL)。但是,如果该应用已在后台运行,则用于恢复该应用的自定义网址会成功传递到schemeupdate
事件。冷启动行为与文档不一致,我需要一种解决方法,以便在应用程序从冷启动时获取自定义URL。
详情:
按照http://docs.sencha.com/touch/2-1/#!/api/Ext.device.Device上的说明为我的原生iOS应用指定自定义方案网址。我正在使用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);
通过将以下行添加到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>"
这将导致sencha:HereIsMyURL
形式的网址在iOS设备或iOS模拟器上打开您的应用。
使用以下命令在iOS模拟器中运行应用程序:
$ sencha package run packager.json
该应用程序将在iOS模拟器中启动,并显示URL方案为false,因为该应用尚未使用自定义网址启动:
单击“确定”关闭警报对话框,然后按iOS模拟器上的“主页”按钮将应用程序移动到后台。打开Mobile Safari并输入URL sencha:HereIsMyURL
并按Enter或单击Go按钮以恢复应用程序:
应用程序将重新打开,您将看到URL已正确传入:
点击iOS模拟器上的主页按钮,然后双击主页按钮并在“我的应用程序”图标上按住鼠标按钮,直到图标开始抖动。使用红色“ - ”完全杀死“我的应用程序”,以便它不再运行:
再次按“主页”按钮,然后返回到移动版Safari并重新输入网址sencha:HereIsMyURL
,然后按Enter或点击“转到”按钮启动该应用。
该应用将启动,但Ext.device.Device.scheme
仍为false,因此无法检索到该网址。
(可选)使用有效packager.json
和applicationName, applicationId, bundleSeedId, certificateAlias
配置provisionProfile
文件,并将platform
设置为iOS
。然后使用$ sencha package build packager.json
为您的真实iOS设备重建原生应用程序,使用XCode将应用程序复制到您的设备,并在真实设备上重复步骤7到11。结果是一样的。
这意味着只有在应用程序已在后台运行时才能检索自定义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看到。