测试Cordova Firebase插件:可在Android上运行; iOS,没有这种运气...
我已经在开发人员帐户和Mac上创建了必要的ID,证书和私钥,并在Firebase控制台中设置了“ iOS”应用。 仅供参考:在Firebase的Cloud Messaging配置中,我使用的是APN Auth Key方法,而不是dev证书,因为Firebase表示偏好使用Auth Key方法。
因此,我创建了一个新的Cordova应用程序-形象地称为“ pushnotificationsdemo”,这是我用来创建该应用程序,配置FCM并对其进行测试的步骤:
使用Firebase插件创建Cordova应用程序:
cordova —version
8.1.2(cordova-lib@8.1.1)
cordova pushnotificationsdemo com.XXX.pushnotifications.com “Push Notifications Demo”
cd push*
cordova plugin add cordova-plugin-firebase
[将从Firebase控制台下载的“ GoogleService-Info.plist”复制到新的Cordova项目的根文件夹中]
cordova platform add ios
*将cordova-fetch用于cordova-ios@~4.5.4
正在添加ios项目...
为iOS平台创建Cordova项目:
路径:平台/ ios
包装:com.foliagos.pushnotificationsdemo
名称:推送通知演示
使用cordova-ios@4.5.5创建的iOS项目
为ios安装“ cordova-plugin-firebase”
在config.xml中发现插件“ cordova-plugin-whitelist”。将其添加到项目中
为ios安装“ cordova-plugin-whitelist”
将cordova-plugin-whitelist添加到package.json
将“ cordova-plugin-whitelist”的插件信息保存到config.xml
在iOS上准备Firebase
-已检测到保存标志或自动保存
将ios@~4.5.5保存到config.xml文件中... *
在Xcode(版本10.1 )中打开iOS项目:
我正在使用Xcode10,因此在我在那里时,我还将构建类型设置为“旧版”系统(因为Cordova 8.1.2与新的构建系统不兼容):
文件|工作区设置
构建系统:“旧版构建系统”
并且因为我想看到很多调试输出,所以我也在Xcode中设置了它:
并将以下内容添加到“资源”项目文件夹中的“推送通知Demo-Info.plist”文件中:
“ UIBackgroundModes”
,具有以下键:“远程通知”
我还将以下首选项添加到Cordova的config.xml中以关闭云备份:
<preferencename="BackupWebStorage"value="none"/>
现在,我从命令行(使用旧版构建系统)构建新的Cordova应用程序:
cordova build ios --buildFlag='-UseModernBuildSystem=0'
存档已成功构建!
回到Xcode,我构建了应用程序,并将以下内容写入控制台:
11月8日17:50:54推送通知演示[414]:-[I-ACS036002]启用了分析屏幕报告。调用+ [FIRAnalytics setScreenName:setScreenClass:]设置屏幕名称或覆盖默认屏幕类名称。要禁用屏幕报告,请将Info.plist中的标志FirebaseScreenReportingEnabled设置为NO(布尔值)
2018-11-08 17:50:54.312推送通知演示[414:66091] DiskCookieStorage将策略从2更改为0,Cookie文件:file:/// private / var / mobile / Containers / Data / Application / 8AC0457B -0792-4A8F-8FFA-25655DB5DD8A / Library / Cookies / Cookies.binarycookies
2018-11-08 17:50:54.558推送通知演示[414:66091] Apache Cordova本机平台版本4.5.5已启动。
2018-11-08 17:50:54.558推送通知演示[414:66091]多任务->设备:是,应用程序:是
2018-11-08 17:50:54.691使用UIWebView推送通知演示[414:66091]
2018-11-08 17:50:54.697推送通知演示[414:66091] [CDVTimer] [控制台] 0.401020ms
2018-11-08 17:50:54.698推送通知演示[414:66091] [CDVTimer] [handleopenurl] 0.479937ms
2018-11-08 17:50:54.707推送通知演示[414:66091] [CDVTimer] [intentandnavigationfilter] 8.823991ms
2018-11-08 17:50:54.708推送通知演示[414:66091] [CDVTimer] [gesturehandler] 0.429988ms
2018-11-08 17:50:54.708推送通知演示[414:66091]启动Firebase插件
2018-11-08 17:50:54.709推送通知演示[414:66091] [CDVTimer] [firebaseplugin] 0.813961ms
2018-11-08 17:50:54.709推送通知演示[414:66091] [CDVTimer] [TotalPluginStartup] 13.291001ms
2018-11-08 17:50:54.739推送通知演示[414:66091]找到GoogleService-Info.plist,设置:[FIRApp configureWithOptions]
2018-11-08 17:50:54.802推送通知演示[414:66091] [Crashlytics] 3.10.7(130)版
11月8日17:50:55推送通知演示[414]:5.7.0-[Firebase / Analytics] [I-ACS023007] Analytics(分析)v.50101000已启动
11月8日17:50:55推送通知演示[414]:5.7.0-[Firebase / Messaging] [I-FCM001000] FIRMessaging远程通知代理已启用,将使远程通知接收程序处理程序混乱。如果您希望手动集成Firebase Messaging,请将“ FirebaseAppDelegateProxyEnabled”添加到Info.plist中,并将其设置为NO。请按照以下说明进行操作:
https://firebase.google.com/docs/cloud-messaging/ios/client#method_swizzling_in_firebase_messaging
以确保正确的集成。
11月8日17:50:55推送通知演示[414]:5.7.0-[Firebase / Messaging] [I-FCM002023]对象不响应-messaging:didReceiveRegistrationToken:。请实现-messaging:didReceiveRegistrationToken:并随附FCM令牌。
11月8日17:50:55推送通知演示[414]:5.7.0-[Firebase / Analytics] [I-ACS023008]要启用调试日志记录,请设置以下应用程序参数:-FIRAnalyticsDebugEnabled
2018-11-08 17:50:56.008推送通知演示[414:66091]由于页面加载而重置插件。
2018-11-08 17:50:56.165推送通知演示[414:66091]已连接到FCM。
2018-11-08 17:50:56.169推送通知演示[414:66091] InstanceID令牌:e2Ds2K2cQbI:APA91bE…MqU
2018-11-08 17:50:56.358推送通知演示[414:66091]已完成以下任务的加载:file:/// var / containers / Bundle / Application / 39065AA6-1AEA-4EF5-A4D9-009185D6BE6D / Push% 20Notifications%20Demo.app / www / index.html
2018-11-08 17:50:56.373推送通知演示[414:66153] [Fabric]无法下载设置错误Domain = FABNetworkError Code = -5“(null)” UserInfo = {type = 2,request_id = 7f2cefa10b4df773f0466752024ec30a,content_type = application / json; charset = utf-8,status_code = 403}
2018-11-08 17:50:56.537推送通知演示[414:66091]收到的事件:deviceready
该应用程序正在连接的iPhone( iOS版本9.3.5 )上运行,并显示演示Cordova应用程序的“设备就绪”初始屏幕。
现在我应该能够向运行Cordova应用程序的iPhone发送推送通知了?为此,我转到Firebase控制台并发送云消息(我使用的是APNs身份验证密钥),然后在“在设备上测试”选项中指定实例令牌(如上一控制台输出所示)发送给我,在Xcode控制台中获得以下输出:
2018-11-08 18:03:31.091 Push Notifications Demo[414:66091] {
"collapse_key" = "com.XXX.pushnotificationsdemo";
from = 293106682585;
notification = {
body = "Test notification to iOS device";
e = 1;
};
tap = 0;
}
太好了!设备收到通知。但是我没有在设备本身上弹出通知。
注意:该应用未获得使用推送通知的许可(当我使用“ fcm”插件进行测试时,确实收到了此请求)
好,那可能是因为该应用位于前台吗?因此,我按下了iPhone上的“主页”按钮,将其置于背景中,并在Xcode控制台中得到了它:
2018-11-08 18:07:05.856推送通知演示[414:66091]与FCM断开连接
不太好,设备现在已与FCM断开连接!
我将应用重新带回前台,瞧!控制台现在报告:
2018-11-08 18:08:26.581推送通知演示[414:66091]已连接到FCM。
2018-11-08 18:08:26.586推送通知演示[414:66091] InstanceID令牌:e2Ds2K2cQbI:APA91bE…MqU
所以事情进展并不顺利!看来我的Cordova应用程序没有使用APN将通知推送到设备,而是直接使用Firebase(假设:当应用程序在后台且APN可以使用时,Firebase无法处理,因此,没有使用APN)
这是我第二天试图通过Cordova-plugin-firebase来使APN工作(我也尝试过“ fcm”插件,并且也出现了空白),不用说Cordova Android版本已经解决了的盒子。
有人对我在做什么错有任何想法吗?
我用来设置Firebase与iOS一起使用的说明:
答案 0 :(得分:0)
首先,在“ Xcode首选项设置”的“高级位置”下,将构建位置选择为“唯一”。这应该可以帮助您直接从Xcode进行构建。 其次,在FCM注册部分中,为iOS放置一个平台检查器,如果是,则在iOS中寻求通知的许可。这可以使用完成。
func bubbleTappedHandler(sender: UITapGestureRecognizer) {
let touchPoint = sender.location(in: self.tableView)
if let indexPath = tableView.indexPathForRow(at: touchPoint) {
if indexPath == currentSelectedIndexPath {
currentSelectedIndexPath = nil
tableView.reloadRows(at: [indexPath], with: .automatic)
} else {
if (currentSelectedIndexPath != nil){
if let prevSelectedIndexPath = currentSelectedIndexPath {
currentSelectedIndexPath = indexPath
tableView.reloadRows(at: [prevSelectedIndexPath, indexPath], with: .automatic)
}
} else {
currentSelectedIndexPath = indexPath
tableView.reloadRows(at: [indexPath], with: .automatic)
}
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1, execute: { [weak self] in
let currentIndexPath = self?.currentSelectedIndexPath ?? indexPath
self?.tableView.scrollToRow(at: currentIndexPath, at: .top, animated: false)
})
}
}
如果以上两个步骤仍无法解决您的问题,请删除并尝试添加Firebase插件以及iOS平台。应该可以。