sinaweibosdk / weibo_ios_sdk

新浪微博 IOS SDK
http://weibo.com
Other
1.44k stars 565 forks source link

registerAppWithApp使用UIPastboard导致主线程卡死 #412

Closed everettjf closed 4 years ago

everettjf commented 5 years ago

+[WeiboSDK registerAppWithApp:] 中使用UIPastboard导致主线程卡死

0 libsystem_kernel.dylib _semaphore_wait_trap (in libsystem_kernel.dylib)
1 libdispatch.dylib __dispatch_semaphore_wait_slow (in libdispatch.dylib)
2 UIKit __existingItemCollectionWithName (in UIKit)
3 UIKit + [_UIConcretePasteboard _pasteboardNamed:createIfNotFound:] (in UIKit)
4 UIKit +[UIPasteboard(Private) _pasteboardWithName:create:] (in UIKit)
5 XXX +[WeiboSDK registerAppWithApp:] (in XXX) WeiboSDK.m:1078
6 XXX +[WeiboSDK registerAppWithAppKey:] (in XXX) WeiboSDK.m:1130
...

虽然我们使用的老版本,但新版本看仍然存在UIPastboard的使用。

  1. 这个卡死不是必然的,大概万一的卡死率。
  2. 应该是苹果的坑。
  3. 可能和universal pastboard有关。

建议:

  1. registerAppWithApp 中不要调用UIPastboard相关代码。
  2. 如果必须调用 UIPastboard,那放入子线程调用。(虽然是UI开头的)这样可能带来一些闪退,但比卡死要少很多。
everettjf commented 5 years ago

汇总下我考虑的解决方法:

方法一:

  1. registerAppWith... 方法支持在子线程调用。
  2. 评估下内部有无其他必须在主线程执行的方法,如果有,需要修改发版本。如果没有,那看来可以不用发新版本。

方法二:

  1. registerAppWith... 内部把UIPastboard的逻辑放入子线程。
  2. registerAppWith 内部处理好逻辑,保证功能不受影响。

方法三:

  1. 删除UIPastboard的相关代码。
Lakr233 commented 5 years ago

你越狱了么?这个问题在iOS12.4被修了

everettjf commented 5 years ago

@Co2333 线上监控的,没有修复吧。iOS12.4.1 和13 都还有这个问题呀

Lakr233 commented 4 years ago

那么回头说一下【内部把UIPastboard的逻辑放入子线程】这个事情,在我遇到这个问题的时候,同时会导致子线程和SpringBoard同时锁死。。。。。。。。。。。

因为之前在想有没有简单的办法在Sandboxed App和Root Daemon之间传送消息就用了UIPastBoard,后来发现了锁死的问题就干了点Play Around最后没找到Solution。。。。但是12.4奇迹般地没这个问题了。。。

everettjf commented 4 years ago

@Co2333 那是两个问题了。一个正向,一个逆向了。

everettjf commented 4 years ago

close了

svenJamy commented 3 years ago

好像没有微博还没有解决这个问题?

Lakr233 commented 3 years ago

好像没有微博还没有解决这个问题?

你把蓝牙关掉看下他好了没 没好关掉wifi看下 再没好退出iCloud

如果以上任意一条方法奏效那都是handoff整劈叉了