草庐IT

ios - 推送通知不只从我的设备发送 - 解析

coder 2023-09-17 原文

我有一个应用程序目前处于 Beta 测试阶段,它具有消息传递功能。它设置为在用户收到来自另一个用户的新消息时发送推送通知。推送通知唯一有效的时间是用户专门向我发送消息时。如果我尝试向任何其他用户发送消息或任何不包括我的用户相互发送消息,推送通知将不起作用。只有发送给我的消息才会在我的设备上触发推送通知。

以下是 Parse 的一些简单屏幕截图,显示了一个正确发送的推送和一个没有发送的推送。

这是从另一个名为“Alissa”的用户发送给我的私有(private)消息,我在其中正确接收了推送通知(如“推送发送”= 1 所示):



以下是上述推送的详细信息:



现在,这是从我的设备发送的私有(private)消息,与正确接收推送通知的设备相同,返回“Alissa”。如您所见,“推送已发送”= 0,这意味着我的设备发送了消息,但收件人没有收到推送通知:



这是该推送的详细信息,其中包含与发送给我的工作中的信息几乎相同的信息:



最后,这是在“Alissa”和不是我的另一个用户之间发送的另一个无法正常工作的推送,因此有 2 个用户与我的设备分开。




这是我查看应用程序中用户的所有推送列表时的模式。他们都有“推送发送”= 0,除了当推送发送到我的设备时,“推送发送= 1”。

我已经在我的推送通知方法完成处理程序中打印到控制台,当我向另一个用户发送消息时,它们表明推送已成功发送。我还将指出我的设备正在用于开发此应用程序。

另外作为旁注,它并不总是像这样。几周前,一切正常。我发布了多个新版本,从来没有遇到过问题。

任何人都可以在这里指导我正确的方向吗?

Edit: Below I've included more details including code in my app and details of my developer account and Parse backend.



我的应用程序中的相关代码

以下是我在 AppDelegate 中的代码,由 Parse 推荐,用于设置推送通知。值得注意的是println语句“did register user notification settings”和“did register for remote notification with device token”都在应用程序启动时正确记录。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // ...
    let userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge
    let settings = UIUserNotificationSettings(forTypes: userNotificationTypes, categories: nil)
    application.registerUserNotificationSettings(settings)
    application.registerForRemoteNotifications()
    // ...
}

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
    println("did register user notification settings")
}

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    PFInstallation.currentInstallation().setDeviceTokenFromData(deviceToken)
    PFInstallation.currentInstallation().saveInBackground()
    println("did register for remote notifications with device token")
}

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    println("didFailToRegisterForRemoteNotificationsWithError: ", error.localizedDescription)
}

这是我在向另一个用户发送消息时包含的代码。 println也不值钱语句“成功”已正确记录。
    PFInstallation.query().whereKey("user", equalTo: incomingUser)

    PFPush().setQuery(pushQuery)
    let senderName = PFUser.currentUser()!.objectForKey("name") as! String
    let data = [
        "alert" : "New message from \(senderName)",
        "badge" : "Increment"
    ]
    push.setData(data)
    push.sendPushInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in
        if success {
            println("success")
        } else {
            println(error?.localizedDescription)
        }
    }

来自我的开发者帐户的相关详细信息

这是在我的开发人员门户中显示我的 App ID 的屏幕截图。它似乎表明推送通知已正确启用(我删除并使用新的配置文件重新添加了所有证书)



来自我的 Parse 帐户的相关详细信息

这是我在 Parse 中的推送通知设置。所有这些信息都是昨天在我重新创建证书时更新的。



这可能会提供一定程度的洞察力,尽管我不确定是什么。这是我在 Parse 中的 PFInstallations 表的屏幕截图。每当有人登录/打开应用程序时,就会创建安装。我刚刚在我的设备上运行了应用程序,我在表中的记录是最上面的。与其余部分不同的是,“deviceToken”列中有一个仅适用于我的设备的值。当我删除我的 PFInstallation 记录并重新启动应用程序以重新创建它时,总会在“deviceToken”下创建一个值。



来自Xcode的相关细节

这是我的 Xcode build设置中代码签名的扩展 View 。此代码签名在项目和目标代码签名中是相同的。




同样,推送通知适用于所有向其他用户发送消息的用户,只有在从我的设备向任何其他用户发送消息时才有效。

最佳答案

从使您的设备与众不同的原因开始,它作为开发环境设备的状态可能是罪魁祸首。

检查设备的构建和随后使用的推送证书是一个很好的检查位置。如果您的设备处于开发模式(意味着您正在通过 Xcode 构建和部署到您的手机),那么它将使用推送证书进行开发而不是生产。 (有关此差异的更多信息,请参阅 this great article by Ray Wenderlich )

这里的关键因素是只有您的设备会使用这个不同的证书。如果它被撤销/损坏/未安装,则只有您的设备会出现此问题。

您还可以通过 TestFlight/HockeyApp/等将应用程序部署到您的手机来测试这一点,而不是让 Xcode 加载它。

更新:

只是倒在代码上,检查错误。一件事已经值得注意:您的 didFinishLaunchingWithOptions包括一个额外的 PFInstallation.currentInstallation().saveInBackground() - 你应该删除它,并且只在 didRegisterForRemoteNotificationsWithDeviceToken 中有它方法。

这就是为什么只有您的设备在它的 PFInstallation 中有一个 ID,并且可能是为什么您的设备无法访问其他任何人的原因 - 推送系统正在工作,但没有可以从那里调用的地址;这将是推送时的静默失败,而不是解析系统。

您是否尝试过让您的用户相互发送推送,或者只发送给您和您发送?

关于ios - 推送通知不只从我的设备发送 - 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31549081/

有关ios - 推送通知不只从我的设备发送 - 解析的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  5. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  6. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  7. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  8. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  9. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  10. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

随机推荐