###前提・実現したいこと
AWS SNSで、iOSからPush通知を実装したいと思っています。
xcodeのバージョンは、8.3.3です。
AppDelegateのdidRegisterForRemoteNotificationWithDeviceTokenで、deviceTokenを取得し、AWSの管理画面上では、正常にendpointsが追加されております。
しかし、Push通知を送信しても、端末にPushは送信されず、管理画面をリロードすると、Enabledがtrueだったものがfalseに変わってしまいます。
###発生している問題・エラーメッセージ
getEndpointAttributesでは、下記のエラーメッセージが表示されます。
"Error: Endpoint attributes error. The device should create endpoint: Error Domain=com.amazonaws.AWSSNSErrorDomain Code=4 \"(null)\" UserInfo={Type=Sender, Message=Invalid parameter: EndpointArn Reason: An ARN must have at least 6 elements, not 1, Code=InvalidParameter, __text=(\n \"\\n \",\n \"\\n \",\n \"\\n \",\n \"\\n \"\n)}"
###該当のソースコード
iOSでは、下記のコードで、endpointの確認と生成を行っています。
func setAWSNotification(deviceToken: Data) { let deviceTokenString = "\(deviceToken as CVarArg)" .trimmingCharacters(in: CharacterSet(charactersIn:"<>")) .replacingOccurrences(of: " ", with: "") UserDefault.deviceToken = deviceTokenString debugPrint("devicetoken:",deviceTokenString) let credentialsProvider = AWSStaticCredentialsProvider(accessKey: StacSettings.awsAccessKey, secretKey: StacSettings.awsSecretKey) let serviceConfiguration = AWSServiceConfiguration(region:.APNortheast1, credentialsProvider:credentialsProvider) AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration let sns = AWSSNS.default() //get let request: AWSSNSGetEndpointAttributesInput = AWSSNSGetEndpointAttributesInput() request.endpointArn = deviceTokenString sns.getEndpointAttributes(request).continueWith { (task: AWSTask) -> Any? in if let error = task.error { debugPrint("Error: Endpoint attributes error. The device should create endpoint: \(error)"); self.createEndpoint(token: deviceTokenString) return nil } guard let endpointAttributesResult = task.result else { return nil } let attributes: Dictionary<String, String>? = endpointAttributesResult.attributes if !(attributes?["token"] == deviceTokenString) || !(attributes?["Enabled"] == "true") { debugPrint("Error: Device token is old or not valid. The device should set latest information"); self.setAttribute(token: deviceTokenString) } return nil } } fileprivate func createEndpoint(token: String){ let sns = AWSSNS.default() let languages = NSLocale.preferredLanguages let lang = languages.first as String! let json = "{\"lang\":\"\(String(describing: lang))\"}" let input = AWSSNSCreatePlatformEndpointInput() input?.token = token //DeviceTokenを設定 input?.customUserData = json input?.platformApplicationArn = StacSettings.awsPlatFormApplicationArn sns.createPlatformEndpoint(input!).continueWith { (task: AWSTask!) -> AnyObject! in if task.error != nil { debugPrint("Error: \(String(describing: task.error))") } else { let createEndpointResponse = task.result! as AWSSNSCreateEndpointResponse debugPrint("endpointArn: \(String(describing: createEndpointResponse.endpointArn))") } return nil } }
###試したこと
IAMで、ユーザーにAmazonSNSFullAccessの設定もしてますが、ダメでした。
また、ARN(endpointArn)がSNSから送られてくる、createPlatformEndpointでは、登録されたARN(endpointArn)の取得も出来ております。
Pushの送信が出来ないのは、iOSの実装の問題でしょうか?
それとも、AWSでの設定の問題なのでしょうか?
何か、解決方法などご存知の方がいらっしゃいましたら、ご教示いただけないでしょうか。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。