在 Firebase Cloud Messaging 上订阅数百个主题时,iOS 应用程序崩溃
Posted
技术标签:
【中文标题】在 Firebase Cloud Messaging 上订阅数百个主题时,iOS 应用程序崩溃【英文标题】:iOS app crashes when subscribing hundred of topics on Firebase Cloud Messaging 【发布时间】:2016-07-19 21:14:12 【问题描述】:我使用 FCM 来处理我的 ios 应用程序中的通知。一切正常,但是当我必须同时处理大约 300 - 400 个主题订阅时遇到了问题。 当我启动我的应用程序时,这个函数被调用了大约 400 次:
FIRMessaging.messaging().subscribeToTopic("/topics/\(nameoftopic)")
但在调用了大约 300 次后,应用程序崩溃了,调试器没有消息。 我认为崩溃与内存泄漏有关,但我不确定。
谁能帮助我?谢谢!
更新
在模拟器上运行应用程序使用 Instruments 的分配工具后,我发现了一些有趣的东西。
注意:如果我在模拟器中使用该应用程序,它不会崩溃。
这是我的应用在调用“订阅400个主题”功能之前的情况:
下面是app调用“订阅400个主题”函数后的情况:
如您所见,使用了很多内存,例如图像中的 Malloc 3,00 kib 记录,保留了大约 424 MiB!
有没有办法解决这个问题?谢谢!
更新:
主题的订阅是通过对我的应用程序内的 WKWebView 的 javascript 调用触发的。 特别是:
-
用户将他的凭据插入到 WkWebView 中
登录后,网站进入 WkWebView 会启动一个 javascript 函数,该函数调用一个订阅主题的原生 iOS 函数
网站启动javascript函数约400次(每个主题一次调用订阅)。
我尝试评论javascript函数调用的本机iOS函数(订阅主题),但应用程序不断崩溃。
所以,我认为问题与被调用 400 次的 javascript 桥接(从 webview 调用的 javascript 函数调用本机函数)有关,而不是直接与订阅多个主题有关。
编辑:
这是崩溃日志:
Incident Identifier: 431E0DD6-8AEC-4614-B417-3320FB08C2B4
CrashReporter Key: d651543acfe23fc7feac21ffef17bfcbc8d222b3
Hardware Model: iPad2,2
OS Version: iPhone OS 8.1.3 (12B466)
Kernel Version: Darwin Kernel Version 14.0.0: Mon Jan 12 21:30:11 PST 2015; root:xnu-2783.3.26~3/RELEASE_ARM_S5L8940X
Date: 2016-07-21 10:18:37 +0200
Time since snapshot: 68 ms
Free pages: 1092
Active pages: 3736
Inactive pages: 1929
Speculative pages: 147
Throttled pages: 100888
Purgeable pages: 0
Wired pages: 20866
File-backed pages: 5413
Anonymous pages: 399
Compressions: 12087
Decompressions: 4011
Compressor Size: 63
Uncompressed Pages in Compressor: 0
Page Size: 4096
Largest process: TestApp
Processes
Name | <UUID> | CPU Time| rpages| purgeable| recent_max| lifetime_max| fds | [reason] | (state)
swcd <e22b9809b0b83a3d822cdd499e630b44> 0.089 153 0 - 529 50 [vm-pageshortage] (daemon)
nsurlsessiond <d04dc25e93283de3b7ee8db12bd33953> 0.794 336 0 - 1543 50 [vm-pageshortage] (daemon)
debugserver <ef1b24f73ea43149b0666ea20e5f7dda> 1.770 154 0 +8 679 50 [vm-pageshortage] (daemon)
kbd <008376fef2c13eab9d7b6cd71eacf1d7> 3.369 553 0 - 2063 50 [vm-pageshortage] (daemon)
tccd <1c3b7672d405345a9599a9165b4e9672> 3.334 197 0 - 854 50 (daemon)
lsd <18a22fa1c3ba3aa0871ad1843aa4c847> 2.169 269 0 - 1225 50 (daemon)
com.apple.WebKit <509457e569a934bc8289a7a1b8943347> 3.089 2453 0 +55 3493 50 (frontmost)
com.apple.WebKit <509457e569a934bc8289a7a1b8943347> 7.421 18667 0 - 17412 50 (frontmost)
TestApp <de60e10c4dca3921ad7cc901b68dc71f> 11.944 53345 0 - 53845 50 (frontmost) (resume)
ptpd <899195f7d556391998a2cacb7371751c> 1.522 801 0 - 1715 50 (daemon)
BTServer <24daf6f44d893f6daf5a680c92b63fc7> 2.992 350 0 - 1482 50 (daemon)
lockdownd <2da4a7e0dd1a35b9ae05f52e8d5aad3a> 16.308 215 0 - 1019 50 (daemon)
discoveryd <7b61a3893f0f3f2ca2227304d7fc0a05> 55.199 661 0 - 1942 400 (daemon)
wifid <b9f927d2166a35ddbcddfc792aa06a88> 46.416 422 0 - 1352 50 (daemon)
locationd <0017f8e9b9803dc7b82ab6c21acb6487> 563.557 1491 0 - 4018 50 (daemon)
imagent <2db1206e12ef30fe833d30a6857badf9> 10.430 486 0 - 1964 50 (daemon)
identityservices <235ad60b31753ba39ca43729cbac31fd> 14.170 473 0 - 2232 50 (daemon)
syslogd <21614327a5913635bf8bc2272aab94ae> 47.307 197 0 - 1426 50 (daemon)
iaptransportd <8ee55cf028c0311b939e0113712a1344> 7.143 301 0 - 803 50 (daemon)
mediaserverd <951ab0492a0c3a119805c38697cf67e7> 101.623 921 0 - 2603 50 (daemon)
cfprefsd <77e3ddae064b3007a4f5d13522c29767> 57.303 313 0 - 707 50 (daemon)
powerd <496f3f6fd0173e5d8ca1dfceadc76dd1> 24.261 217 0 - 460 50 (daemon)
networkd <385c01062c27379d883f244a17aaf235> 86.147 672 0 - 1723 50 (daemon)
apsd <8da1c66348543d4ebd72e810fc2f36e0> 38.871 576 0 - 1737 100 (daemon)
dataaccessd <a7a7f65633c03d5985c23a80b0db4c97> 10.382 596 0 - 2042 50 (daemon)
iapd <03badd6a166c3daf934c29ce1d86e128> 9.314 435 0 - 1542 50 (daemon)
CommCenterMobile <0fd2ae4f78ae3df3830cdd46aa29b06c> 0.732 336 0 - 1304 50 (daemon)
searchd <9d6bf30189a23d6d959aaf2c08c19607> 1.100 724 0 - 2523 50 (daemon)
mediaremoted <5a7484513dca313997af39582eb8cc8f> 0.720 216 0 - 1050 50 (daemon)
syncdefaultsd <b377e47d27323a97b4a00d85e6af8530> 0.245 297 0 - 1068 50 (daemon)
securityd <9f54dbee58003edc82e0648fad2f75f8> 3.328 575 0 - 1412 50 (daemon)
SpringBoard <a09599dad0b73d488762bbf4df172b0a> 649.777 5161 0 - 13265 50
backboardd <119c485cefcd3127a318d4fc1636dbeb> 2110.390 7113 0 - 4717 50 (daemon)
UserEventAgent <736bfc71654a3e1284af9976c16a00a5> 200.859 740 0 - 2351 100 (daemon)
configd <8df7332b99003995862643fdbb1c8b00> 31.570 397 0 - 1203 50 (daemon)
fseventsd <a366dd315e273afc96084abc8f6f1c3e> 14.679 318 0 - 837 50 (daemon)
fairplayd.A1 <f3eaf6eefeea37378292c8cf9eaab5ac> 20.154 144 0 - 1469 50 (daemon)
assertiond <b5cb3ee93d6a32b1a08fbf075ae23191> 18.089 267 0 - 936 50 (daemon)
distnoted <42234e3ec6563c7dac4d510e301f6946> 3.826 157 0 - 263 50 (daemon)
discoveryd_helpe <09b3407bfeff330299a6a84dd8673ac3> 0.419 125 0 - 567 50 (daemon)
filecoordination <4450909aaf823fd1a96a4c94813c9da0> 2.506 212 0 - 784 50 (daemon)
aggregated <6747e33da38f39688022fe05295a7fad> 814.695 999 0 - 1990 50 (daemon)
DTMobileIS <96811bdfb87837499227af222f3d8471> 10.993 463 0 - 1921 50 (daemon)
ubd <44b27d08a6823a859e0ec08131f20be9> 0.194 181 0 - 714 50 (daemon)
accountsd <d18f8d0e475d3dcbac17a98abcdf70e9> 1.345 379 0 - 1005 50 (daemon)
CommCenterClassi <7cdb180802b53bc9bce7cafb749d09ca> 110.886 585 0 - 2352 50 (daemon)
notifyd <1166f790e0e73573afb6b0ff4708366c> 44.864 240 0 - 293 50 (daemon)
xpcproxy <4b3cd1e859d031e4b855c1c48aa1344f> 0.004 16 0 - 52 50 (daemon)
**End**
【问题讨论】:
嘿?您如何询问没有崩溃日志的崩溃? 我已添加崩溃日志,谢谢! 【参考方案1】:您是否每次都订阅?如果是,那么这不应该发生。订阅应该只在用户第一次启动应用程序时发生,并且只有在用户订阅主题时才会发生(即使这样,也只能采取特定的操作)。
如果您的操作需要时间,请将其委托给后台线程。
【讨论】:
不,我只在应用程序第一次启动时订阅主题。无论如何,我会尝试将订阅委托给后台线程,我会告诉你它是否有效!【参考方案2】:您是否将一个类中的强引用变量分配给另一个类中没有以“弱”或“无主”为前缀的另一个变量?这样做会创建一个强大的参考循环,这会蚕食 ARC 的工作记忆。
如果您担心内存泄漏,请使用分配工具,在 Xcode 的顶部菜单中选择“工具”即可访问。或者,您可以使用 Cmd+I 访问仪器。
【讨论】:
谢谢!我会用仪器检查应用程序,看看是否有内存泄漏。 在我的应用上使用 Instruments 后,我更新了我的问题并提供了更多详细信息! 1.需要查看更多代码,马克。 2. 不要用模拟器运行 Instruments,在设备上运行它,以便我们更好地了解实际发生的情况以上是关于在 Firebase Cloud Messaging 上订阅数百个主题时,iOS 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 Firebase Cloud Messaging 控制台的情况下向 Flutter/Firebase Cloud Messaging 上的特定设备发送通知 [重复]
在 iOS 中为 Firebase 使用 Cloud Functions