VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.074USD
STEEM
0.001STEEM
SBD
0.000SBD
Effective Power
5.007SP
├── Own SP
1.275SP
└── Incoming DelegationsDeleg
+3.733SP
Detailed Balance
| STEEM | ||
| balance | 0.001STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 1.275SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 3.733SP | SP |
| Effective Power | 5.007SP | SP |
| Reward SP (pending) | 0.000SP | SP |
| SBD | ||
| sbd_balance | 0.000SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.000SBD | SBD |
{
"balance": "0.001 STEEM",
"savings_balance": "0.000 STEEM",
"reward_steem_balance": "0.000 STEEM",
"vesting_shares": "2072.955961 VESTS",
"delegated_vesting_shares": "0.000000 VESTS",
"received_vesting_shares": "6070.703845 VESTS",
"sbd_balance": "0.000 SBD",
"savings_sbd_balance": "0.000 SBD",
"reward_sbd_balance": "0.000 SBD",
"conversions": []
}Account Info
| name | abhijeetmalamkar |
| id | 169026 |
| rank | 1,452,329 |
| reputation | 0 |
| created | 2017-05-24T20:54:24 |
| recovery_account | steem |
| proxy | None |
| post_count | 1 |
| comment_count | 0 |
| lifetime_vote_count | 0 |
| witnesses_voted_for | 0 |
| last_post | 2017-07-14T19:23:33 |
| last_root_post | 2017-07-14T19:23:33 |
| last_vote_time | 1970-01-01T00:00:00 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.001 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 0.000 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 2072.955961 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 6070.703845 VESTS |
| reward_vesting_balance | 0.000000 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 2017-05-24T20:55:09 |
| last_account_update | 2017-05-24T20:55:09 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 1970-01-01T00:00:00 |
| savings_sbd_last_interest_payment | 1970-01-01T00:00:00 |
{
"active": {
"account_auths": [],
"key_auths": [
[
"STM5iLiF7ei9wG4RMf1dD891Z1KWFXdcTA8XNvSnDzYwQ7vuiWBvt",
1
]
],
"weight_threshold": 1
},
"balance": "0.001 STEEM",
"can_vote": true,
"comment_count": 0,
"created": "2017-05-24T20:54:24",
"curation_rewards": 0,
"delegated_vesting_shares": "0.000000 VESTS",
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779050949
},
"guest_bloggers": [],
"id": 169026,
"json_metadata": "",
"last_account_recovery": "1970-01-01T00:00:00",
"last_account_update": "2017-05-24T20:55:09",
"last_owner_update": "2017-05-24T20:55:09",
"last_post": "2017-07-14T19:23:33",
"last_root_post": "2017-07-14T19:23:33",
"last_vote_time": "1970-01-01T00:00:00",
"lifetime_vote_count": 0,
"market_history": [],
"memo_key": "STM7YV95LMWKMizH7EfkdyAzA2CA5dqYV1j9UqpZh3TccT9RhmscA",
"mined": false,
"name": "abhijeetmalamkar",
"next_vesting_withdrawal": "1969-12-31T23:59:59",
"other_history": [],
"owner": {
"account_auths": [],
"key_auths": [
[
"STM8U5aqk9UUcoUeL9Yc467A9TEtHP1DMdZKGGwM637BYyVapDAMQ",
1
]
],
"weight_threshold": 1
},
"pending_claimed_accounts": 0,
"post_bandwidth": 0,
"post_count": 1,
"post_history": [],
"posting": {
"account_auths": [],
"key_auths": [
[
"STM5JAUVjoVaxe48yefjvDbdqxiPA6ASSFtS4QsA6XnRbrbbs8qAW",
1
]
],
"weight_threshold": 1
},
"posting_json_metadata": "",
"posting_rewards": 0,
"proxied_vsf_votes": [
0,
0,
0,
0
],
"proxy": "",
"received_vesting_shares": "6070.703845 VESTS",
"recovery_account": "steem",
"reputation": 0,
"reset_account": "null",
"reward_sbd_balance": "0.000 SBD",
"reward_steem_balance": "0.000 STEEM",
"reward_vesting_balance": "0.000000 VESTS",
"reward_vesting_steem": "0.000 STEEM",
"savings_balance": "0.000 STEEM",
"savings_sbd_balance": "0.000 SBD",
"savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
"savings_sbd_seconds": "0",
"savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
"savings_withdraw_requests": 0,
"sbd_balance": "0.000 SBD",
"sbd_last_interest_payment": "1970-01-01T00:00:00",
"sbd_seconds": "0",
"sbd_seconds_last_update": "1970-01-01T00:00:00",
"tags_usage": [],
"to_withdraw": 0,
"transfer_history": [],
"vesting_balance": "0.000 STEEM",
"vesting_shares": "2072.955961 VESTS",
"vesting_withdraw_rate": "0.000000 VESTS",
"vote_history": [],
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779050949
},
"voting_power": 0,
"withdraw_routes": 0,
"withdrawn": 0,
"witness_votes": [],
"witnesses_voted_for": 0,
"rank": 1452329
}Withdraw Routes
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
steemdelegated 3.733 SP to @abhijeetmalamkar2026/05/17 20:49:09
steemdelegated 3.733 SP to @abhijeetmalamkar
2026/05/17 20:49:09
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 6070.703845 VESTS |
| Transaction Info | Block #106139344/Trx da95b67f432d4cdc06aea1a88e3a23ffb2b01fee |
View Raw JSON Data
{
"block": 106139344,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "6070.703845 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-17T20:49:09",
"trx_id": "da95b67f432d4cdc06aea1a88e3a23ffb2b01fee",
"trx_in_block": 2,
"virtual_op": 0
}steemdelegated 2.065 SP to @abhijeetmalamkar2026/05/11 16:14:51
steemdelegated 2.065 SP to @abhijeetmalamkar
2026/05/11 16:14:51
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 3358.493440 VESTS |
| Transaction Info | Block #105961840/Trx 71a5112ca2d90c47c6fff85ce0b2a37a345665b8 |
View Raw JSON Data
{
"block": 105961840,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "3358.493440 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-05-11T16:14:51",
"trx_id": "71a5112ca2d90c47c6fff85ce0b2a37a345665b8",
"trx_in_block": 3,
"virtual_op": 0
}steemdelegated 3.740 SP to @abhijeetmalamkar2026/04/25 20:15:18
steemdelegated 3.740 SP to @abhijeetmalamkar
2026/04/25 20:15:18
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 6083.219601 VESTS |
| Transaction Info | Block #105507092/Trx 4449d25ceef589ed72af6406a89b2eb5b4be1609 |
View Raw JSON Data
{
"block": 105507092,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "6083.219601 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-04-25T20:15:18",
"trx_id": "4449d25ceef589ed72af6406a89b2eb5b4be1609",
"trx_in_block": 4,
"virtual_op": 0
}steemdelegated 2.091 SP to @abhijeetmalamkar2026/01/22 22:35:51
steemdelegated 2.091 SP to @abhijeetmalamkar
2026/01/22 22:35:51
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 3400.040259 VESTS |
| Transaction Info | Block #102840788/Trx 8c303d531f3945fcdff6895f00832585e744c91b |
View Raw JSON Data
{
"block": 102840788,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "3400.040259 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2026-01-22T22:35:51",
"trx_id": "8c303d531f3945fcdff6895f00832585e744c91b",
"trx_in_block": 5,
"virtual_op": 0
}steemdelegated 2.192 SP to @abhijeetmalamkar2024/12/16 17:57:12
steemdelegated 2.192 SP to @abhijeetmalamkar
2024/12/16 17:57:12
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 3564.259456 VESTS |
| Transaction Info | Block #91287240/Trx ba6543b27f4eaf0a09ae3e255af0f615e8a10da9 |
View Raw JSON Data
{
"block": 91287240,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "3564.259456 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2024-12-16T17:57:12",
"trx_id": "ba6543b27f4eaf0a09ae3e255af0f615e8a10da9",
"trx_in_block": 0,
"virtual_op": 0
}steemdelegated 2.296 SP to @abhijeetmalamkar2023/11/13 09:43:36
steemdelegated 2.296 SP to @abhijeetmalamkar
2023/11/13 09:43:36
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 3733.392988 VESTS |
| Transaction Info | Block #79841533/Trx a3e5adbd19d89926de936c721474313343ac4131 |
View Raw JSON Data
{
"block": 79841533,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "3733.392988 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-11-13T09:43:36",
"trx_id": "a3e5adbd19d89926de936c721474313343ac4131",
"trx_in_block": 2,
"virtual_op": 0
}steemdelegated 4.102 SP to @abhijeetmalamkar2023/09/21 17:46:48
steemdelegated 4.102 SP to @abhijeetmalamkar
2023/09/21 17:46:48
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 6670.671774 VESTS |
| Transaction Info | Block #78342988/Trx 9464d3f15983537b30b11fb22c5756769a6c0b1d |
View Raw JSON Data
{
"block": 78342988,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "6670.671774 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2023-09-21T17:46:48",
"trx_id": "9464d3f15983537b30b11fb22c5756769a6c0b1d",
"trx_in_block": 1,
"virtual_op": 0
}steemdelegated 4.238 SP to @abhijeetmalamkar2022/11/03 08:02:42
steemdelegated 4.238 SP to @abhijeetmalamkar
2022/11/03 08:02:42
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 6892.353212 VESTS |
| Transaction Info | Block #69108888/Trx 2442bb37b22274dcd6d7e2a8cade82e55ecc109c |
View Raw JSON Data
{
"block": 69108888,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "6892.353212 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-11-03T08:02:42",
"trx_id": "2442bb37b22274dcd6d7e2a8cade82e55ecc109c",
"trx_in_block": 0,
"virtual_op": 0
}steemdelegated 4.374 SP to @abhijeetmalamkar2022/01/17 07:39:36
steemdelegated 4.374 SP to @abhijeetmalamkar
2022/01/17 07:39:36
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 7112.886443 VESTS |
| Transaction Info | Block #60805482/Trx a2d230f8341a93f6676bc6de24d8474106944dbc |
View Raw JSON Data
{
"block": 60805482,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "7112.886443 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2022-01-17T07:39:36",
"trx_id": "a2d230f8341a93f6676bc6de24d8474106944dbc",
"trx_in_block": 10,
"virtual_op": 0
}steemdelegated 4.487 SP to @abhijeetmalamkar2021/06/13 21:43:09
steemdelegated 4.487 SP to @abhijeetmalamkar
2021/06/13 21:43:09
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 7296.655101 VESTS |
| Transaction Info | Block #54604038/Trx bd8626f36f4438de74c9624f89f213d997949aec |
View Raw JSON Data
{
"block": 54604038,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "7296.655101 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2021-06-13T21:43:09",
"trx_id": "bd8626f36f4438de74c9624f89f213d997949aec",
"trx_in_block": 1,
"virtual_op": 0
}steemdelegated 4.602 SP to @abhijeetmalamkar2020/12/11 08:06:36
steemdelegated 4.602 SP to @abhijeetmalamkar
2020/12/11 08:06:36
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 7484.077075 VESTS |
| Transaction Info | Block #49351627/Trx 78c1612cc44d8bd24275c6eefeeaf64aa521fd48 |
View Raw JSON Data
{
"block": 49351627,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "7484.077075 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-11T08:06:36",
"trx_id": "78c1612cc44d8bd24275c6eefeeaf64aa521fd48",
"trx_in_block": 3,
"virtual_op": 0
}steemdelegated 1.176 SP to @abhijeetmalamkar2020/12/06 01:43:54
steemdelegated 1.176 SP to @abhijeetmalamkar
2020/12/06 01:43:54
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #49203193/Trx a6d154dfcc70e073f5f2496af55f7afe8078c3d6 |
View Raw JSON Data
{
"block": 49203193,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "1912.543513 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-12-06T01:43:54",
"trx_id": "a6d154dfcc70e073f5f2496af55f7afe8078c3d6",
"trx_in_block": 7,
"virtual_op": 0
}steemdelegated 4.612 SP to @abhijeetmalamkar2020/11/25 14:26:48
steemdelegated 4.612 SP to @abhijeetmalamkar
2020/11/25 14:26:48
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 7501.203692 VESTS |
| Transaction Info | Block #48906094/Trx 877f8655d9b3b8130105eef93f5bfc7568bbc548 |
View Raw JSON Data
{
"block": 48906094,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "7501.203692 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-11-25T14:26:48",
"trx_id": "877f8655d9b3b8130105eef93f5bfc7568bbc548",
"trx_in_block": 0,
"virtual_op": 0
}steemdelegated 4.730 SP to @abhijeetmalamkar2020/05/09 02:38:27
steemdelegated 4.730 SP to @abhijeetmalamkar
2020/05/09 02:38:27
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 7693.090288 VESTS |
| Transaction Info | Block #43213404/Trx 5af1b27d289a4472997f0dfe6695e40a228462cb |
View Raw JSON Data
{
"block": 43213404,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "7693.090288 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-09T02:38:27",
"trx_id": "5af1b27d289a4472997f0dfe6695e40a228462cb",
"trx_in_block": 9,
"virtual_op": 0
}steemdelegated 1.201 SP to @abhijeetmalamkar2020/05/08 05:46:09
steemdelegated 1.201 SP to @abhijeetmalamkar
2020/05/08 05:46:09
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #43188945/Trx a5231f2e41df658976015cc5fb1b43f925a6791f |
View Raw JSON Data
{
"block": 43188945,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "1953.311140 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-05-08T05:46:09",
"trx_id": "a5231f2e41df658976015cc5fb1b43f925a6791f",
"trx_in_block": 14,
"virtual_op": 0
}steemdelegated 4.738 SP to @abhijeetmalamkar2020/04/15 17:20:15
steemdelegated 4.738 SP to @abhijeetmalamkar
2020/04/15 17:20:15
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 7706.125305 VESTS |
| Transaction Info | Block #42557595/Trx 4be9d663dffe7f8615f1e6381fe670debc2cb482 |
View Raw JSON Data
{
"block": 42557595,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "7706.125305 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2020-04-15T17:20:15",
"trx_id": "4be9d663dffe7f8615f1e6381fe670debc2cb482",
"trx_in_block": 0,
"virtual_op": 0
}2019/05/24 22:11:06
2019/05/24 22:11:06
| author | steemitboard |
| body | Congratulations @abhijeetmalamkar! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@abhijeetmalamkar/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@abhijeetmalamkar) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=abhijeetmalamkar)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| parent author | abhijeetmalamkar |
| parent permlink | ios-watchconnectivity-tutorial |
| permlink | steemitboard-notify-abhijeetmalamkar-20190524t221105000z |
| title | |
| Transaction Info | Block #33199592/Trx 3680dda672e4e467c5433732999ee58819bf265c |
View Raw JSON Data
{
"block": 33199592,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @abhijeetmalamkar! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@abhijeetmalamkar/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@abhijeetmalamkar) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=abhijeetmalamkar)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
"parent_author": "abhijeetmalamkar",
"parent_permlink": "ios-watchconnectivity-tutorial",
"permlink": "steemitboard-notify-abhijeetmalamkar-20190524t221105000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2019-05-24T22:11:06",
"trx_id": "3680dda672e4e467c5433732999ee58819bf265c",
"trx_in_block": 3,
"virtual_op": 0
}steemdelegated 4.859 SP to @abhijeetmalamkar2019/05/12 10:52:57
steemdelegated 4.859 SP to @abhijeetmalamkar
2019/05/12 10:52:57
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 7901.747772 VESTS |
| Transaction Info | Block #32840662/Trx 02e7cc8e63ee2775e2b0af102e4e50a0c4434366 |
View Raw JSON Data
{
"block": 32840662,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "7901.747772 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2019-05-12T10:52:57",
"trx_id": "02e7cc8e63ee2775e2b0af102e4e50a0c4434366",
"trx_in_block": 21,
"virtual_op": 0
}2018/05/25 04:11:51
2018/05/25 04:11:51
| author | steemitboard |
| body | Congratulations @abhijeetmalamkar! You have completed some achievement on Steemit and have been rewarded with new badge(s) : 1 Year on Steemit Click on any badge to view your Board of Honor. For more information about SteemitBoard, click [here](https://steemit.com/@steemitboard) If you no longer want to receive notifications, reply to this comment with the word `STOP` > Do you like **SteemitBoard**'s project? **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| parent author | abhijeetmalamkar |
| parent permlink | ios-watchconnectivity-tutorial |
| permlink | steemitboard-notify-abhijeetmalamkar-20180525t041150000z |
| title | |
| Transaction Info | Block #22729326/Trx 6d67dc283bb8141ecfc8756071465b8540f3e130 |
View Raw JSON Data
{
"block": 22729326,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @abhijeetmalamkar! You have completed some achievement on Steemit and have been rewarded with new badge(s) :\n\n1 Year on Steemit\nClick on any badge to view your Board of Honor.\nFor more information about SteemitBoard, click [here](https://steemit.com/@steemitboard)\n\nIf you no longer want to receive notifications, reply to this comment with the word `STOP`\n\n> Do you like **SteemitBoard**'s project? **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
"parent_author": "abhijeetmalamkar",
"parent_permlink": "ios-watchconnectivity-tutorial",
"permlink": "steemitboard-notify-abhijeetmalamkar-20180525t041150000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-05-25T04:11:51",
"trx_id": "6d67dc283bb8141ecfc8756071465b8540f3e130",
"trx_in_block": 9,
"virtual_op": 0
}2018/05/25 00:25:18
2018/05/25 00:25:18
| author | steemitboard |
| body | Congratulations @abhijeetmalamkar! You have received a personal award! [](http://steemitboard.com/@abhijeetmalamkar) 1 Year on Steemit _Click on the badge to view your Board of Honor. > Do you like **SteemitBoard**'s project? **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**! |
| json metadata | {"image":["https://steemitboard.com/img/notify.png"]} |
| parent author | abhijeetmalamkar |
| parent permlink | ios-watchconnectivity-tutorial |
| permlink | steemitboard-notify-abhijeetmalamkar-20180525t002520000z |
| title | |
| Transaction Info | Block #22724796/Trx 1827a7c7b2ae2dcea1949f251ee813732aeeb196 |
View Raw JSON Data
{
"block": 22724796,
"op": [
"comment",
{
"author": "steemitboard",
"body": "Congratulations @abhijeetmalamkar! You have received a personal award!\n\n[](http://steemitboard.com/@abhijeetmalamkar) 1 Year on Steemit\n_Click on the badge to view your Board of Honor.\n\n\n> Do you like **SteemitBoard**'s project? **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
"json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
"parent_author": "abhijeetmalamkar",
"parent_permlink": "ios-watchconnectivity-tutorial",
"permlink": "steemitboard-notify-abhijeetmalamkar-20180525t002520000z",
"title": ""
}
],
"op_in_trx": 0,
"timestamp": "2018-05-25T00:25:18",
"trx_id": "1827a7c7b2ae2dcea1949f251ee813732aeeb196",
"trx_in_block": 58,
"virtual_op": 0
}steemdelegated 4.981 SP to @abhijeetmalamkar2018/05/16 19:05:12
steemdelegated 4.981 SP to @abhijeetmalamkar
2018/05/16 19:05:12
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 8101.264752 VESTS |
| Transaction Info | Block #22488407/Trx cde93cc5aa6e7c6c9d13c76ff4b4fef325c2bc6f |
View Raw JSON Data
{
"block": 22488407,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "8101.264752 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-05-16T19:05:12",
"trx_id": "cde93cc5aa6e7c6c9d13c76ff4b4fef325c2bc6f",
"trx_in_block": 36,
"virtual_op": 0
}money-dreamersent 0.001 STEEM to @abhijeetmalamkar- "I just followed you!"2018/01/11 05:05:27
money-dreamersent 0.001 STEEM to @abhijeetmalamkar- "I just followed you!"
2018/01/11 05:05:27
| amount | 0.001 STEEM |
| from | money-dreamer |
| memo | I just followed you! |
| to | abhijeetmalamkar |
| Transaction Info | Block #18875283/Trx d01c200e27a6d5df9701cb026068b60dbf91102a |
View Raw JSON Data
{
"block": 18875283,
"op": [
"transfer",
{
"amount": "0.001 STEEM",
"from": "money-dreamer",
"memo": "I just followed you!",
"to": "abhijeetmalamkar"
}
],
"op_in_trx": 0,
"timestamp": "2018-01-11T05:05:27",
"trx_id": "d01c200e27a6d5df9701cb026068b60dbf91102a",
"trx_in_block": 25,
"virtual_op": 0
}steemdelegated 17.618 SP to @abhijeetmalamkar2018/01/09 04:21:39
steemdelegated 17.618 SP to @abhijeetmalamkar
2018/01/09 04:21:39
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 28652.371982 VESTS |
| Transaction Info | Block #18816837/Trx becac9e0509fe969efc1caefdd8d73ea52a1969e |
View Raw JSON Data
{
"block": 18816837,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "28652.371982 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2018-01-09T04:21:39",
"trx_id": "becac9e0509fe969efc1caefdd8d73ea52a1969e",
"trx_in_block": 2,
"virtual_op": 0
}abhijeetmalamkarpublished a new post: ios-watchconnectivity-tutorial2017/07/14 19:26:15
abhijeetmalamkarpublished a new post: ios-watchconnectivity-tutorial
2017/07/14 19:26:15
| author | abhijeetmalamkar |
| body | @@ -1,20 +1,109 @@ +!%5B%5D(https://steemitimages.com/DQmeB1JZZX8PJCCoV51ZMPDgig6X76exDoSTF35ei1M8zGD/image.png)%0A This tutorial covers |
| json metadata | {"tags":["iwatch","swift3","ios","programming","tutorial"],"users":["escaping"],"app":"steemit/0.1","format":"markdown","image":["https://steemitimages.com/DQmeB1JZZX8PJCCoV51ZMPDgig6X76exDoSTF35ei1M8zGD/image.png"]} |
| parent author | |
| parent permlink | iwatch |
| permlink | ios-watchconnectivity-tutorial |
| title | iOS WatchConnectivity Tutorial |
| Transaction Info | Block #13684035/Trx bea75b36aaf37353b38b4c3f1d163ae3ae3a38f2 |
View Raw JSON Data
{
"block": 13684035,
"op": [
"comment",
{
"author": "abhijeetmalamkar",
"body": "@@ -1,20 +1,109 @@\n+!%5B%5D(https://steemitimages.com/DQmeB1JZZX8PJCCoV51ZMPDgig6X76exDoSTF35ei1M8zGD/image.png)%0A\n This tutorial covers\n",
"json_metadata": "{\"tags\":[\"iwatch\",\"swift3\",\"ios\",\"programming\",\"tutorial\"],\"users\":[\"escaping\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"image\":[\"https://steemitimages.com/DQmeB1JZZX8PJCCoV51ZMPDgig6X76exDoSTF35ei1M8zGD/image.png\"]}",
"parent_author": "",
"parent_permlink": "iwatch",
"permlink": "ios-watchconnectivity-tutorial",
"title": "iOS WatchConnectivity Tutorial"
}
],
"op_in_trx": 0,
"timestamp": "2017-07-14T19:26:15",
"trx_id": "bea75b36aaf37353b38b4c3f1d163ae3ae3a38f2",
"trx_in_block": 20,
"virtual_op": 0
}abhijeetmalamkarpublished a new post: ios-watchconnectivity-tutorial2017/07/14 19:23:33
abhijeetmalamkarpublished a new post: ios-watchconnectivity-tutorial
2017/07/14 19:23:33
| author | abhijeetmalamkar |
| body | This tutorial covers the basics of connecting an iOS and Watch app together, as well as sending data between the two. Language: Swift 3 Introduction You want to get up and running fast with building your first Apple Watch app and are probably frustrated beyond belief that there are very few resources that explain how the little lego piece actually come together. Well, look no further. This tutorial will explain everything to build a basic app in no time. After this, you should be able to venture off to build virtually any app you'd like, depending on your familiarity with iOS, WatchKit, and Object-Oriented Programming. What You Will Learn Overview of how WatchKit works with iOS How to CONNECT your Apple Watch app to your iPhone How to SEND data to your app from your iPhone How to SEND data to your phone from your Watch app. What You Will Not Learn How to build the interface layout for the WatchKit app How to build the storyboard layout for the iOS app I will give you some references at the end to point you in the right direction to figure that stuff out. Overview of WatchKit WatchKit is specifically designed to help you manage your UI in your Watch apps. Think of it like the Watch version of UIKit. Your app's logic lives in the WatchKit extension. Every interface element is a subclass of the WKInterfaceObject class. Your WatchKit UI is managed by an InterfaceController, a subclass of the WKInterfaceController class. When you add Interfaces (WatchKit's version of Views), you also need to add some logic to that interface using a subclass of the WKInterfaceController class. If you don't know how you would go about doing this, I would recommend learning the basics of iOS development by taking some courses on Lynda.com, TeamTreehouse.com, Udemy.com, or find an awesome technical book on iOS development from SafariBooksOnline.com. As of Swift 3, every Watch app is classified as a companion to an iOS app. That means, good luck selling your app in the App Store without an accompanying iOS application. Your watch app is nested inside of the iOS app in Xcode as a WatchKit extension. You will have three groups/folders/directories in which you will have to make some edits, either in program logic, or in design. Group 1: Your App Group 2: Your App WatchKit App Group 3: Your App WatchKit Extension Both the iOS and WatchKit applications will need to communicate via the WatchConnectivity framework using WCSession.default(). To respond to any messages being sent from either device, you will need to implement the WCSessionDelegate. You will pass messages back and forth using dictionaries [String:Any] (well, that's the preferred option) and will need to handle each case independently in the callback method, whereas the response will be handled in a closure from the method call where the request was made. In other words... iPhone App import WatchConnectivity and conform to WCSessionDelegate. use the static session delegate via WCSession.default(). Send data to Watch app using: WCSession.default().sendMessage(message, replyHandler:_ errorHandler:_) The message object should be a dictionary of type [String:Any] If you are looking for data to be returned from the Watch app, provide the logic in a closure defined in the replyHandler; otherwise, pass in nil. To respond to messages sent from the Watch app, you will use the WCSessionDelegate callback method func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void){...} WatchKit App import WatchConnectivity and conform to WCSessionDelegate. use the static session delegate via WCSession.default(). Send data to the iPhone app using: WCSession.default().sendMessage(message, replyHandler:_ errorHandler:_) The message object should be a dictionary of type [String:Any] If you are looking for data to be returned from the Watch app, provide the logic in a closure defined in the replyHandler; otherwise, pass in nil. To respond to messages sent from the iPhone app, you will use the WCSessionDelegate callback method func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void){...} These methods will not be required in your Watch app to properly conform to the WCSessionDelegate: func sessionDidBecomeInactive(_ session: WCSession) func sessionDidDeactivate(_ session: WCSession) func sessionWatchStateDidChange(_ session: WCSession) And finally, it is generally best practice to store any common images, the images and assets that will continually be used for the Watch app to be placed in the Watch's xcassets folder. Okay, now that you are confused, let's get to the details! To The Details Connecting the Apps Configuring the iOS App You need to import the WatchConnectivity framework into your view controller file in the iOS application. This gives you access to the class objects that are designed to communicate with the Watch companion application. You will need to import this on the Watch app side as well. The only real difference with the Watch app is that you will not have a view controller file, but an interface controller file. import WatchConnectivity Next, you will need to make sure that your application can support a session for WatchConnectivity. If it can, then you must set the view controller as its delegate and activate the default session. You will get an error here. You need to conform to WCSessionDelegate and implement a few methods before the IDE begins to calm down. // MARK: - View Life Cycle Callbacks override func viewDidLoad() { super.viewDidLoad() automaticallyAdjustsScrollViewInsets = false if WCSession.isSupported() { WCSession.default().delegate = self WCSession.default().activate() } else { print("\nViewController: connectionManager is nil\n") } } To conform to WCSessionDelegate, let's add an extension to the bottom of the view controller. Some people hate this approach. I have my way, but for tutorial purposes, I will follow the RayWenderlich approach. I am a huge fan of just getting code directly from COMMAND + CLICKING on the delegates and grabbing ALL OF THE METHODS out of the specification and begin to manipulate it and understand how things work. In this extension, I am providing you will all of the methods. They are already marked so that you will see when each of them fire in the console. If you feel frisky, delete some of the ones that are marked OPTIONAL to make your code file look spiffy. extension ViewController : WCSessionDelegate { func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { print("0. ViewController: ", "activationDidCompleteWith activationState") } /** ------------------------- iOS App State For Watch ------------------------ */ func sessionDidBecomeInactive(_ session: WCSession) { print("1. ViewController: ", "sessionDidBecomeInactive") } func sessionDidDeactivate(_ session: WCSession) { print("2. ViewController: ", "sessionDidDeactivate") } func sessionWatchStateDidChange(_ session: WCSession) { print("3. ViewController: ", "sessionDidDeactivate") } /** ------------------------- Interactive Messaging ------------------------- */ func sessionReachabilityDidChange(_ session: WCSession) { print("4. ViewController: ", "sessionReachabilityDidChange") } func session(_ session: WCSession, didReceiveMessage message: [String : Any]) { print("5. ViewController: ", "didReceiveMessage") } func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void) { print("6. ViewController: ", "didReceiveMessage") // This is where you handle any requests coming from your Watch App } func session(_ session: WCSession, didReceiveMessageData messageData: Data) { print("7. ViewController: ", "didReceiveMessageData") } func session(_ session: WCSession, didReceiveMessageData messageData: Data, replyHandler: @escaping (Data) -> Swift.Void) { print("8. ViewController: ", "didReceiveMessageData") } /** -------------------------- Background Transfers ------------------------- */ func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) { print("9. ViewController: ", "didReceiveApplicationContext") } func session(_ session: WCSession, didFinish userInfoTransfer: WCSessionUserInfoTransfer, error: Error?) { print("10. ViewController: ", "didFinish userInfoTransfer") } func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) { print("11. ViewController: ", "didReceiveUserInfo") } func session(_ session: WCSession, didFinish fileTransfer: WCSessionFileTransfer, error: Error?) { print("12. ViewController: ", "didFinish fileTransfer") } func session(_ session: WCSession, didReceive file: WCSessionFile) { print("13. ViewController: ", "didReceive file") } } To send data to your Watch App, once the Watch App has requested it, you will handle this in the method... func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void) { print("6. ViewController: ", "didReceiveMessage") // build out your response message using a Dictionary let returnMessage: [String : Any] = [ "key1" : value1, "key2" : value2, "key3" : value3 ] // return your data in this manner replyHandler(returnMessage) // WARNING // You must call the replyHandler before the method ends, otherwise, your app will crash. } This is only one half of the transaction! You must configure your Watch app to connect to the iPhone app and handle any returned messages! Configuring the Watch App It might be a surprise to you, but you need to import WatchConnectivity again. import WatchConnectivity Next, you need to verify that the session is even possible. // MARK: - View Life Cycle Callbacks override func awake(withContext context: Any?) { super.awake(withContext: context) // Configure interface objects here. if WCSession.isSupported() { WCSession.default().delegate = self WCSession.default().activate() print("InterfaceController: Session Activated") // Request Data from iPhone App let requestMessage = ["message":"get-data"] WCSession.default().sendMessage(requestMessage, replyHandler: { (replyMessage) in print("Got a reply from the phone: \(replyMessage)") // handle reply message here }, errorHandler: { (error) in print("Got an error sending to the phone: \(error)") }) } else { print("\nViewController: connectionManager is nil\n") } } But none of this will work, unless you implement methods required for the WCSessionDelegate. extension InterfaceController : WCSessionDelegate { func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { print("1. InterfaceController: ", "activationDidCompleteWith activationState") // first } /** ------------------------- Interactive Messaging ------------------------- */ func sessionReachabilityDidChange(_ session: WCSession) { print("2. InterfaceController: ", "sessionReachabilityDidChange") // second } func session(_ session: WCSession, didReceiveMessage message: [String : Any]) { print("3. InterfaceController: ", "didReceiveMessage") } func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void) { // third print("4. InterfaceController: ", "didReceiveMessage") //print("Message Contents: ", message["message"]!) } func session(_ session: WCSession, didReceiveMessageData messageData: Data) { print("5. InterfaceController: ", "didReceiveMessageData") } func session(_ session: WCSession, didReceiveMessageData messageData: Data, replyHandler: @escaping (Data) -> Swift.Void) { print("6. InterfaceController: ", "didReceiveMessageData") } /** -------------------------- Background Transfers ------------------------- */ func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) { print("7. InterfaceController: ", "didReceiveApplicationContext") } func session(_ session: WCSession, didFinish userInfoTransfer: WCSessionUserInfoTransfer, error: Error?) { print("8. InterfaceController: ", "didFinish userInfoTransfer") } func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) { print("9. InterfaceController: ", "didReceiveUserInfo") } func session(_ session: WCSession, didFinish fileTransfer: WCSessionFileTransfer, error: Error?) { print("10. InterfaceController: ", "didFinish fileTransfer") } func session(_ session: WCSession, didReceive file: WCSessionFile) { print("11. InterfaceController: ", "didReceive file") } } Sending Data Sending data to your Watch app from your iPhone or from your iPhone to your Watch App after triggering some event is very simple, though the code can look a little complex at first. let message = ["key":"value-to-send"] WCSession.default().sendMessage(message, replyHandler: { (replyMessage) in print("Got a reply from the phone: \(replyMessage)") if let returnedValues = replyMessage["returned-value"] as? NSArray { for val in returnedValues { // do something here with the data // Dispatch to Main Thread if affecting UI } } }, errorHandler: { (error) in print("Got an error sending to the phone: \(error)") }) Conclusion This has been a down and dirty on WatchConnectivity. There is a whole lot more to cover at another Bat Time and another Bat Channel, but this should get you started on the right foot. If you are bored with this tutorial, then continue in your development journey by tackling some of the more advanced topics such as: Working with Multiple Interface Controllers Creating Glances / Complications Notifications I truly hope this tutorial has helped you in your journey as an iOS developer who is gaining a specialty in Apple Watch app development. |
| json metadata | {"tags":["iwatch","swift3","ios","programming","tutorial"],"users":["escaping"],"app":"steemit/0.1","format":"markdown"} |
| parent author | |
| parent permlink | iwatch |
| permlink | ios-watchconnectivity-tutorial |
| title | iOS WatchConnectivity Tutorial |
| Transaction Info | Block #13683981/Trx 51f6780f0801261cdd8e7a20245e3f21ee5d64ae |
View Raw JSON Data
{
"block": 13683981,
"op": [
"comment",
{
"author": "abhijeetmalamkar",
"body": "This tutorial covers the basics of connecting an iOS and Watch app together, as well as sending data between the two. Language: Swift 3\n\nIntroduction\n\nYou want to get up and running fast with building your first Apple Watch app and are probably frustrated beyond belief that there are very few resources that explain how the little lego piece actually come together. Well, look no further. This tutorial will explain everything to build a basic app in no time. After this, you should be able to venture off to build virtually any app you'd like, depending on your familiarity with iOS, WatchKit, and Object-Oriented Programming.\n\nWhat You Will Learn\n\nOverview of how WatchKit works with iOS\nHow to CONNECT your Apple Watch app to your iPhone\nHow to SEND data to your app from your iPhone\nHow to SEND data to your phone from your Watch app.\nWhat You Will Not Learn\n\nHow to build the interface layout for the WatchKit app\nHow to build the storyboard layout for the iOS app\nI will give you some references at the end to point you in the right direction to figure that stuff out.\n\nOverview of WatchKit\n\nWatchKit is specifically designed to help you manage your UI in your Watch apps. Think of it like the Watch version of UIKit. Your app's logic lives in the WatchKit extension. Every interface element is a subclass of the WKInterfaceObject class. Your WatchKit UI is managed by an InterfaceController, a subclass of the WKInterfaceController class. When you add Interfaces (WatchKit's version of Views), you also need to add some logic to that interface using a subclass of the WKInterfaceController class. If you don't know how you would go about doing this, I would recommend learning the basics of iOS development by taking some courses on Lynda.com, TeamTreehouse.com, Udemy.com, or find an awesome technical book on iOS development from SafariBooksOnline.com.\n\nAs of Swift 3, every Watch app is classified as a companion to an iOS app. That means, good luck selling your app in the App Store without an accompanying iOS application. Your watch app is nested inside of the iOS app in Xcode as a WatchKit extension. You will have three groups/folders/directories in which you will have to make some edits, either in program logic, or in design.\n\nGroup 1: Your App\nGroup 2: Your App WatchKit App\nGroup 3: Your App WatchKit Extension\nBoth the iOS and WatchKit applications will need to communicate via the WatchConnectivity framework using WCSession.default(). To respond to any messages being sent from either device, you will need to implement the WCSessionDelegate. You will pass messages back and forth using dictionaries [String:Any] (well, that's the preferred option) and will need to handle each case independently in the callback method, whereas the response will be handled in a closure from the method call where the request was made. In other words...\n\niPhone App\n\nimport WatchConnectivity and conform to WCSessionDelegate.\nuse the static session delegate via WCSession.default().\nSend data to Watch app using:\n WCSession.default().sendMessage(message, replyHandler:_ errorHandler:_)\nThe message object should be a dictionary of type [String:Any]\nIf you are looking for data to be returned from the Watch app, provide the logic in a closure defined in the replyHandler; otherwise, pass in nil.\nTo respond to messages sent from the Watch app, you will use the WCSessionDelegate callback method\nfunc session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void){...}\nWatchKit App\n\nimport WatchConnectivity and conform to WCSessionDelegate.\nuse the static session delegate via WCSession.default().\nSend data to the iPhone app using:\n WCSession.default().sendMessage(message, replyHandler:_ errorHandler:_)\nThe message object should be a dictionary of type [String:Any]\nIf you are looking for data to be returned from the Watch app, provide the logic in a closure defined in the replyHandler; otherwise, pass in nil.\nTo respond to messages sent from the iPhone app, you will use the WCSessionDelegate callback method\nfunc session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void){...}\nThese methods will not be required in your Watch app to properly conform to the WCSessionDelegate:\n func sessionDidBecomeInactive(_ session: WCSession)\n func sessionDidDeactivate(_ session: WCSession)\n func sessionWatchStateDidChange(_ session: WCSession)\nAnd finally, it is generally best practice to store any common images, the images and assets that will continually be used for the Watch app to be placed in the Watch's xcassets folder. Okay, now that you are confused, let's get to the details!\n\nTo The Details\n\nConnecting the Apps\n\nConfiguring the iOS App\n\nYou need to import the WatchConnectivity framework into your view controller file in the iOS application. This gives you access to the class objects that are designed to communicate with the Watch companion application. You will need to import this on the Watch app side as well. The only real difference with the Watch app is that you will not have a view controller file, but an interface controller file.\n\nimport WatchConnectivity\nNext, you will need to make sure that your application can support a session for WatchConnectivity. If it can, then you must set the view controller as its delegate and activate the default session. You will get an error here. You need to conform to WCSessionDelegate and implement a few methods before the IDE begins to calm down.\n\n// MARK: - View Life Cycle Callbacks\noverride func viewDidLoad() {\n super.viewDidLoad()\n\n automaticallyAdjustsScrollViewInsets = false\n if WCSession.isSupported() {\n WCSession.default().delegate = self\n WCSession.default().activate()\n }\n else {\n print(\"\\nViewController: connectionManager is nil\\n\")\n }\n}\nTo conform to WCSessionDelegate, let's add an extension to the bottom of the view controller. Some people hate this approach. I have my way, but for tutorial purposes, I will follow the RayWenderlich approach. I am a huge fan of just getting code directly from COMMAND + CLICKING on the delegates and grabbing ALL OF THE METHODS out of the specification and begin to manipulate it and understand how things work. In this extension, I am providing you will all of the methods. They are already marked so that you will see when each of them fire in the console. If you feel frisky, delete some of the ones that are marked OPTIONAL to make your code file look spiffy.\n\nextension ViewController : WCSessionDelegate {\n\n func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {\n print(\"0. ViewController: \", \"activationDidCompleteWith activationState\")\n }\n\n\n /** ------------------------- iOS App State For Watch ------------------------ */\n\n func sessionDidBecomeInactive(_ session: WCSession) {\n print(\"1. ViewController: \", \"sessionDidBecomeInactive\")\n }\n\n\n func sessionDidDeactivate(_ session: WCSession) {\n print(\"2. ViewController: \", \"sessionDidDeactivate\")\n }\n\n\n func sessionWatchStateDidChange(_ session: WCSession) {\n print(\"3. ViewController: \", \"sessionDidDeactivate\")\n }\n\n\n /** ------------------------- Interactive Messaging ------------------------- */\n\n func sessionReachabilityDidChange(_ session: WCSession) {\n print(\"4. ViewController: \", \"sessionReachabilityDidChange\")\n }\n\n\n func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {\n print(\"5. ViewController: \", \"didReceiveMessage\")\n }\n\n\n\n func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void) {\n print(\"6. ViewController: \", \"didReceiveMessage\")\n // This is where you handle any requests coming from your Watch App\n }\n\n func session(_ session: WCSession, didReceiveMessageData messageData: Data) {\n print(\"7. ViewController: \", \"didReceiveMessageData\")\n }\n\n func session(_ session: WCSession, didReceiveMessageData messageData: Data, replyHandler: @escaping (Data) -> Swift.Void) {\n print(\"8. ViewController: \", \"didReceiveMessageData\")\n }\n\n /** -------------------------- Background Transfers ------------------------- */\n\n func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {\n print(\"9. ViewController: \", \"didReceiveApplicationContext\")\n }\n\n func session(_ session: WCSession, didFinish userInfoTransfer: WCSessionUserInfoTransfer, error: Error?) {\n print(\"10. ViewController: \", \"didFinish userInfoTransfer\")\n }\n\n func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {\n print(\"11. ViewController: \", \"didReceiveUserInfo\")\n }\n\n func session(_ session: WCSession, didFinish fileTransfer: WCSessionFileTransfer, error: Error?) {\n print(\"12. ViewController: \", \"didFinish fileTransfer\")\n }\n\n func session(_ session: WCSession, didReceive file: WCSessionFile) {\n print(\"13. ViewController: \", \"didReceive file\")\n }\n}\nTo send data to your Watch App, once the Watch App has requested it, you will handle this in the method...\n\nfunc session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void) {\n print(\"6. ViewController: \", \"didReceiveMessage\")\n // build out your response message using a Dictionary\n let returnMessage: [String : Any] = [\n \"key1\" : value1,\n \"key2\" : value2,\n \"key3\" : value3\n ]\n // return your data in this manner\n replyHandler(returnMessage)\n // WARNING\n // You must call the replyHandler before the method ends, otherwise, your app will crash.\n}\nThis is only one half of the transaction! You must configure your Watch app to connect to the iPhone app and handle any returned messages!\n\nConfiguring the Watch App\n\nIt might be a surprise to you, but you need to import WatchConnectivity again.\n\nimport WatchConnectivity\nNext, you need to verify that the session is even possible.\n\n// MARK: - View Life Cycle Callbacks\noverride func awake(withContext context: Any?) {\n super.awake(withContext: context)\n\n // Configure interface objects here.\n if WCSession.isSupported() {\n WCSession.default().delegate = self\n WCSession.default().activate()\n print(\"InterfaceController: Session Activated\")\n\n // Request Data from iPhone App\n let requestMessage = [\"message\":\"get-data\"]\n\n WCSession.default().sendMessage(requestMessage, replyHandler: { (replyMessage) in\n print(\"Got a reply from the phone: \\(replyMessage)\")\n\n // handle reply message here\n\n }, errorHandler: { (error) in\n print(\"Got an error sending to the phone: \\(error)\")\n })\n }\n else {\n print(\"\\nViewController: connectionManager is nil\\n\")\n }\n}\nBut none of this will work, unless you implement methods required for the WCSessionDelegate.\n\nextension InterfaceController : WCSessionDelegate {\n\n func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {\n print(\"1. InterfaceController: \", \"activationDidCompleteWith activationState\") // first\n }\n\n /** ------------------------- Interactive Messaging ------------------------- */\n\n func sessionReachabilityDidChange(_ session: WCSession) {\n print(\"2. InterfaceController: \", \"sessionReachabilityDidChange\") // second\n }\n\n func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {\n print(\"3. InterfaceController: \", \"didReceiveMessage\")\n }\n\n func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Swift.Void) { // third\n print(\"4. InterfaceController: \", \"didReceiveMessage\")\n //print(\"Message Contents: \", message[\"message\"]!)\n }\n\n func session(_ session: WCSession, didReceiveMessageData messageData: Data) {\n print(\"5. InterfaceController: \", \"didReceiveMessageData\")\n }\n\n func session(_ session: WCSession, didReceiveMessageData messageData: Data, replyHandler: @escaping (Data) -> Swift.Void) {\n print(\"6. InterfaceController: \", \"didReceiveMessageData\")\n }\n\n /** -------------------------- Background Transfers ------------------------- */\n\n func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {\n print(\"7. InterfaceController: \", \"didReceiveApplicationContext\")\n }\n\n func session(_ session: WCSession, didFinish userInfoTransfer: WCSessionUserInfoTransfer, error: Error?) {\n print(\"8. InterfaceController: \", \"didFinish userInfoTransfer\")\n }\n\n func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {\n print(\"9. InterfaceController: \", \"didReceiveUserInfo\")\n }\n\n func session(_ session: WCSession, didFinish fileTransfer: WCSessionFileTransfer, error: Error?) {\n print(\"10. InterfaceController: \", \"didFinish fileTransfer\")\n }\n\n func session(_ session: WCSession, didReceive file: WCSessionFile) {\n print(\"11. InterfaceController: \", \"didReceive file\")\n } \n}\nSending Data\n\nSending data to your Watch app from your iPhone or from your iPhone to your Watch App after triggering some event is very simple, though the code can look a little complex at first.\n\nlet message = [\"key\":\"value-to-send\"]\n\nWCSession.default().sendMessage(message, replyHandler: { (replyMessage) in\n print(\"Got a reply from the phone: \\(replyMessage)\")\n\n if let returnedValues = replyMessage[\"returned-value\"] as? NSArray {\n for val in returnedValues {\n // do something here with the data\n // Dispatch to Main Thread if affecting UI\n }\n }\n}, errorHandler: { (error) in\n print(\"Got an error sending to the phone: \\(error)\")\n})\nConclusion\n\nThis has been a down and dirty on WatchConnectivity. There is a whole lot more to cover at another Bat Time and another Bat Channel, but this should get you started on the right foot. If you are bored with this tutorial, then continue in your development journey by tackling some of the more advanced topics such as:\n\nWorking with Multiple Interface Controllers\nCreating Glances / Complications\nNotifications\nI truly hope this tutorial has helped you in your journey as an iOS developer who is gaining a specialty in Apple Watch app development.",
"json_metadata": "{\"tags\":[\"iwatch\",\"swift3\",\"ios\",\"programming\",\"tutorial\"],\"users\":[\"escaping\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
"parent_author": "",
"parent_permlink": "iwatch",
"permlink": "ios-watchconnectivity-tutorial",
"title": "iOS WatchConnectivity Tutorial"
}
],
"op_in_trx": 0,
"timestamp": "2017-07-14T19:23:33",
"trx_id": "51f6780f0801261cdd8e7a20245e3f21ee5d64ae",
"trx_in_block": 18,
"virtual_op": 0
}steemdelegated 17.828 SP to @abhijeetmalamkar2017/06/12 16:22:54
steemdelegated 17.828 SP to @abhijeetmalamkar
2017/06/12 16:22:54
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 28994.044039 VESTS |
| Transaction Info | Block #12760425/Trx b99669158fdec8649c96abd7afbcda2082492b89 |
View Raw JSON Data
{
"block": 12760425,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "28994.044039 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2017-06-12T16:22:54",
"trx_id": "b99669158fdec8649c96abd7afbcda2082492b89",
"trx_in_block": 13,
"virtual_op": 0
}steemdelegated 5.093 SP to @abhijeetmalamkar2017/06/08 22:16:51
steemdelegated 5.093 SP to @abhijeetmalamkar
2017/06/08 22:16:51
| delegatee | abhijeetmalamkar |
| delegator | steem |
| vesting shares | 8283.044039 VESTS |
| Transaction Info | Block #12652370/Trx 8321fcee3da5ffd34276ccb2e4125b33ac93d1fb |
View Raw JSON Data
{
"block": 12652370,
"op": [
"delegate_vesting_shares",
{
"delegatee": "abhijeetmalamkar",
"delegator": "steem",
"vesting_shares": "8283.044039 VESTS"
}
],
"op_in_trx": 0,
"timestamp": "2017-06-08T22:16:51",
"trx_id": "8321fcee3da5ffd34276ccb2e4125b33ac93d1fb",
"trx_in_block": 5,
"virtual_op": 0
}abhijeetmalamkarupdated their account properties2017/05/24 20:55:09
abhijeetmalamkarupdated their account properties
2017/05/24 20:55:09
| account | abhijeetmalamkar |
| active | {"account_auths":[],"key_auths":[["STM5iLiF7ei9wG4RMf1dD891Z1KWFXdcTA8XNvSnDzYwQ7vuiWBvt",1]],"weight_threshold":1} |
| json metadata | |
| memo key | STM7YV95LMWKMizH7EfkdyAzA2CA5dqYV1j9UqpZh3TccT9RhmscA |
| owner | {"account_auths":[],"key_auths":[["STM8U5aqk9UUcoUeL9Yc467A9TEtHP1DMdZKGGwM637BYyVapDAMQ",1]],"weight_threshold":1} |
| posting | {"account_auths":[],"key_auths":[["STM5JAUVjoVaxe48yefjvDbdqxiPA6ASSFtS4QsA6XnRbrbbs8qAW",1]],"weight_threshold":1} |
| Transaction Info | Block #12219139/Trx de4b19181753b4ade903268abbab7fcf4241ef94 |
View Raw JSON Data
{
"block": 12219139,
"op": [
"account_update",
{
"account": "abhijeetmalamkar",
"active": {
"account_auths": [],
"key_auths": [
[
"STM5iLiF7ei9wG4RMf1dD891Z1KWFXdcTA8XNvSnDzYwQ7vuiWBvt",
1
]
],
"weight_threshold": 1
},
"json_metadata": "",
"memo_key": "STM7YV95LMWKMizH7EfkdyAzA2CA5dqYV1j9UqpZh3TccT9RhmscA",
"owner": {
"account_auths": [],
"key_auths": [
[
"STM8U5aqk9UUcoUeL9Yc467A9TEtHP1DMdZKGGwM637BYyVapDAMQ",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [],
"key_auths": [
[
"STM5JAUVjoVaxe48yefjvDbdqxiPA6ASSFtS4QsA6XnRbrbbs8qAW",
1
]
],
"weight_threshold": 1
}
}
],
"op_in_trx": 0,
"timestamp": "2017-05-24T20:55:09",
"trx_id": "de4b19181753b4ade903268abbab7fcf4241ef94",
"trx_in_block": 3,
"virtual_op": 0
}steemcreated a new account: @abhijeetmalamkar2017/05/24 20:54:24
steemcreated a new account: @abhijeetmalamkar
2017/05/24 20:54:24
| active | {"account_auths":[],"key_auths":[["STM58gPbe55iuapcAHZAotVNeJJKgoGHvVpfxGiDbXBgqxxobmqC9",1]],"weight_threshold":1} |
| creator | steem |
| delegation | 301000.000000 VESTS |
| extensions | [] |
| fee | 1.000 STEEM |
| json metadata | |
| memo key | STM6n6uDmBacbpEeE2752ooGdFnyU6c6L7d79EZYDF1ZpBnHmqLHK |
| new account name | abhijeetmalamkar |
| owner | {"account_auths":[],"key_auths":[["STM7SwGgt1PBDdphLmSdS1gUTH9tJrtPf3hsn1Tt649nPJzcwHNZi",1]],"weight_threshold":1} |
| posting | {"account_auths":[],"key_auths":[["STM7cNREeas1xwu73EybLAkBJ49ETvFrj1CYbFVZjVhvu12T5Nn7P",1]],"weight_threshold":1} |
| Transaction Info | Block #12219124/Trx 67af9b40932ab14ba219fc83484a82aa35b7bbd4 |
View Raw JSON Data
{
"block": 12219124,
"op": [
"account_create_with_delegation",
{
"active": {
"account_auths": [],
"key_auths": [
[
"STM58gPbe55iuapcAHZAotVNeJJKgoGHvVpfxGiDbXBgqxxobmqC9",
1
]
],
"weight_threshold": 1
},
"creator": "steem",
"delegation": "301000.000000 VESTS",
"extensions": [],
"fee": "1.000 STEEM",
"json_metadata": "",
"memo_key": "STM6n6uDmBacbpEeE2752ooGdFnyU6c6L7d79EZYDF1ZpBnHmqLHK",
"new_account_name": "abhijeetmalamkar",
"owner": {
"account_auths": [],
"key_auths": [
[
"STM7SwGgt1PBDdphLmSdS1gUTH9tJrtPf3hsn1Tt649nPJzcwHNZi",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [],
"key_auths": [
[
"STM7cNREeas1xwu73EybLAkBJ49ETvFrj1CYbFVZjVhvu12T5Nn7P",
1
]
],
"weight_threshold": 1
}
}
],
"op_in_trx": 0,
"timestamp": "2017-05-24T20:54:24",
"trx_id": "67af9b40932ab14ba219fc83484a82aa35b7bbd4",
"trx_in_block": 7,
"virtual_op": 0
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress0.00%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779050949
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779050949
},
"rc_account": {
"account": "abhijeetmalamkar",
"max_rc": "10164408779",
"max_rc_creation_adjustment": {
"amount": "2020748973",
"nai": "@@000000037",
"precision": 6
},
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779050949
}
}
}Account Metadata
| POSTING JSON METADATA | |
| None | |
| JSON METADATA | |
| None |
{
"posting_json_metadata": {},
"json_metadata": {}
}Auth Keys
Owner
Single Signature
Public Keys
STM8U5aqk9UUcoUeL9Yc467A9TEtHP1DMdZKGGwM637BYyVapDAMQ1/1
Active
Single Signature
Public Keys
STM5iLiF7ei9wG4RMf1dD891Z1KWFXdcTA8XNvSnDzYwQ7vuiWBvt1/1
Posting
Single Signature
Public Keys
STM5JAUVjoVaxe48yefjvDbdqxiPA6ASSFtS4QsA6XnRbrbbs8qAW1/1
Memo
STM7YV95LMWKMizH7EfkdyAzA2CA5dqYV1j9UqpZh3TccT9RhmscA
{
"owner": {
"account_auths": [],
"key_auths": [
[
"STM8U5aqk9UUcoUeL9Yc467A9TEtHP1DMdZKGGwM637BYyVapDAMQ",
1
]
],
"weight_threshold": 1
},
"active": {
"account_auths": [],
"key_auths": [
[
"STM5iLiF7ei9wG4RMf1dD891Z1KWFXdcTA8XNvSnDzYwQ7vuiWBvt",
1
]
],
"weight_threshold": 1
},
"posting": {
"account_auths": [],
"key_auths": [
[
"STM5JAUVjoVaxe48yefjvDbdqxiPA6ASSFtS4QsA6XnRbrbbs8qAW",
1
]
],
"weight_threshold": 1
},
"memo": "STM7YV95LMWKMizH7EfkdyAzA2CA5dqYV1j9UqpZh3TccT9RhmscA"
}Witness Votes
0 / 30
No active witness votes.
[]