{"action":"created","comment":{"url":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls/comments/31242975","id":31242975,"diff_hunk":"@@ -74,6 +76,22 @@ FOUNDATION_EXPORT const unsigned char MMWormholeVersionString[];\n @interface MMWormhole : NSObject\n \n /**\n+ The wormhole messenger is an object that conforms to the MMWormholeTransiting protocol. By default\n+ this object will be set to a default implementation of this protocol which handles archiving and\n+ unarchiving the message to the shared app group in a file named after the identifier of the \n+ message.\n+ \n+ Users of this class may create their own implementation of the MMWormholeTransiting protocol to use\n+ for the purpose of defining the means by which messages transit the wormhole. You could use this to\n+ change the way that MMWormhole stores messages as files, to read and write messages to a database,\n+ or otherwise be notified in other ways when messages are changed.\n+ \n+ @warning While changing this property is optional, the value of the wormhole messenger should \n+ not be nil and is required for the class to work.\n+ */\n+@property (nonatomic, strong) id<MMWormholeTransiting> wormholeMessenger;","path":"Source/MMWormhole.h","position":26,"original_position":26,"commit_id":"98a76bb1172ce1d423b1f8a7ea3607c0be69f625","original_commit_id":"bc13a686f2e63c70195b9d947d918841b4969ac5","user":{"login":"lukelabonte","id":879351,"avatar_url":"https://avatars.githubusercontent.com/u/879351?v=3","gravatar_id":"","url":"https://api.github.com/users/lukelabonte","html_url":"https://github.com/lukelabonte","followers_url":"https://api.github.com/users/lukelabonte/followers","following_url":"https://api.github.com/users/lukelabonte/following{/other_user}","gists_url":"https://api.github.com/users/lukelabonte/gists{/gist_id}","starred_url":"https://api.github.com/users/lukelabonte/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lukelabonte/subscriptions","organizations_url":"https://api.github.com/users/lukelabonte/orgs","repos_url":"https://api.github.com/users/lukelabonte/repos","events_url":"https://api.github.com/users/lukelabonte/events{/privacy}","received_events_url":"https://api.github.com/users/lukelabonte/received_events","type":"User","site_admin":false},"body":"I missed that, good point.","created_at":"2015-05-28T15:08:13Z","updated_at":"2015-05-28T15:08:13Z","html_url":"https://github.com/mutualmobile/MMWormhole/pull/40#discussion_r31242975","pull_request_url":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls/40","_links":{"self":{"href":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls/comments/31242975"},"html":{"href":"https://github.com/mutualmobile/MMWormhole/pull/40#discussion_r31242975"},"pull_request":{"href":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls/40"}}},"pull_request":{"url":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls/40","id":36344778,"html_url":"https://github.com/mutualmobile/MMWormhole/pull/40","diff_url":"https://github.com/mutualmobile/MMWormhole/pull/40.diff","patch_url":"https://github.com/mutualmobile/MMWormhole/pull/40.patch","issue_url":"https://api.github.com/repos/mutualmobile/MMWormhole/issues/40","number":40,"state":"open","locked":false,"title":"Adding Message Persistence Subclass Support","user":{"login":"cnstoll","id":1586401,"avatar_url":"https://avatars.githubusercontent.com/u/1586401?v=3","gravatar_id":"","url":"https://api.github.com/users/cnstoll","html_url":"https://github.com/cnstoll","followers_url":"https://api.github.com/users/cnstoll/followers","following_url":"https://api.github.com/users/cnstoll/following{/other_user}","gists_url":"https://api.github.com/users/cnstoll/gists{/gist_id}","starred_url":"https://api.github.com/users/cnstoll/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cnstoll/subscriptions","organizations_url":"https://api.github.com/users/cnstoll/orgs","repos_url":"https://api.github.com/users/cnstoll/repos","events_url":"https://api.github.com/users/cnstoll/events{/privacy}","received_events_url":"https://api.github.com/users/cnstoll/received_events","type":"User","site_admin":false},"body":"Hey Everyone,\r\n\r\nI'd love for you to take a look at this pull request to update MMWormhole's support for subclasses to modify message passing and persistence behavior. The need for this type of support has been apparent for a little while. There were two clear use cases for this:\r\n\r\n- Changing file writing security permissions\r\n- Adding support for message queueing\r\n\r\nTwo more obvious use cases also became clear within the last week or two:\r\n\r\n- Apple apparently fixed File Coordination in iOS 8.2, and released a tech note indicating that it should be used when reading and writing files between apps and extensions. Adding subclass support allows that to be added as a modular addition to MMWormhole. https://developer.apple.com/library/ios/technotes/tn2408/_index.html  Thanks to @atomicbird for highlighting this.\r\n- Its very possible that Apple will release some form of first party message passing API at WWDC. Adding this sort of modularity to MMWormhole paves the way to support their API (if they add one) and allow people an easy way to keep their MMWormhole logic in place while supporting the latest tech from Apple.\r\n\r\nThe implementation below breaks out the various methods involved in message passing into a protocol called MMWormholeTransiting, named for the way in which a space ship would \"transit\" space and time. It has one base implementation and one subclassed implementation. The base implementation is the default when you instantiate a wormhole that functions the same way it does today. The second is a new implementation that uses NSFileCoordinator to synchronize access to files.\r\n\r\nPlease take a look and let me know what you think. While this really doesn't add any significant complexity to the public API for MMWormhole, it's still a major architectural change and I want to get feedback on it before we move forward.\r\n\r\nThanks,\r\n\r\n- Conrad","created_at":"2015-05-27T20:25:07Z","updated_at":"2015-05-28T15:08:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4ac0fd6bc53bf575038fd28d80916d322302cd2e","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls/40/commits","review_comments_url":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls/40/comments","review_comment_url":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mutualmobile/MMWormhole/issues/40/comments","statuses_url":"https://api.github.com/repos/mutualmobile/MMWormhole/statuses/98a76bb1172ce1d423b1f8a7ea3607c0be69f625","head":{"label":"mutualmobile:cnstoll_subclassSupport","ref":"cnstoll_subclassSupport","sha":"98a76bb1172ce1d423b1f8a7ea3607c0be69f625","user":{"login":"mutualmobile","id":166419,"avatar_url":"https://avatars.githubusercontent.com/u/166419?v=3","gravatar_id":"","url":"https://api.github.com/users/mutualmobile","html_url":"https://github.com/mutualmobile","followers_url":"https://api.github.com/users/mutualmobile/followers","following_url":"https://api.github.com/users/mutualmobile/following{/other_user}","gists_url":"https://api.github.com/users/mutualmobile/gists{/gist_id}","starred_url":"https://api.github.com/users/mutualmobile/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mutualmobile/subscriptions","organizations_url":"https://api.github.com/users/mutualmobile/orgs","repos_url":"https://api.github.com/users/mutualmobile/repos","events_url":"https://api.github.com/users/mutualmobile/events{/privacy}","received_events_url":"https://api.github.com/users/mutualmobile/received_events","type":"Organization","site_admin":false},"repo":{"id":27653666,"name":"MMWormhole","full_name":"mutualmobile/MMWormhole","owner":{"login":"mutualmobile","id":166419,"avatar_url":"https://avatars.githubusercontent.com/u/166419?v=3","gravatar_id":"","url":"https://api.github.com/users/mutualmobile","html_url":"https://github.com/mutualmobile","followers_url":"https://api.github.com/users/mutualmobile/followers","following_url":"https://api.github.com/users/mutualmobile/following{/other_user}","gists_url":"https://api.github.com/users/mutualmobile/gists{/gist_id}","starred_url":"https://api.github.com/users/mutualmobile/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mutualmobile/subscriptions","organizations_url":"https://api.github.com/users/mutualmobile/orgs","repos_url":"https://api.github.com/users/mutualmobile/repos","events_url":"https://api.github.com/users/mutualmobile/events{/privacy}","received_events_url":"https://api.github.com/users/mutualmobile/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mutualmobile/MMWormhole","description":"Message passing between iOS apps and extensions.","fork":false,"url":"https://api.github.com/repos/mutualmobile/MMWormhole","forks_url":"https://api.github.com/repos/mutualmobile/MMWormhole/forks","keys_url":"https://api.github.com/repos/mutualmobile/MMWormhole/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mutualmobile/MMWormhole/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mutualmobile/MMWormhole/teams","hooks_url":"https://api.github.com/repos/mutualmobile/MMWormhole/hooks","issue_events_url":"https://api.github.com/repos/mutualmobile/MMWormhole/issues/events{/number}","events_url":"https://api.github.com/repos/mutualmobile/MMWormhole/events","assignees_url":"https://api.github.com/repos/mutualmobile/MMWormhole/assignees{/user}","branches_url":"https://api.github.com/repos/mutualmobile/MMWormhole/branches{/branch}","tags_url":"https://api.github.com/repos/mutualmobile/MMWormhole/tags","blobs_url":"https://api.github.com/repos/mutualmobile/MMWormhole/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mutualmobile/MMWormhole/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mutualmobile/MMWormhole/git/refs{/sha}","trees_url":"https://api.github.com/repos/mutualmobile/MMWormhole/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mutualmobile/MMWormhole/statuses/{sha}","languages_url":"https://api.github.com/repos/mutualmobile/MMWormhole/languages","stargazers_url":"https://api.github.com/repos/mutualmobile/MMWormhole/stargazers","contributors_url":"https://api.github.com/repos/mutualmobile/MMWormhole/contributors","subscribers_url":"https://api.github.com/repos/mutualmobile/MMWormhole/subscribers","subscription_url":"https://api.github.com/repos/mutualmobile/MMWormhole/subscription","commits_url":"https://api.github.com/repos/mutualmobile/MMWormhole/commits{/sha}","git_commits_url":"https://api.github.com/repos/mutualmobile/MMWormhole/git/commits{/sha}","comments_url":"https://api.github.com/repos/mutualmobile/MMWormhole/comments{/number}","issue_comment_url":"https://api.github.com/repos/mutualmobile/MMWormhole/issues/comments{/number}","contents_url":"https://api.github.com/repos/mutualmobile/MMWormhole/contents/{+path}","compare_url":"https://api.github.com/repos/mutualmobile/MMWormhole/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mutualmobile/MMWormhole/merges","archive_url":"https://api.github.com/repos/mutualmobile/MMWormhole/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mutualmobile/MMWormhole/downloads","issues_url":"https://api.github.com/repos/mutualmobile/MMWormhole/issues{/number}","pulls_url":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls{/number}","milestones_url":"https://api.github.com/repos/mutualmobile/MMWormhole/milestones{/number}","notifications_url":"https://api.github.com/repos/mutualmobile/MMWormhole/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mutualmobile/MMWormhole/labels{/name}","releases_url":"https://api.github.com/repos/mutualmobile/MMWormhole/releases{/id}","created_at":"2014-12-07T00:03:44Z","updated_at":"2015-05-28T14:38:41Z","pushed_at":"2015-05-27T23:11:12Z","git_url":"git://github.com/mutualmobile/MMWormhole.git","ssh_url":"git@github.com:mutualmobile/MMWormhole.git","clone_url":"https://github.com/mutualmobile/MMWormhole.git","svn_url":"https://github.com/mutualmobile/MMWormhole","homepage":"","size":1016,"stargazers_count":2101,"watchers_count":2101,"language":"Objective-C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":125,"mirror_url":null,"open_issues_count":2,"forks":125,"open_issues":2,"watchers":2101,"default_branch":"master"}},"base":{"label":"mutualmobile:master","ref":"master","sha":"c58abfe2fcaea26b222d485c9631a409da778edf","user":{"login":"mutualmobile","id":166419,"avatar_url":"https://avatars.githubusercontent.com/u/166419?v=3","gravatar_id":"","url":"https://api.github.com/users/mutualmobile","html_url":"https://github.com/mutualmobile","followers_url":"https://api.github.com/users/mutualmobile/followers","following_url":"https://api.github.com/users/mutualmobile/following{/other_user}","gists_url":"https://api.github.com/users/mutualmobile/gists{/gist_id}","starred_url":"https://api.github.com/users/mutualmobile/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mutualmobile/subscriptions","organizations_url":"https://api.github.com/users/mutualmobile/orgs","repos_url":"https://api.github.com/users/mutualmobile/repos","events_url":"https://api.github.com/users/mutualmobile/events{/privacy}","received_events_url":"https://api.github.com/users/mutualmobile/received_events","type":"Organization","site_admin":false},"repo":{"id":27653666,"name":"MMWormhole","full_name":"mutualmobile/MMWormhole","owner":{"login":"mutualmobile","id":166419,"avatar_url":"https://avatars.githubusercontent.com/u/166419?v=3","gravatar_id":"","url":"https://api.github.com/users/mutualmobile","html_url":"https://github.com/mutualmobile","followers_url":"https://api.github.com/users/mutualmobile/followers","following_url":"https://api.github.com/users/mutualmobile/following{/other_user}","gists_url":"https://api.github.com/users/mutualmobile/gists{/gist_id}","starred_url":"https://api.github.com/users/mutualmobile/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mutualmobile/subscriptions","organizations_url":"https://api.github.com/users/mutualmobile/orgs","repos_url":"https://api.github.com/users/mutualmobile/repos","events_url":"https://api.github.com/users/mutualmobile/events{/privacy}","received_events_url":"https://api.github.com/users/mutualmobile/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mutualmobile/MMWormhole","description":"Message passing between iOS apps and extensions.","fork":false,"url":"https://api.github.com/repos/mutualmobile/MMWormhole","forks_url":"https://api.github.com/repos/mutualmobile/MMWormhole/forks","keys_url":"https://api.github.com/repos/mutualmobile/MMWormhole/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mutualmobile/MMWormhole/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mutualmobile/MMWormhole/teams","hooks_url":"https://api.github.com/repos/mutualmobile/MMWormhole/hooks","issue_events_url":"https://api.github.com/repos/mutualmobile/MMWormhole/issues/events{/number}","events_url":"https://api.github.com/repos/mutualmobile/MMWormhole/events","assignees_url":"https://api.github.com/repos/mutualmobile/MMWormhole/assignees{/user}","branches_url":"https://api.github.com/repos/mutualmobile/MMWormhole/branches{/branch}","tags_url":"https://api.github.com/repos/mutualmobile/MMWormhole/tags","blobs_url":"https://api.github.com/repos/mutualmobile/MMWormhole/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mutualmobile/MMWormhole/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mutualmobile/MMWormhole/git/refs{/sha}","trees_url":"https://api.github.com/repos/mutualmobile/MMWormhole/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mutualmobile/MMWormhole/statuses/{sha}","languages_url":"https://api.github.com/repos/mutualmobile/MMWormhole/languages","stargazers_url":"https://api.github.com/repos/mutualmobile/MMWormhole/stargazers","contributors_url":"https://api.github.com/repos/mutualmobile/MMWormhole/contributors","subscribers_url":"https://api.github.com/repos/mutualmobile/MMWormhole/subscribers","subscription_url":"https://api.github.com/repos/mutualmobile/MMWormhole/subscription","commits_url":"https://api.github.com/repos/mutualmobile/MMWormhole/commits{/sha}","git_commits_url":"https://api.github.com/repos/mutualmobile/MMWormhole/git/commits{/sha}","comments_url":"https://api.github.com/repos/mutualmobile/MMWormhole/comments{/number}","issue_comment_url":"https://api.github.com/repos/mutualmobile/MMWormhole/issues/comments{/number}","contents_url":"https://api.github.com/repos/mutualmobile/MMWormhole/contents/{+path}","compare_url":"https://api.github.com/repos/mutualmobile/MMWormhole/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mutualmobile/MMWormhole/merges","archive_url":"https://api.github.com/repos/mutualmobile/MMWormhole/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mutualmobile/MMWormhole/downloads","issues_url":"https://api.github.com/repos/mutualmobile/MMWormhole/issues{/number}","pulls_url":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls{/number}","milestones_url":"https://api.github.com/repos/mutualmobile/MMWormhole/milestones{/number}","notifications_url":"https://api.github.com/repos/mutualmobile/MMWormhole/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mutualmobile/MMWormhole/labels{/name}","releases_url":"https://api.github.com/repos/mutualmobile/MMWormhole/releases{/id}","created_at":"2014-12-07T00:03:44Z","updated_at":"2015-05-28T14:38:41Z","pushed_at":"2015-05-27T23:11:12Z","git_url":"git://github.com/mutualmobile/MMWormhole.git","ssh_url":"git@github.com:mutualmobile/MMWormhole.git","clone_url":"https://github.com/mutualmobile/MMWormhole.git","svn_url":"https://github.com/mutualmobile/MMWormhole","homepage":"","size":1016,"stargazers_count":2101,"watchers_count":2101,"language":"Objective-C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":125,"mirror_url":null,"open_issues_count":2,"forks":125,"open_issues":2,"watchers":2101,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls/40"},"html":{"href":"https://github.com/mutualmobile/MMWormhole/pull/40"},"issue":{"href":"https://api.github.com/repos/mutualmobile/MMWormhole/issues/40"},"comments":{"href":"https://api.github.com/repos/mutualmobile/MMWormhole/issues/40/comments"},"review_comments":{"href":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls/40/comments"},"review_comment":{"href":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mutualmobile/MMWormhole/pulls/40/commits"},"statuses":{"href":"https://api.github.com/repos/mutualmobile/MMWormhole/statuses/98a76bb1172ce1d423b1f8a7ea3607c0be69f625"}}}}