使用Parse和Xamarin.iOS注册推送通知的iOS设备

时间:2015-10-17 17:06:50

标签: c# iphone parse-platform xamarin xamarin.ios

使用Xamarin.iOS时,我在使用Parse Push注册iOS设备时遇到问题。我可以使用Parse REST API curl命令手动注册我的设备,并可以接收推送通知。但是,我的应用程序/设备在运行时无法自行注册。

我按照本教程,从开始到完成几次步骤 - https://www.parse.com/tutorials/ios-push-notifications

在我的Xamarin App中,基于此处提供的Parse代码示例,我有正确的实现 - https://github.com/ParsePlatform/PushTutorial/blob/master/Xamarin/ParseXamarinPushSample/AppDelegate.cs

所有东西都可以构建,编译和部署。在某些时候调用了RegisteredForRemoteNotifications,我可以将设备令牌输出到控制台。

为了让我手动注册我的设备,我使用此令牌以及其他键并发出以下curl命令:

curl -X POST \
-H "X-Parse-Application-Id: <Your Parse app ID> " \
-H "X-Parse-REST-API-Key: <Your parse REST API key>" \
-H "Content-Type: application/json" \
-d '{
    "deviceType": "ios",
    "deviceToken": "<Your device token>",
    "channels": [
      ""
    ]
  }' \
https://api.parse.com/1/installations

只有在这一点上我才能看到我的设备在Parse Push门户中注册。此时我可以发送推送通知并接收它们。如果我卸载应用程序并重新部署,那么我的设备令牌当然是新的,我必须重新发出curl命令来注册这个设备,这在大规模上不太实用。

可能出现什么问题?

回顾一下:

1)如果我在RegisterForRemoteNotifications中运行调试代码时手动发出带有我的设备令牌的REST API curl命令,我可以收到推送通知。

2)我已经按照Parse教程创建证书等,所有内容都表明在Apple Developer门户上有效。我使用正确的配置文件签署我的应用程序,info.plist文件反映了正确的Bundle Identifier,并在Info.plist的Background Modes部分中配置了“Enable Background Modes”和“Remote Notifications”。

3)我模拟了Apple指出的“24小时应用程序卸载”可能是罪魁祸首。我卸载了应用程序,将日期提前设置为iPhone上的25小时,关闭手机并重新启动并安装。

旁注 - 我发现了一个类似的问题,但似乎没有用parse.com标记,所以我希望这个正确标记的问题能得到解析和xamarin社区的帮助。堆栈溢出问题在这里 - No Devices Registered with Parse Push and Xamarin IOS

更新:所以我终于让我的设备注册,但采用了完全不同的方式。这就是我的RegisteredForRemoteNotifications现在的样子。 (注意:我正在使用Parse 1.5.5,因为在撰写本文时,新版本不起作用。目前最新版本是1.6.2。

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken) {
        ParseObject obj = ParseObject.Create ("_Installation");

        string dt = deviceToken.ToString ().Replace ("<", "").Replace (">", "").Replace (" ", "");
        obj["deviceToken"] = dt;
        obj.SaveAsync ().ContinueWith (t => {
            if (t.IsFaulted) {
                using (IEnumerator<System.Exception> enumerator = t.Exception.InnerExceptions.GetEnumerator()) {
                    if (enumerator.MoveNext()) {
                        ParseException error = (ParseException) enumerator.Current;
                        Console.WriteLine ("ERROR!!!: " + error.Message);
                    }
                }
            } else {
                Console.WriteLine("Saved/Retrieved Installation");
                var data = NSUserDefaults.StandardUserDefaults;
                data.SetString ("currentInstallation", obj.ObjectId);
                Console.WriteLine("Installation ID = " + obj.ObjectId);
            }
        });
    }

我仍然想知道为什么我们不能做

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken) {
  ParseInstallation installation = ParseInstallation.CurrentInstallation;
  installation.SetDeviceTokenFromData(deviceToken);

  installation.SaveAsync();
}

但是现在我有一些有用的东西。

0 个答案:

没有答案