GAEでPUSH通知時の"TypeError: must be _socket.socket, not socket"の対応
GAEでiosのPUSH通知(APNS)を実装しようとしたら、"TypeError: must be _socket.socket, not socket"のエラーがでたので、全体的な流れと対応をまとめる。
なお、このエラーは開発環境でのみ出る。
まずは、Google App EngineからiOSアプリへPush通知が送れるようになりました - laisoを参考に、下記2つを行った。
1、PyAPNsをインストール
2、下のソースの記述
from apns import APNs, Payload apns = APNs(use_sandbox=True, cert_file='cert.pem', key_file='pkey.pem') token_hex = '1c222886bcce84bd9fb34c274ea3d466be970b62c7d72582d6fc302f9b072503' # tokeh_hexはiOSアプリで取得するデバイストークン class APNsHandler(webapp.RequestHandler): def get(self): payload = Payload(alert="Hello World!", sound="default", badge=1) apns.gateway_server.send_notification(token_hex, payload) self.response.write(u"PUSH通知送信完了") app = webapp2.WSGIApplication([ ('/notify', APNsHandler) ], debug=True)
3、app.yamlに下記を追加
libraries:
- name: ssl
version: latest
で、開発環境のGAEを起動して、
http://localhost:8080/notify
にアクセスすると、
"TypeError: must be _socket.socket, not socket"
が発生する。
解決策は、ここに載っている。
やることは2つ。
1、"_ssl" and "_socket"を /path-to-gae-sdk/google/appengine/tools/devappserver2/python/sandbox.py の中の _WHITE_LIST_C_MODULESに追加。
2、/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py を、 /path-to-gae-sdk/google/appengine/dis27/socket.py にコピー(上書き)。