示例#1
0
 public IOSPushNotificationService SetAPNsServer(APNsServer envType)
 {
     _envType = envType;
     return(this);
 }
        public async Task <APNsResponse> SendAsync(object notification,
                                                   string deviceToken,
                                                   APNsServer envType,
                                                   string apnsId      = null,
                                                   int apnsExpiration = 0,
                                                   int apnsPriority   = 10, //apple官方建議
                                                   bool isBackground  = false)
        {
            var path = $"/3/device/{deviceToken}";
            var json = JsonConvert.SerializeObject(notification);

            //@@test
            //Uri to request
            // var uri = new Uri(string.Format("https://{0}:{1}/3/device/{2}", "api.development.push.apple.com", "443", deviceToken));
            //@@---


            var request = new HttpRequestMessage(HttpMethod.Post, new Uri(servers[envType] + path))
            {
                Version = new Version(2, 0),
                Content = new StringContent(json),
                Method  = HttpMethod.Post,
                //    RequestUri = uri
            };

            var testOneHourToken = "eyJhbGciOiJFUzI1NiIsImtpZCI6IlJSWTg1NFU0TjQifQ==.eyJpc3MiOiJCSzc2Rjk4RFk3IiwiaWF0IjoxNTgwMDE5NjQ1fQ==.EK2ju4LCWjpk8CmQDBMCRWWt77kaefqx5BVAB9zHgheDfbCjySAd7+5P/EE6MZD5LjstRrbg7AkbhQaYGknBBQ==";

            request.Headers.Authorization = new AuthenticationHeaderValue("bearer", _jwt); //jwtToken.Value
            request.Headers.TryAddWithoutValidation(":path", path);
            request.Headers.Add(APN_ID_TOPIC, appBundleId);
            request.Headers.Add(APN_EXPIRATION, apnsExpiration.ToString());
            request.Headers.Add(APN_PRIORITY, apnsPriority.ToString());
            request.Headers.Add(APN_PUSHTYPE, isBackground ? "background" : "alert");  // for iOS 13 required

            if (!string.IsNullOrWhiteSpace(apnsId))
            {
                request.Headers.Add(APN_ID, apnsId);
            }

            var response = await http.Value.SendAsync(request);


            if (!response.IsSuccessStatusCode)
            {
                var code = response.StatusCode;
                var body = await response.Content.ReadAsStringAsync();

                var error = JsonConvert.DeserializeObject <APNsError>(body);

                var result = new APNsResponse
                {
                    statusCode = code,
                    IsSuccess  = false,
                    Error      = error
                };
                Debug.WriteLine("response失敗回應: ");
                Debug.WriteLine("  statusCode:  " + result.statusCode);
                Debug.WriteLine("  IsSuccess:  " + result.IsSuccess);
                Debug.WriteLine("  Error:  " + result.Error.Reason);
                return(result);
            }
            else
            {
                var code    = response.StatusCode;
                var succeed = response.IsSuccessStatusCode;
                var content = await response.Content.ReadAsStringAsync();

                var error = JsonConvert.DeserializeObject <APNsError>(content);

                var result = new APNsResponse
                {
                    statusCode = code,
                    IsSuccess  = succeed,
                    Error      = error
                };
                Debug.WriteLine("response成功回應: ");
                Debug.WriteLine("  statusCode:  " + result.statusCode);
                Debug.WriteLine("  IsSuccess:  " + result.IsSuccess);
                Debug.WriteLine("  Error:  " + result.Error);
                return(result);
            }
        }