我有一个与我的应用程序同步的非常特殊的问题,我想与您分享并获得一些希望能帮助我解决它的想法。
我正在开发一个基本上做两件事的应用程序:
1)在AppDelegate
注册推送通知。
2)在ViewController
中打开webView并加载URL。加载的URL的格式总是如下所示:http://.www.thisIsMyUrl.com/UDID
,其中UDID是用户唯一标识符。
在didRegisterForRemoteNotificationsWithDeviceToken:
我正在注册一个令牌,在我收到它之后,在这个函数中我向我的服务器发出一个http请求,我发送推送令牌和UDID。
因此,在didRegisterForRemoteNotificationsWithDeviceToken
的{{1}}和AppDelegate
中我正在检索UDID并按照我的描述使用它。
直到上周的一切都完美无缺。但是现在Apple决定拒绝任何使用UDID的应用程序。因此,我的方法是使用CFUUID创建一个唯一的标识符并将其保存到Key Chain。
问题:
如您所见,我在AppDelegate的ViewController
函数中使用唯一标识符didRegisterForRemoteNotificationsWithDeviceToken
内部。但是它必须只在其中一个控制器中创建,否则它将是不同的! (请记住,使用UDID + dateNtime创建CFUUID字符串。)
我应该在哪里创建它? ViewController
是异步的,所以如果我在那里检索它,viewController将在唯一标识符到达之前很久就发出http请求,它将使用didRegisterForRemoteNotificationsWithDeviceToken
代替。 null
可能会发生同样的情况。如果我尝试在那里创建它,可能会更快地调用ViewController
函数并尝试在我的数据库中注册一个didRegisterForRemoteNotificationsWithDeviceToken
唯一标识符。
那么我在哪里可以尝试创建CFUUID字符串并确保所有控制器都能按时获得它?
一个刚刚出现的想法。如果我在null
的{{1}}函数内创建CFUUID怎么办?如果我没有弄错的话,这部分代码将先运行 FIRST 。所以不会出现任何同步问题,因为我会在任何需要它的地方安全地传递它。正确?
答案 0 :(得分:0)
正如你所说,didFinishLaunchingWithOptions
是启动应用程序时第一个执行的方法。
如果您在此方法开头创建CFUUID
,则在注册推送通知之前,当您从Apple收到设备令牌时(调用didRegisterForRemoteNotificationsWithDeviceToken
时),它将具有一个值,并且当您打开webView
时,它会有一个值。